关于窗口句柄的遍历 (50分)

  • 主题发起人 主题发起人 leo.1999
  • 开始时间 开始时间
L

leo.1999

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure killwindows;<br>var<br>j1,j2:THandle;<br>s,Desktop:integer;<br>str:array[0..100] of char;<br>begin<br>s:=0;<br>Desktop:=GetDesktopWindow;<br>repeat<br>&nbsp; j1:=findwindow('Tform1',nil);//查找是不是有'Tform1'的类名的窗口<br>&nbsp; j2:=FindWindowEx(j1,0,'tpagecontrol',nil);//查找他上面是不是有'tpagecontrol'的控件<br>&nbsp; s:=FindWindowEx(j2,0,'ttabsheet',nil);//查找他上面是不是有'ttabsheet'的控件<br>getwindowtext(s,str,101);//获得控件标题<br>if pos('消息',str)&lt;&gt;0 then //如果控件标题 包含'消息'2字<br>PostMessage(j1,WM_quit,0,0);//如果存在就关闭J1<br>until<br>s=0;<br>end;<br><br>代码有点小问题,如果系统有我要找的这个窗口存在。同时还有另外一个'Tform1'的类名的窗口 那么我的程序就会失去效果<br><br>怎么解?遍历所有窗口,只到找到满足条件的!<br>不知道怎么写 ``请大家指教!!
 
http://www.delphibbs.com/keylife/iblog_show.asp?xid=7146
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2545845
 
用 EnumChildWindows或enumwindows 函数效果不错,你要写个回调函数,在里面判断当前窗口是否符合条件<br>(操作系统会自动遍历,且把每个遍历到的窗体的句柄传给我们定义的回调函数,每遇到一个窗口调用一次)<br>&nbsp; 到 &nbsp;www.2ccc.com 下个 QQ灌水机之类的 程序代码 , 你就知道了。。 :)
 
http://www.delphibbs.com/delphibbs/DispQ.asp?LID=1659648
 
还是没能明白 <br>请哪位高手写出完成的代码`谢谢!
 
奇怪,我笔记里的代码是全的呀,并且有注释。<br>http://www.delphibbs.com/keylife/iblog_show.asp?xid=7146
 
你可以找一本书,是什么DELPHI 5 的一个案列,具体不记得了是什么书。
 
to yostgxf<br>就是你的东西我看不明白 您能不能根据我的意思`写出代码?/<br>谢谢了<br>分不多`不好意思
 
我那边已经写得很详细了。。
 
1。 查找是不是有'Tform1'的类名的窗口 <br>&nbsp; &nbsp;AHandle:=findwindow('Tform1',nil);<br>2。查找他上面是不是有'tpagecontrol'的控件<br>&nbsp; &nbsp; if AHandle&lt;&gt;0 then<br>&nbsp; &nbsp; begin<br>&nbsp; &nbsp; &nbsp; &nbsp; //在这里循环取到想要的句柄为止<br>&nbsp; &nbsp; &nbsp; &nbsp; EnumChildWindows(AHandle, @GetComponentHandle, Integer(@BHandle));<br>&nbsp; &nbsp; &nbsp; &nbsp; //此时,BHandle就是你要的句柄<br>&nbsp; &nbsp; &nbsp; &nbsp; PostMessage(BHandle, BM_Click, 0, 0); //向这个按钮发一个点击消息<br>&nbsp; &nbsp; end;<br><br>function GetComponentHandle(hwnd: Integer; lparam: Longint):Boolean; stdcall;<br>var<br>&nbsp; buffer: array[0..255] of Char;<br>begin<br>&nbsp; &nbsp; Result := True;<br>&nbsp; &nbsp; //得到目标窗口的控件<br>&nbsp; &nbsp; GetClassName(hwnd, buffer, 256);<br>&nbsp; &nbsp; //找到目标窗口的TButton类目标控件<br>&nbsp; &nbsp; if StrPas(Buffer)='Tpagecontrol' then<br>&nbsp; &nbsp; begin<br>&nbsp; &nbsp; &nbsp; &nbsp; PInteger(lparam)^ := hwnd; //得到目标控件的Hwnd(句柄)<br>&nbsp; &nbsp; &nbsp; &nbsp; Result:=False; &nbsp;//终止循环<br>&nbsp; &nbsp; end;<br>end;<br>3。查找他上面是不是有'ttabsheet'的控件<br>类同上面过程,把回调函数的‘tpagecontrol’改为‘ttabsheet’就行了,其实你的第二步根本不需要。<br>4。获得控件标题<br>&nbsp; &nbsp; GetWindowText(BHandle, Str, 100);<br>5。如果存在就关闭Ahandle<br>PostMessage(Ahandle,WM_Close,0,0);//WM_Quit<br><br><br>
 
yostgxf 谢谢你热情的帮助,但是你给的代码并不能帮我完成工作,还有你说我的J2可以不需要,这本身就是错误的说法!
 
function EnumWindowspro(hWnd: HWND; lParam: LPARAM):bool;stdcall;<br>var<br>j2,j3:integer;<br>mytext:array [0..255] of char;<br>begin<br>Result:=true;<br>&nbsp;if getclassname(hwnd,mytext,256)&lt;&gt;0 then<br>&nbsp; begin<br>&nbsp; &nbsp;j2:=FindWindowEx(hwnd,0,'tpagecontrol',nil);<br>&nbsp; &nbsp;j3:=FindWindowEx(j2,0,'ttabsheet',nil);<br>&nbsp; &nbsp;getwindowtext(j3,mytext,255);<br><br>&nbsp; &nbsp; if pos('消息',mytext)&lt;&gt;0 then<br>&nbsp; &nbsp; &nbsp;begin<br>&nbsp; &nbsp; &nbsp; Result:=False; &nbsp;//终止循环<br>&nbsp; &nbsp; &nbsp; PostMessage(hwnd,WM_quit,0,0);<br>&nbsp; &nbsp; &nbsp; messagebox(0,'找到并关闭!','*_*',mb_ok);<br>&nbsp; &nbsp; &nbsp;end;<br>&nbsp; end;<br>end;<br><br>procedure TForm1.Button1Click(Sender: TObject);<br>begin<br>EnumWindows(@EnumWindowspro,0);<br>end;<br><br><br>已经完成了 不管怎么说 还是受yostgxf的启发`谢谢
 

Similar threads

后退
顶部