怎样用findwindow找到application.message弹出的对话框的句柄?(50分)

  • 主题发起人 一个过客
  • 开始时间

一个过客

Unregistered / Unconfirmed
GUEST, unregistred user!
如题。都在同一个程序中。<br>我怎么也找不到。
 
找什么找,就是application.handle了
 
楼上搞错了吧?<br>用appliaction.messagebox弹出的dialog的句柄,就是application.handle?<br>你试过吗?
 
FindWindow('TMessageForm', nil);
 
楼上试过了吗?不行。 不要想当然
 
appliaction.messagebox是独占窗口<br>如何用FindWindow查找?
 
楼上没听说过多线程吗? 况且,用timer也可以
 
'TMessageForm'是windows MessageBox的窗口类名,<br>FindWindow('TMessageForm', nil); <br>可以得到这个MessageBox的窗口句柄,当然前题是这个MessageBox窗口已经运行.
 
看过Application.MessageBox的代码吗?它还是用Windows.MessageBox
 
//先弹出这个<br>procedure TForm2.Button5Click(Sender: TObject);<br>begin<br> &nbsp;application.MessageBox('对话框', '对话框', 0);<br>end;<br>//用下面的测试<br>procedure TForm2.Timer1Timer(Sender: TObject);<br>var<br> &nbsp;p: TPoint;<br> &nbsp;hwnd: THandle;<br> &nbsp;ClassName: array[0..255] of Char;<br>begin<br> &nbsp;GetCursorPos(p);<br> &nbsp;hwnd := WindowFromPoint(p);<br> &nbsp;if hwnd &lt;&gt; 0 then<br> &nbsp;begin<br> &nbsp; &nbsp;GetClassName(hwnd, classname, 256);<br> &nbsp; &nbsp;Edit1.text := className;//我这返回#32770<br> &nbsp;end;<br>end;
 
如果是下面语句,就返回Tmessagebox;<br>//先弹出这个<br>procedure TForm2.Button5Click(Sender: TObject);<br>begin<br> &nbsp;//application.MessageBox('对话框', '对话框', 0);<br> &nbsp;Showmessage('对话框');<br>end;
 
luzhouman同学,希望你试验一下再回答问题。windows的messagenox窗口类名会是TMessageForm吗? 你说的是showmessage(),我就直接指出来了,不等你自己找到自己的错误了。<br><br>babibean同学,你得到的#32770类名是正确的,但是反过来用#32770无法findwindow找到application.messagebox的dialog
 
再次重申一下我的要求,是[red]application.messagebox[/red]弹出的对话框。
 
没人会? 我现在手边正有别的活忙着,没时间搞这个。<br><br>我想这个不难吧?如果用这个题来面试新人的话,被刷下来也就再没什么好说的了吧?
 
Delphi技术联盟群:23889386
 
application.messagebox弹出的对话框和ShowModal,是处在屏幕最上面,可以取巧一下直接用GetActiveWindow来找窗口的句柄。下面是写在timer控件里的代码,测试通过!(注意timer1.enabled:=false &nbsp;只有点击按键弹出messagebox后才true)<br>var<br> &nbsp;ActiveWindow: THandle;<br>begin<br> &nbsp; &nbsp;ActiveWindow := GetActiveWindow;<br> &nbsp; &nbsp;PostMessage(ActiveWindow,WM_CLOSE,0,0);
 
不一定。工作窗口不一定是用户正在操作的窗口。<br>举个例子,用户开启了我的软件,然后又开启了word来做文字处理,这样dialog就不一定是activewindow了。
 
我说测试过了啊。<br>包括被遮挡的情况,但不包括后台运行,如果是后台运行的话,我想你的messagebox也就没意义了吧!!<br>假设TfrmMainWindow:THandle是触发messagebox被弹出的窗体(form1)句柄!<br>让timer.enabled:=true;<br>procedure TForm1.Timer1Timer(Sender: TObject);<br>var<br> &nbsp;ActiveWindow: THandle;<br>begin<br> &nbsp; &nbsp;ActiveWindow := GetActiveWindow;<br> &nbsp; &nbsp;if ActiveWindow &lt;&gt; TfrmMainWindow then<br> &nbsp; &nbsp;PostMessage(ActiveWindow,WM_CLOSE,0,0); &nbsp;<br>end;
 
后台运行为什么就没意义呢? 实际上,我这个问题的目的就是让程序自动应答,自动运行,不需要人工干涉。因此,他几乎可以肯定是要后台运行的
 
开发的病毒软件吧,用一个没意义的东西来测试是否合格,本身就够无趣了,还自我感觉不错,这种人心态可见一斑
 
顶部