关于 FindWindow 的问题,帮个忙。 ( 积分: 150 )

  • 主题发起人 主题发起人 vvyang
  • 开始时间 开始时间
V

vvyang

Unregistered / Unconfirmed
GUEST, unregistred user!
1、我用 CreateProcess 启动了一个外部程序,紧接着用 FindWindow 来取得该程序主窗口的句柄,但是发现只要外部程序启动得稍微慢一些便无法找到主窗口。程序片段如下:<br>function EmbedWindow(lpApplicationName, lpClassName, lpWindowName: PChar;<br> &nbsp;hWndParent: HWND): THandle;<br>var<br> &nbsp;lpStartupInfo: _STARTUPINFOA;<br> &nbsp;lpProcessInfo: _PROCESS_INFORMATION;<br> &nbsp;hWndChild: HWND;<br>begin<br> &nbsp;FillChar(lpStartupInfo, SizeOf(lpStartupInfo), 0);<br> &nbsp;lpStartupInfo.cb := SizeOf(StartupInfo);<br> &nbsp;CreateProcess(lpApplicationName, nil, nil, nil, False, DETACHED_PROCESS,<br> &nbsp; &nbsp;nil, nil, lpStartupInfo, lpProcessInfo);<br> &nbsp;Result := lpProcessInfo.hProcess;<br> &nbsp;WaitForInputIdle(Result, INFINITE);<br><br> &nbsp;//这里怎样判断主窗口已经初始化完毕<br> &nbsp;hWndChild := FindWindow(lpClassName, lpWindowName);<br><br>{ 这是无奈写的低效代码,倒也能解决问题<br> &nbsp;hWndChild := 0;<br> &nbsp;while hWndChild = 0 do<br> &nbsp;begin<br> &nbsp; &nbsp;hWndChild := FindWindow(lpClassName, lpWindowName);<br> &nbsp; &nbsp;Application.ProcessMessages;<br> &nbsp;end;<br>}<br> &nbsp;......<br>end;<br>2、各位给点意见,帮个忙。
 
1、我用 CreateProcess 启动了一个外部程序,紧接着用 FindWindow 来取得该程序主窗口的句柄,但是发现只要外部程序启动得稍微慢一些便无法找到主窗口。程序片段如下:<br>function EmbedWindow(lpApplicationName, lpClassName, lpWindowName: PChar;<br> &nbsp;hWndParent: HWND): THandle;<br>var<br> &nbsp;lpStartupInfo: _STARTUPINFOA;<br> &nbsp;lpProcessInfo: _PROCESS_INFORMATION;<br> &nbsp;hWndChild: HWND;<br>begin<br> &nbsp;FillChar(lpStartupInfo, SizeOf(lpStartupInfo), 0);<br> &nbsp;lpStartupInfo.cb := SizeOf(StartupInfo);<br> &nbsp;CreateProcess(lpApplicationName, nil, nil, nil, False, DETACHED_PROCESS,<br> &nbsp; &nbsp;nil, nil, lpStartupInfo, lpProcessInfo);<br> &nbsp;Result := lpProcessInfo.hProcess;<br> &nbsp;WaitForInputIdle(Result, INFINITE);<br><br> &nbsp;//这里怎样判断主窗口已经初始化完毕<br> &nbsp;hWndChild := FindWindow(lpClassName, lpWindowName);<br><br>{ 这是无奈写的低效代码,倒也能解决问题<br> &nbsp;hWndChild := 0;<br> &nbsp;while hWndChild = 0 do<br> &nbsp;begin<br> &nbsp; &nbsp;hWndChild := FindWindow(lpClassName, lpWindowName);<br> &nbsp; &nbsp;Application.ProcessMessages;<br> &nbsp;end;<br>}<br> &nbsp;......<br>end;<br>2、各位给点意见,帮个忙。
 
我也遇到过这个问题,不知道如何解决,最后用sleep凑合一下。你的代码可以优化一下,CreateProcess成功后返回True的(好像是)。
 
尝试一下WaitForInputIdle
 
是个问题,我也和楼主一样用循环来取,可以通过窗口句柄得到进程ID,反过来好象没好办法
 
To zjan521:<br> &nbsp; &nbsp;我的程序中已经用到 WaitForInputIdle 了,不管用。进程的创建好了并不等于窗口已经显示出来了。
 
不知可否CreateProcess后Hook该Process然后截获WM_SHOWWINDOW。然后根据这个消息发送的句柄,GetWindowText。如果符合你要找到的再用消息通知你的程序。是否可以不用死等了呢?
 
不好意思,绕了哥圈圈。你直接另开一个线程。把<br> &nbsp;hWndChild := 0;<br> &nbsp;while hWndChild = 0 do<br> &nbsp;begin<br> &nbsp; &nbsp;hWndChild := FindWindow(lpClassName, lpWindowName);<br> &nbsp; &nbsp;Application.ProcessMessages;<br> &nbsp;end;<br>放到你另开的那个线程不可以吗?
 
呵呵,确实没注意,检讨ing...
 
如果要求创建进程之后立即找主窗口的话,而WaitForInputIdle也不行的话,那看来只能用点低效的代码啦。如果不是要求立即找主窗口的话,那么可以针对新创建的进程的主线程安装消息钩子,截获窗口消息,有消息发送的话,主窗口肯定已经创建啦
 
To delphibbs_Lee:<br> &nbsp; &nbsp;因为用到了 Application.ProcessMessages 所以没有必要再创建一个线程了,况且这个程序在找到主窗口之前什么都干不了。<br>To lichengbin、zjan521:<br> &nbsp; &nbsp;能帮忙想想另外的办法么?<br><br>这段代码是将一个已经编译好的程序整合到我的程序中。这个项目很混乱,开始是界面分离,现在又要整合到一起,编程序的哥们已乘风飞去,我重写来不及了,没办法出此下策。
 
由于Windows是多进程、多线程的,那么如果顺着现在这个思路走的话,好像没别的好办法。<br>如果换别的思路的话,好像效率还不如这个好呢。<br>(个人看法,仅供参考)
 
To 陷队之士:<br> &nbsp;谢谢你的回答。将窗口嵌入程序之前它都要闪一下,能不能在 CreateProcess 的时候将窗口隐藏,等嵌入后再显示出来啊?
 
既然是你公司的项目,那么你只需要保证可以编译通过,然后在他的代码中加上一两句话,什么都解决了.<br>完美本身就是困难的
 
多人接受答案了。
 
后退
顶部