请问如何检测有新窗口弹出,并获得句柄关掉?(200分)

  • 主题发起人 主题发起人 Walone
  • 开始时间 开始时间
W

Walone

Unregistered / Unconfirmed
GUEST, unregistred user!
用IE5流览,经常有小窗口弹出,烦死人<br>请问如何在后台将其截获,关之?<br>如果弹出的不是WEB页面,而是对话框之类<br>怎么样才能模拟双击"确定"之类的动作?
 
http://www.gislab.ecnu.edu.cn/delphibbs/dispq.asp?LID=192608
 
那个链接好象没什么用处啊
 
看函数名还有用 GetLastActivePopup(IE_hwnd); 不过我没试过! &nbsp;<br>
 
这些都是窗口谈出后的方法<br>要后台截获关键是怎样判断他是自动谈出的而不是你手工点出的。<br>好想有可以过滤的说。<br>麻烦,麻烦。可能要对打开的html文件进行分析?
 
用 javascript 弹出窗口 window。open(‘’);要知道内容还必须的下载完毕<br>窗口也就显示出来了
 
咦? 居然会有这么麻烦??<br>如果不是HTML产生的效果能对付吗?<br>比如,一个应用程序弹出了一个对话框,让我手动点击"确定"关闭<br>我能不能在程序中截获,并用程序完成手动关闭的效果?<br>我想,大概也就是<br>1,截获弹出框的句柄 (只知窗口标题字符串中的一部分)<br>2,找到"确定"按钮的位置<br>3,移动鼠标,模拟双击<br>其中3我知如何做,1,2却不得其法,请各位大侠多多指点
 
关闭窗口并不难,难的是什么时候这个窗口被弹出来?怎样知道?
 
如果用findwindow必须知道标题所以你可以用Enumwindow先列出符合条件的窗口列<br>表:<br><br>function EnumWindowsProc(AHWnd: HWnd;<br>&nbsp; LPARAM: lParam): boolean; stdcall;<br>var<br>&nbsp; WndCaption: array[0..254] of char;<br>&nbsp; WndClassName: array[0..254] of char;<br>begin<br>&nbsp; GetWindowText(AHWnd, @WndCaption, 254);<br>&nbsp; GetClassName(AHWnd, @WndClassName, 254);<br>&nbsp; if (pos('Microsoft',wndcaption)&lt;&gt;0) then //用你已知的窗口标题替换这里<br>&nbsp; begin<br>&nbsp; &nbsp; with Form1.Memo1.Lines do<br>&nbsp; &nbsp; begin<br>&nbsp; &nbsp; &nbsp; Add(StrPas(WndCaption));<br>&nbsp; &nbsp; &nbsp; Add(StrPas(WndClassName));<br>&nbsp; &nbsp; &nbsp; add('HWND:'+inttostr(ahwnd)); //获得句柄<br>&nbsp; &nbsp; &nbsp; Add('-------');<br>&nbsp; &nbsp; end;<br>&nbsp; end;<br><br>&nbsp; Result := True;<br>end;<br><br>procedure TForm1.Button1Click(Sender: TObject);<br>begin<br>&nbsp; Memo1.Lines.Clear;<br>&nbsp; EnumWindows(@EnumWindowsProc, 0); &nbsp;//call back function 调用<br>end;<br><br>另外:<br>ahwnd:=findwindowEX(ahwnd,0,pchar('TButton'),pchar(buttoncaption));<br>找到button句柄,再sendmessage<br><br>
 
你可以用一个timer隔一段时间看看有没有符合条件的窗口handle
 
&gt;&gt;你可以用一个timer隔一段时间看看有没有符合条件的窗口handle<br>如果timer太慢(比如5秒),难道为了关闭窗口,我要等5秒钟?<br>如果timer太快,是不是太占用系统?<br><br>
 
<br>在编译 &nbsp; EnumWindows(@EnumWindowsProc, 0); &nbsp;时<br>怎么出现 variable required 错误提示?<br>然后,光标停在0前面 &nbsp; &nbsp; &nbsp; &nbsp;<br>
 
要不要我给mail你一个例子? :-)
 
EnumWindows(EnumWindowsProc, 0); &nbsp;不要@
 
???pipi.<br>应该传一个pointer吧?
 
先定义了EnumWindowsProc没有<br>function EnumWindowsProc(hwnd_:HWND;lParam:Pointer ):boolean;stdcall;<br>&nbsp;begin<br>//.....<br>&nbsp;end;<br><br><br>EnumWindows(@EnumWindowsProc, 0); //要@
 
pipi:<br>&nbsp; &nbsp;function EnumWindowsProc(AHWnd: HWnd;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;LPARAM: lParam): boolean; stdcall;<br>&nbsp; &nbsp;function EnumWindowsProc hwnd_:HWND;<br>&nbsp; &nbsp; &nbsp; &nbsp; lParam:Pointer ): &nbsp; &nbsp; &nbsp; boolean;stdcall;<br>&nbsp; &nbsp;lparam与Pointer有什么不同之处?<br><br>yifeng:<br>&nbsp; &nbsp;我可是按你上面给的,原封不动粘上去的呀,怎么回事?<br>&nbsp; &nbsp;总出现 variable required 错误提示?然后,光标停在0前面 <br>&nbsp; &nbsp;再给我发个例子也好,但如果和上面所贴一样的话,不知会不会管用。<br>&nbsp; &nbsp;mailbox: walonelee@263.net &nbsp;多谢<br>
 
lParam:Pointer 是 LParam 只误,上午头晕眼花,看到 LP 就以为是 pointer<br><br>不过你写pointer也不会有什么,都是32bit整数<br><br><br>我知道了,你把 &nbsp;EnumWindowsProc 放类里面去了,<br>不要放在类里面,放出来作独立的函数,不要作为类方法(method)<br><br>为了EnumWindowsProc能访问本身(self)<br>用 EnumWindows(@EnumWindowsProc, integer(self)); &nbsp;调用<br><br>在EnumWindowsProc里面,假如你要的self是类 TForm1 的话<br>TForm1(lParam)就是以前的self
 
?<br>要用findwindow那不是这个窗口已经打开了吗?<br>用个全局hook截获WM_CREATE消息不就知道新建立窗口的Handle了吗?<br>而且此时窗口并未显示. 然后可以调用DestroyWindow嘛.
 
yifeng:<br>&nbsp; &nbsp; 给的程序没问题。<br>Pipi:<br>&nbsp; &nbsp; 说得不错,我是放在类里定义了,改过来就好了。<br>Another_eYes:<br>&nbsp; &nbsp; &nbsp;hook 我还不太会用,现在用了个timer,每分钟一判断,土是土了点,不过勉<br>强能完成功能。因为我不太清楚,弹出的窗口若不是经过点击它上面的确定键,直接<br>把它杀掉的话,会有什么后果。回头我再试一试。<br>&nbsp; &nbsp; 以上的分先记着,等这个问题完了以后一并给。<br>&nbsp; &nbsp; 我倒是想把hook用在IE的弹出窗口上,各位大侠有何高见?<br>&nbsp; &nbsp; 不用hook也行,只要是能把那些东西迅速关掉即可。<br>
 
后退
顶部