如何获得多个标题相同的程序窗口的HWND? ( 积分: 100 )

  • 主题发起人 主题发起人 ax518598
  • 开始时间 开始时间
A

ax518598

Unregistered / Unconfirmed
GUEST, unregistred user!
在Delphi用FindWindow等函数可以找到程序窗口的HWND,是通过窗口标题(即caption)。<br><br>但现在遇到这样的情况:多个程序窗口的标题都相同,如何再获得程序窗口的HWND?<br>例如打开记事本时每个程序窗口的标题都是“无标题 - 记事本”,是否这些“无标题 - 记事本”的HWND都一样?如果不一样则如何获得不同的“无标题 - 记事本”程序HWND,如果是一样,那么如何区别它们?
 
在Delphi用FindWindow等函数可以找到程序窗口的HWND,是通过窗口标题(即caption)。<br><br>但现在遇到这样的情况:多个程序窗口的标题都相同,如何再获得程序窗口的HWND?<br>例如打开记事本时每个程序窗口的标题都是“无标题 - 记事本”,是否这些“无标题 - 记事本”的HWND都一样?如果不一样则如何获得不同的“无标题 - 记事本”程序HWND,如果是一样,那么如何区别它们?
 
对于多个同名的窗体的枚举,你可以使用EnumWindows API,在其中的EnumWindowsProc回<br>调函数中编写代码,获得所枚举的窗体的Caption,逐一判断并加入你的WindowList。<br><br> &nbsp;参考一下这篇文章吧:<br> &nbsp; &nbsp;http://www.mildragon.com/bbs/DispBbs.aspx?litterno=28&amp;id=33
 
我试验:打开了两个记事本,标题都是 无标题 - 记事本<br> 试验结果:handle不一样,但是窗口 依次显示,比如这次显示这个记事本窗口(你把它最小化后),下次显示另一个<br>三个也一样<br><br><br>procedure TForm1.BitBtn1Click(Sender: TObject);<br>var<br> &nbsp;h:Thandle;<br>begin<br> &nbsp;h := FindWindow('Notepad',nil);<br> &nbsp;showmessage(inttostr(h));<br> &nbsp;ShowWindow(h,SW_RESTORE)<br>end;
 
用回调函数:<br>var<br> &nbsp;HandleList: array of Longint; //存储窗口句柄的数组<br> &nbsp;WndClass, WndTitle: string; &nbsp; //窗口类名、窗口标题<br><br>procedure FindWindowEx;<br> &nbsp;function EnumFunc(const hWnd: Longword; lParam: Longint): BOOL; stdcall;<br> &nbsp;var<br> &nbsp; &nbsp;lpWndClass, lpWndTitle: array[0..255] of Char;<br> &nbsp; &nbsp;len: Integer;<br> &nbsp;begin<br> &nbsp; &nbsp;GetClassName(hWnd, lpWndClass, 255);<br> &nbsp; &nbsp;GetWindowText(hWnd, lpWndTitle, 255);<br> &nbsp; &nbsp;if (lpWndClass = WndClass) and (lpWndTitle = WndTitle) then<br> &nbsp; &nbsp;begin<br> &nbsp; &nbsp; &nbsp;len := Length(HandleList);<br> &nbsp; &nbsp; &nbsp;SetLength(HandleList, len + 1);<br> &nbsp; &nbsp; &nbsp;HandleList[len] := hWnd;<br> &nbsp; &nbsp;end;<br> &nbsp; &nbsp;Result := True;<br> &nbsp;end;<br>begin<br> &nbsp;EnumWindows(@EnumFunc, 0);<br>end;<br><br>procedure TForm1.Button1Click(Sender: TObject);<br>begin<br> &nbsp;WndClass := 'TForm1';<br> &nbsp;WndTitle := 'Form1';<br> &nbsp;FindWindowEx;<br> &nbsp;ShowMessage(IntToStr(Length(HandleList)));<br>end;
 
感觉creation-zy讲的方法能找出来一个,但无法控制,如想控制三个中的第二个?<br>yf168讲的只能针对已静态打开了这些拷贝时才能实用,如果这些程序拷贝是动态打开的,就不能区分出哪个HWND对应的是哪个具体的副本。<br>vvyang的代码前几天也看过,但一直没搞懂。<br><br>我再将问题限制得更严格一些:在三个记事本程序中动态地运行“文件--&gt;打开”命令,会弹出窗口,标题都是“打开”,而我要做一个后台监控程序,让指定的(不同时间指定不同的)某个记事本的“打开”窗口自动关闭掉,如何实现?
 
答案都给你了,你自己都能解决:<br>procedure TForm1.Button1Click(Sender: TObject);<br>begin<br> &nbsp;WndClass := 'Notepad';<br> &nbsp;WndTitle := '打开';<br> &nbsp;FindWindowEx;<br> &nbsp;//关闭第 2 个窗口<br> &nbsp;if Length(HandeList) &gt; 1 then<br> &nbsp; &nbsp;PostMessage(HandleList[1], WM_CLOSE, 0, 0);<br>end;
 
vvyang,你的答案应该差不多了,但是结果是将第2个记事本程序都关掉了,我只想将“打开”这个对话框关掉,并且怎么能判断出第二个记事本程序是否已弹出“打开”这个对话框?因为如果没有弹出我就没必要关掉,只有在弹出了这个对话框我才需要将它关掉。<br>谢谢你前面的指点,麻烦再指点一下,好吗?谢谢
 
接受答案了.
 
后退
顶部