关于如何向找不到句柄的控件发送消息的问题300分求(300分)

  • 主题发起人 主题发起人 疾风之龙
  • 开始时间 开始时间

疾风之龙

Unregistered / Unconfirmed
GUEST, unregistred user!
我想通过自己的程序向一些其他程序窗口中的用户名和密码的输入框中传送消息,在能够找到该输入框句柄的程序中可以实现但向QQ,或一些网游的登陆窗口却无法找到句并9无法传送消息,有哪位大哥能帮忙解决下啊 ,我查了一下以前的问题帖子没找到具体的解决方案
 
有人的话帮个忙啊
 
function GetLocalTextInfo(var ReturnEditHandle:Integer):String;<br>var AHandle, BHandle: Integer;<br> &nbsp; &nbsp;R:Boolean;<br> &nbsp; &nbsp;mbuffer: array[0..255] of Char;<br> &nbsp; &nbsp;ss:string; &nbsp;<br>{$WRITEABLECONST ON}//这是用于静态变量somedata增加的开关,防止同类型控件只能找到第一个,你单步执行调整变量i的值就可以找到你需要的控件<br> &nbsp;function GetComponentHandle(hwnd: Integer; lparam: Longint):Boolean; stdcall;<br> &nbsp;var s,sssss:string;<br> &nbsp; &nbsp; &nbsp;i,j:integer;<br> &nbsp; &nbsp; &nbsp;buffer: array[0..255] of Char; <br> &nbsp;const<br> &nbsp; &nbsp; &nbsp;somedata: Integer = 0;<br> &nbsp;begin<br> &nbsp; &nbsp;j:=0;i:=2;<br> &nbsp; &nbsp;if DebugState then sssss:='TEDIT'<br> &nbsp; &nbsp;else sssss:='.EDIT.';<br> &nbsp; &nbsp;Result := True;<br> &nbsp; &nbsp;//得到目标窗口的控件<br> &nbsp; &nbsp;j:=GetClassName(hwnd, buffer, 256);<br> &nbsp; &nbsp;//找到目标窗口的TButton类目标控件<br> &nbsp; &nbsp;s:=StrPas(Buffer);<br> &nbsp; &nbsp;if Pos(sssss,uppercase(s))&gt;0 then<br> &nbsp; &nbsp;begin<br> &nbsp; &nbsp; &nbsp;if DebugState then begin<br> &nbsp; &nbsp; &nbsp; &nbsp;inc(somedata);<br> &nbsp; &nbsp; &nbsp; &nbsp;if somedata=i then begin<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;somedata:=0;<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Result:=False; &nbsp;//终止循环<br> &nbsp; &nbsp; &nbsp; &nbsp;end;<br> &nbsp; &nbsp; &nbsp;end else begin<br> &nbsp; &nbsp; &nbsp; &nbsp;PInteger(lparam)^ := hwnd; //得到目标控件的Hwnd(句柄)<br> &nbsp; &nbsp; &nbsp; &nbsp;Result:=False; &nbsp;//终止循环<br> &nbsp; &nbsp; &nbsp;end;<br> &nbsp; &nbsp;end;<br> &nbsp;end; &nbsp; <br>{$WRITEABLECONST OFF}<br>begin<br> &nbsp;//取句柄<br> &nbsp;AHandle := FindWindow(nil, 'MasterLabelPrint'); &nbsp;//就是窗口的Caption<br> &nbsp;//AHandle := FindWindow(nil, 'G/BOX组装防错系统'); &nbsp;//就是窗口的Caption<br> &nbsp;if AHandle&lt;&gt;0 then<br> &nbsp;begin<br> &nbsp; &nbsp;//在这里循环取到想要的句柄为止<br> &nbsp; &nbsp;R:=EnumChildWindows(AHandle, @GetComponentHandle, Integer(@BHandle));<br> &nbsp; &nbsp;if not R then begin<br> &nbsp; &nbsp; &nbsp;ReturnEditHandle:=BHandle;<br> &nbsp; &nbsp; &nbsp;SendMessage(BHandle,WM_GETTEXT,254,Integer(@mbuffer));<br> &nbsp; &nbsp; &nbsp;//GetWindowText(BHandle, mbuffer, 100);<br> &nbsp; &nbsp; &nbsp;ss:=StrPas(mBuffer);<br> &nbsp; &nbsp; &nbsp;Result:=ss;<br> &nbsp; &nbsp;end;<br> &nbsp; &nbsp;//此时,BHandle就是你要的句柄<br> &nbsp; &nbsp;//PostMessage(BHandle, BM_Click, 0, 0); //向这个按钮发一个点击消息<br> &nbsp;end;<br>end;
 
to dey-999<br> 请问下DebugState是什么,没有定义他啊,调试时这里过不去啊
 
你可以采用模拟键盘敲击的方式来处理。在Delphi的安装盘上有一个sendkey32.pas 就可以完成这个功能。<br>如果找不到,你可以看看这个链接,这里面我贴了一份sendkey32.pas的代码<br>http://www.delphibbs.com/delphibbs/dispq.asp?lid=3545907
 
首先谢谢大家的关注,其实我的 问题就是想实现SPY++那样的功能,通过鼠标的移动来取得鼠标坐标所在的句柄,现在其他问题都解决了,就是在一些窗口下的控件句柄无法取到,如QQ的用户和密码输入框,但是SPY++可以取到,所以我想知道怎么样才能想SPY++那样取到这些控件句柄[:(!]
 
后退
顶部