DLL全局钩子改变指定程序的Edit文本(100)

  • 主题发起人 主题发起人 duanyq7
  • 开始时间 开始时间
D

duanyq7

Unregistered / Unconfirmed
GUEST, unregistred user!
[2009-04-01]DLL是一个全局钩子,挂接到指定进程监听键盘,一旦指定进程按下某键,则自动执行一些操作。即sendmessage是由dll中的回调函数来调用,而非外部程序调用。DLL中的回调函数如下:function KeyHookProc(iCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; export;begin if iCode < 0 then Result := CallNextHookEx(hOldKeyHook, iCode, wParam, lParam) else begin if wParam = XXX then //指定键按下 begin //1.对按钮发送消息: SendMessage(hdButton, WM_LBUTTONDOWN, 0, 0); SendMessage(hdButton, WM_LBUTTONUP, 0, 0); //2.对输入框发送消息: SendMessage(hdEdit, WM_SETFOCUS, 0, 0); SendMessage(hdEdit, WM_SETTEXT, 0, Integer(PChar('580013'))); SendMessage(hdEdit, EM_SETSEL, 4, 4); end; end;end;即先触发一个按钮的点击,再对一个输入框发送文本。我测试如果只做其中一个操作,一切正常。但二者合在一起,第二项始终无法触发。类似的,如果连续对两个不同的按钮发送SendMessage,后面一项也无法触发。但单独操作则正常。试过sleep,PostMessage都不行。请高手帮忙,谢谢!!!
 
我在第二个程序中,通过这种方式对第一个程序的Edit更改Text成功了。
 
可能你找的句柄不对。
 
<1>exe对exe测试通过,但dll对exe无效。<2>edit控件句柄确定无误,因为SendMessage(iHandle, EM_SETSEL, 4, 4);的确是对该控件起作用了。期待高手帮助,谢谢!!!
 
procedure SETTEXT(H:Integer); external 'Project1.dll';procedure TForm1.Button1Click(Sender: TObject);begin SETTEXT(4592846); //4592846是另外一个程序中edit1.Handleend;--------------------library Project1;uses SysUtils, Windows, Messages, Classes;{$R *.res}procedure SETTEXT(H:Integer);Var S:String;begin S:='XXXX'; SendMessage(H, WM_SETFOCUS, 0, 0); SendMessage(H, WM_SETTEXT, 4, Integer(PChar(s))); SendMessage(H, EM_SETSEL, 4, 4);end;exports SETTEXT;end.----------------------以上代码经过测试,可以更改第二个程序中edit.text,你需要检查自己的代码中,是不是句柄获取错误。
 
谢谢上面的朋友!我可能没说清楚问题,DLL是一个全局钩子,挂接到指定进程监听键盘,一旦指定进程按下某键,则自动执行一些操作。即sendmessage是由dll中的回调函数来调用,而非外部程序调用。DLL中的回调函数如下:function KeyHookProc(iCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; export;begin if iCode < 0 then Result := CallNextHookEx(hOldKeyHook, iCode, wParam, lParam) else begin if wParam = XXX then //指定键键按下 //在这里用SendMessage(H, WM_SETTEXT, 4, Integer(PChar(s))); 无效 end;end;
 
期待高手帮助,谢谢!!!
 
很可能是你的代码有问题,再检查一下吧,改成以下再试试看你可以把Edit1的句柄找出来比如12345,再改成这样测试SendMessage(12345, WM_SETTEXT, 4, Integer(PChar(s))); //安装勾子:SetWindowsHookEx(WH_KEYBOARD, KeyHookProc, HInstance, 0);//DLL中的回调函数如下:function KeyHookProc(iCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; export;begin if iCode = HC_ACTION then begin if wParam = XXX then //指定键键按下 //在这里用SendMessage(H, WM_SETTEXT, 4, Integer(PChar(s))); 无效 end; Result:= CallNextHookEx(hOldKeyHook, iCode, wParam, lParam)end;
 
终于弄清问题所在了:在DLL Hook的回调函数中调用了两次SendMessage: //1.对按钮发送消息: SendMessage(hdButton, WM_LBUTTONDOWN, 0, 0); SendMessage(hdButton, WM_LBUTTONUP, 0, 0); //2.对输入框发送消息: SendMessage(hdEdit, WM_SETFOCUS, 0, 0); SendMessage(hdEdit, WM_SETTEXT, 0, Integer(PChar('580013'))); SendMessage(hdEdit, EM_SETSEL, 4, 4);即先要触发一个按钮的点击,再对一个输入框发送文本。我测试如果只做其中一个操作,一切正常。但二者合在一起,第二项始终无法触发。试过sleep(20),或把SendMessage换成PostMessage都不行,请高手帮忙,谢谢!!!
 
attachthreadinput
 
attachthreadinput succeed. thanks.
 
多人接受答案了。
 
后退
顶部