请问怎样用EnumWindows得到所有顶层窗口的ClassName?可以给我个简单的例子吗?(100分)

  • 主题发起人 主题发起人 Iveny
  • 开始时间 开始时间
I

Iveny

Unregistered / Unconfirmed
GUEST, unregistred user!
请问怎样用EnumWindows得到所有顶层窗口的ClassName?然后使用FindWindow获得所有顶<br>层窗口的句柄,请问怎样实现,可以给我个简单的例子吗?最好说明一下EnumWindows各参<br>数的含义和应该怎样填写?!<br>谢谢~<br>
 
unit EnumWindows;<br><br>interface<br><br>uses<br>&nbsp; Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,<br>&nbsp; StdCtrls;<br><br>type<br>&nbsp; TForm1 = class(TForm)<br>&nbsp; &nbsp; ListBox1: TListBox;<br>&nbsp; &nbsp; Button1: TButton;<br>&nbsp; &nbsp; procedure EnumWindowProc(AWnd:HWND;AlParam:LPARAM);<br>&nbsp; &nbsp; procedure Button1Click(Sender: TObject);<br>&nbsp; private<br>&nbsp; &nbsp; { Private declarations }<br>&nbsp; public<br>&nbsp; &nbsp; { Public declarations }<br>&nbsp; end;<br><br>var<br>&nbsp; Form1: TForm1;<br><br>implementation<br><br>{$R *.DFM}<br><br>procedure TForm1.EnumWindowProc(AWnd: HWND; AlParam: LPARAM);<br>var<br>&nbsp; sStr:String;<br>begin<br>&nbsp; SetLength(sStr,255);<br>&nbsp; GetWindowText(AWnd,@sStr[1],255);<br>&nbsp; ListBox1.Items.Add(Format('%d %s',[AWnd,sStr]));<br>end;<br><br>procedure TForm1.Button1Click(Sender: TObject);<br>begin<br>&nbsp; EnumWindows(EnumWindowProc,0);<br>end;<br><br>end.<br>
 
给分吧.肯定对的.呵呵
 
先谢谢你,但编译你的例子连编译出错,请问应该怎样改?
 
procedure TForm1.Button1Click(Sender: TObject);<br>begin<br>&nbsp; EnumWindows(&lt;font color = #ff0000&gt;&lt;strong&gt;@&lt;/font&gt;&lt;/strong&gt;EnumWindowProc,0);<br>end;<br>
 
unit EnumWND;<br><br>interface<br><br>uses<br>&nbsp; Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,<br>&nbsp; StdCtrls;<br><br>type<br>&nbsp; TForm1 = class(TForm)<br>&nbsp; &nbsp; ListBox1: TListBox;<br>&nbsp; &nbsp; Button1: TButton;<br>&nbsp; &nbsp; procedure Button1Click(Sender: TObject);<br>&nbsp; private<br>&nbsp; &nbsp; { Private declarations }<br>&nbsp; public<br>&nbsp; &nbsp; { Public declarations }<br>&nbsp; end;<br><br>&nbsp; function EnumWndProc(AWnd:HWND;AlParam:LPARAM):Boolean;stdcall;<br>var<br>&nbsp; Form1: TForm1;<br><br>implementation<br><br>{$R *.DFM}<br><br>function EnumWndProc(AWnd: HWND; AlParam: LPARAM):Boolean;stdcall;<br>var<br>&nbsp; WndCaption: array[0..254] of Char;<br>begin<br>&nbsp; GetWindowText(AWnd, @WndCaption, 254);<br>&nbsp; if WndCaption[0]&lt;&gt;chr(0) then<br>&nbsp; &nbsp; Form1.ListBox1.Items.Add(Format('%d &nbsp;= &nbsp;%s',[AWnd,StrPas(WndCaption)]));<br>&nbsp; Result := True;<br>end;<br><br>procedure TForm1.Button1Click(Sender: TObject);<br>begin<br>&nbsp; EnumWindows(@EnumWndProc,0);<br>end;<br><br>end.<br>
 
谢谢~,例子我不太明白,运行时什么也没显示哦!<br>例子里,存放ClassName的函数是那个啊?怎样使用例子里得到的顶层窗口的ClassName,<br>获得所有顶层窗口的句柄?<br>如果用FindWindow,怎样代入?<br>我比较笨,还请指教!
 
自己要建个工程。把我给你地代码copy进去的。看里面的组件。在窗体上添加相应的组件。<br><br>不行的话告诉我你的信箱<br><br>我发各完整地例子给你
 
谢谢xwings,我之前已经这样做了,也顺利运行程序,只是ListBox里什么也没显示,<br>这也不重要,重要的是:<br>(真正的问题:)<br>怎样用EnumWindows得到所有顶层窗口的ClassName?然后使用FindWindow获得所有顶<br>层窗口的句柄,好让PostMessage调用?!<br><br>谢谢~我会另外再多给你100分的!这个问题比较急,期待你的确实回复!<br>谢谢!
 
首先调用 EnumWindows(@EnumWndProc,0); 枚举所有的窗口。<br>其中 EnuwndProc 是自己定义的回调函数,0 是自己自定义的一个值,<br>用来传递给EnuwndProc。 &nbsp;如果调用EnumWindows出错,返回 值为0<br><br>当EnumWindows每找到一个窗体就会调用EnuwndProc ,格式是EnuwndProc(aWnd,LPARAM )<br>其中 LPARAM 就是上面设定的 0 了 。<br><br>在EnuwndProc(aWnd,LPARAM )中要处理传回的Awnd 值,就是窗口句柄了。<br>用 GetWindowText(AWnd, @WndCaption, 254); 得到Awnd这个句柄窗体的标题 WndCaption为<br>Pchar类型。254 为此字串的长度。 LPARAM 自己可以随便处理。输出 窗体标题时用StrPas()<br>转换Pchar类型。<br><br>EnuwndProc 是循环调用EnuwndProc(aWnd,LPARAM )的,<br>在 EnuwndProc(aWnd,LPARAM )返回值为True时则代表告诉EnumWindows 继续枚举窗体。<br>否则就停止,有点像循环控制一样。<br>可以在EnuwndProc(aWnd,LPARAM )判断WndCaption[0] ,如果时chr(0)的话就可以终止循环了。<br><br>具体过程可以参考上面的例子。
 
那就是说,不需要FindWindow了?!可以直接调用PostMessage?按照上面的例子,怎样<br>调用PostMessage?<br><br><br>(请xwings在我的“请问怎样令WM_QueryEndSession锁住0的程序,正常退出?”问题里<br>随便发个帖子,我把另外的分数给你^-^)
 
谢谢Xwings,我知道怎样调用了,可是有个更大的问题向你请教:<br>我根据你的例子使用PostMessage(awnd, WM_CLOSE, 0, 0)时,就死机了!<br>我只需要关闭把WM_QueryEndSession锁住为0的程序,请问怎样修改?<br><br><br>(我会另外再给你50分的^-^)
 
FindWindow(ClassName,nil) 是已知窗体的类名,返回窗体句柄的。<br><br>比如可以用来查找Notepad的窗体句柄。<br><br>关闭程序可以用 SendMessage(Awnd, WM_CLOSE, 0, 0);<br>PostMessage我不会。<br><br>PS。<br>其实我也才学Delphi一个月而已,Emuwind因为我要用,所以也是问别人来的。<br><br>
 
后退
顶部