如何得到可见窗体的句柄?(200分)

  • 主题发起人 主题发起人 hw13
  • 开始时间 开始时间
H

hw13

Unregistered / Unconfirmed
GUEST, unregistred user!
我用GETWINDOW可得到所有窗体的句柄,如何过滤掉不可见的窗体的句柄或<br>在任务栏上不显示的窗体的句柄?
 
调用iswindowvisible
 
以下是我做的例子,调试通过:<br>procedure TfrmGetWindowText.btnGetTextClick(Sender: TObject);<br>var<br>&nbsp; &nbsp;hCurrentWindow: HWnd;<br>&nbsp; &nbsp;szText: array[0..254] of char;<br>begin<br>&nbsp; &nbsp; &nbsp;hCurrentWindow := GetWindow(Handle, GW_HWNDFIRST);<br>&nbsp; &nbsp; &nbsp;while hCurrentWindow &lt;&gt; 0 do<br>&nbsp; &nbsp; &nbsp;begin<br>&nbsp; &nbsp; &nbsp; &nbsp; if iswindowvisible(hCurrentWindow) then<br>&nbsp; &nbsp; &nbsp; &nbsp; begin<br> if GetWindowText(hCurrentWindow, @szText, 255)&gt;0 then<br>&nbsp; &nbsp; memowindowstext.Lines.Add(StrPas(@szText));<br>&nbsp; &nbsp; &nbsp; &nbsp; end;<br>&nbsp; &nbsp; &nbsp; &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; hCurrentWindow:=GetWindow(hCurrentWindow, GW_HWNDNEXT);<br>&nbsp; &nbsp; &nbsp;end;<br>end;<br>
 
需要写一个递归调用搜索当前状态下的各个窗口<br>GetFirstWindow<br>GetNextWindows<br>GetChildWindow
 
得到所有的窗口句柄之后,依次用 IsWindowVisible 判断就行了。
 
200啊!!<br><br>就是上面的做法!<br>
 
如果仅想得到在任务栏上显示图标的窗体的句柄呢?
 
参考一个例子:<br>procedure TForm1.CloseVAppClick(Sender: TObject);//标题不确定<br>var ExeHandle:Thandle;<br>begin<br>//获得句柄--&gt;标题不确定<br>ExeHandle:=FindWindow('notepad',nil);//'');//返回句柄<br>//关闭程序<br>if ExeHandle&lt;&gt;0 then<br>SendMessage(ExeHandle,WM_Close,0,0)<br>else<br>Application.MessageBox('没有打开“记事本”程序!','提示',<br>MB_IconInformation+MB_OK);<br>end;<br>
 
KILL NIGHT的方法可行,但有问题:1。总有PROGRAM MANAGER窗口出现;2。如窗<br>口CAPTION和类名不一致,则总同时出现在MEMO中。<br>另:如何获得仅在任务栏(非托盘区)出现图标的窗口句柄?
 
伙计,》》和?!是什么意思?
 
伙计,是迷惘!
 
恩,这个问题和我想知道的差不多。但我知道的不全。<br>托盘窗体的名字是Shell_TrayWnd,桌面的是Progman,<br>你去掉就行了。<br>
 
hw13:如果你还要继续讨论请定期提前你的帖子,如果不想继续讨论请结束帖子。<br>
 
多人接受答案了。
 
后退
顶部