如何获取任意窗口的句柄以及截获系统级消息(150分)

  • 主题发起人 主题发起人 ji_xuegang
  • 开始时间 开始时间
J

ji_xuegang

Unregistered / Unconfirmed
GUEST, unregistred user!
如已经启动了一个带窗体的应用程序,如何通过我的程序来获取该应用程序窗体中某一编辑框内的内容。
 
用钩子勾住EM_CHANGE消息,判别消息是来自那一个应用程序(handle)<br><br>procedure TForm1.Button1Click(Sender: TObject);<br>var lppe: TProcessEntry32;<br>&nbsp; &nbsp; found : boolean;<br>&nbsp; &nbsp; Hand : THandle;<br>begin<br>&nbsp; Hand := CreateToolhelp32Snapshot(TH32CS_SNAPALL,0);<br>&nbsp; found := Process32First(Hand,lppe);<br>&nbsp; if found then<br>&nbsp; begin<br>&nbsp; &nbsp; //&lt;font color="#ff0000"&gt;这儿,一次获得每个窗口的句柄:lppe.th32ProcessID;&lt;/font&gt;<br>&nbsp; &nbsp; found := Process32Next(Hand,lppe);<br>&nbsp; end<br>&nbsp; else ListBox1.Items.Add('not found');<br>end;
 
先SetCapture(),然后在OnMouseDown调用:<br>WindowFromPoint(...);<br>再用<br>GetWindowText(...);
 
用RX中的WinHook控件试试!
 
如要获得任意窗口的Handle,可以先用EnumWindows,再用FindWindow<br>截获系统级消息用Hook
 
对于这种问题,最好的也是最方便的方法就是定义<br>钩子函数,截获消息。FindWindos()函数对于多任务<br>下的窗口的查询有限制,不建议使用!
 
&nbsp; &nbsp;我认为茶叶蛋老兄的用钩子勾住EM_CHANGE消息,判别消息是来自那一个应用程序<br>(handle)的方法是最好的,等我回去试一下.<br>&nbsp; &nbsp; 茶叶蛋老兄,如果你以有源代码,哪请寄一份给我(delphi201@263.net).<br>&nbsp; &nbsp; 这里先谢过了!<br><br>&nbsp;<br>&nbsp;<br>
 
&nbsp; &nbsp; 我在Delphi的帮助中没有找到TProcessEntry32的说明.可否请教各位高手,<br>这是个什么东东?还有CreateToolHelp32Snapshot又是一个什么函数?谢谢!
 
获取该应用程序窗体中某一编辑框内的内容<br>并不需要截获系统消息,得到窗口句柄后<br>(如DEAN所说),再使用ENUMchildwindow<br>得到编辑框的句柄,再向编辑框发WM_GETTEXT<br>消息,比使用HOOK简单多了<br>&nbsp;<br>
 
为什么用GetWindowNext获取Handle后,在GetText不行?
 
关注!!!<br>关关注!!!<br><br>
 
试验以下下面的程序,它取得鼠标位置的下的窗体内容,包括密码框内容<br>procedure GetOtherText;<br>var TextLen: Integer;<br>&nbsp; &nbsp; TextStr: PChar;<br>&nbsp; &nbsp; PassHandle1,PassHandle:Hwnd;<br>&nbsp; &nbsp; PointPos: TPoint;<br>begin<br>&nbsp;try<br>&nbsp; GetCursorPos(PointPos);<br>&nbsp; PassHandle:=WindowFromPoint(PointPos);<br>&nbsp; if PassHandle=NULL then exit;<br>&nbsp; TextLen:=GetWindowTextLength(PassHandle)+1; &nbsp;//得到名字长度,并将长度加1<br>&nbsp; if TextLen &lt;= 1 then exit;<br>&nbsp; GetMem(TextStr, 255);<br>&nbsp; try<br>&nbsp; &nbsp; SendMessage(PassHandle, WM_GETTEXT, 255, Longint(TextStr));<br>&nbsp; &nbsp; Label1.Caption := (TextStr);<br>&nbsp; finally<br>&nbsp; &nbsp; FreeMem(TextStr);<br>&nbsp; end;<br>&nbsp;except<br>&nbsp;end;<br>end;<br><br>
 
接受答案了.
 
后退
顶部