800分求关于钩子编程的方法 我有编程基础,但没用过DELPHI。现在有个任务需要做个钩子程序:向运行中的另一个win程序的编辑控件里写文本,然后触发一个按钮的单击事件。哪位大哥耐烦手把手教小弟完成这个工作,一定开贴800分重谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 写过很多,其实也很简单,大概说个程序结构,你自己再研究吧,有问题你再问,手把手教是没时间了。首先设置钩子HHOOK SetWindowsHookEx( int idHook, // hook type //钩子类型自己看MSDN文档 HOOKPROC lpfn, // hook procedure //指向自己的函数 HINSTANCE hMod, // handle to application instance DWORD dwThreadId // thread identifier);然后写个函数,该函数主要有3个参数(UINT nCode, WPARAN wParam, LPARAM lParam),返回类型为LONG,然后在该函数里堆第一个参数nCode进行判断,然后做相应的处理,然后调用LRESULT CallNextHookEx( HHOOK hhk, // handle to current hook int nCode, // hook code passed to hook procedure WPARAM wParam, // value passed to hook procedure LPARAM lParam // value passed to hook procedure); 感谢楼上大哥,不过小弟愚钝,看哪位再帮帮?Wyj:本机上有个程序正运行,界面上有一文本编辑控件和按钮,我就是想用DELPHI做的程序向文本编辑控件里写文字,然后触发按钮。 如果只是这样,有必要用钩子吗直接发消息不就可以了吗首先找到你的目标句柄(文本编辑控件和按钮的句柄)怎么找句柄?你不会不知道吧,用API,FindWindow,GetWindow或者回调函数EnumWindowsProc,自己看msnd文档吧然后发送相应的消息对于文本编辑控件SendMessage(target_handle, WM_SETTEXT, 0, LPARAM(your_string));对于按钮SendMessage(target_handle, BM_CLICK, 0, 0);或者PostMessage(target_handle, WM_LBUTTONDOWN, 0, 0);PostMessage(target_handle, WM_LBUTTONUP, 0, 0); 给你写段代码吧,现在有点空闲,自己修改吧,在这里写的,没调试过var hWin :HWND; hCom :HWND; hTxt :HWND; hBtn :HWND; value :String; className :String; caption :String;begin hWin := FindWindow(NULL, "你的窗口的名字(Form's caption)"); //获得窗口句柄 hCom := GetWindow(hWin, GW_CHILD); while (hCom <> NULL) begin GetWindowClass(hCom, className, 50); //取得子窗口类名字 GetWindowText(hCom, caption, GetWindowTextLength(hCom)+1); //取得子窗口名字 //可以通过类名字或窗口名字判断是不是所寻找的目标句柄 if (className == 文本编辑控件类(delphi里一般是'TEdit',其他自己查)) begin hTxt := hCom; end else if (className == 按钮类(delphi里一般是'TButton',其他自己查)) begin hBtn := hCom; end; {或者用名字去查找,不过一般害怕有重名 if (caption == your_exit_caption) begin hTxt := hCom; end else if (caption == your_button_cation) begin hBtn := hCom; end; } hCom = GetWindow(hCom, GW_HWNDNEXT); end; value := your_string; //你要设置的文字 if (hTxt <> NULL) begin SendMessage(hTxt, WM_SETTEXT, 0, LPARAM(value)); if (hBtn <> NULL) begin SendMessage(hBtn, BM_CLICK, 0, 0); end; end;end;这个大概可以满足你的要求,试试看,不过我好久没用delphi了,不知道变量类型什么的是不是合法,你自己再调试修改吧 很有点像我朋友做的QQ尾巴发送机制的问题:给你个网址,你去看看吧:http://dev.csdn.net/develop/article/24/24144.shtm其实很简单的. 我做过一个VC的源程序,可以将一个全局钩子嵌入指定的线程里,如Explorer.exe, 如果想要可以给你。 Dbgrideh displayformat 显示问题 出错提问 如何修改编译好的EXE程序软件界面和标题栏? 菜人问题 ??关于StringGrid // maskedit如何与数据库绑定? 在SQL2000中字段可以是中文吗? 怎么处理批处理文件*.BAT出现的错误! 得到一个窗口句柄,如何控制这个窗体中的所有控件及其属性? 菜鸟问题,谢谢啦~ 在一个窗口弹出之前WINDOWS会对它做些什么? 果然是好书,给分 果然是好书 给分
首先设置钩子
HHOOK SetWindowsHookEx(
int idHook, // hook type //钩子类型自己看MSDN文档
HOOKPROC lpfn, // hook procedure //指向自己的函数
HINSTANCE hMod, // handle to application instance
DWORD dwThreadId // thread identifier
);
然后写个函数,该函数主要有3个参数(UINT nCode, WPARAN wParam, LPARAM lParam),返回类型为LONG,然后在该函数里堆第一个参数nCode进行判断,然后做相应的处理,然后调用
LRESULT CallNextHookEx(
HHOOK hhk, // handle to current hook
int nCode, // hook code passed to hook procedure
WPARAM wParam, // value passed to hook procedure
LPARAM lParam // value passed to hook procedure
);
Wyj:本机上有个程序正运行,界面上有一文本编辑控件和按钮,我就是想用DELPHI做的程序向文本编辑控件里写文字,然后触发按钮。
直接发消息不就可以了吗
首先找到你的目标句柄(文本编辑控件和按钮的句柄)
怎么找句柄?你不会不知道吧,用API,FindWindow,GetWindow或者回调函数EnumWindowsProc,自己看msnd文档吧
然后发送相应的消息
对于文本编辑控件
SendMessage(target_handle, WM_SETTEXT, 0, LPARAM(your_string));
对于按钮
SendMessage(target_handle, BM_CLICK, 0, 0);
或者
PostMessage(target_handle, WM_LBUTTONDOWN, 0, 0);
PostMessage(target_handle, WM_LBUTTONUP, 0, 0);
var
hWin :HWND;
hCom :HWND;
hTxt :HWND;
hBtn :HWND;
value :String;
className :String;
caption :String;
begin
hWin := FindWindow(NULL, "你的窗口的名字(Form's caption)"); //获得窗口句柄
hCom := GetWindow(hWin, GW_CHILD);
while (hCom <> NULL)
begin
GetWindowClass(hCom, className, 50); //取得子窗口类名字
GetWindowText(hCom, caption, GetWindowTextLength(hCom)+1); //取得子窗口名字
//可以通过类名字或窗口名字判断是不是所寻找的目标句柄
if (className == 文本编辑控件类(delphi里一般是'TEdit',其他自己查))
begin
hTxt := hCom;
end else if (className == 按钮类(delphi里一般是'TButton',其他自己查))
begin
hBtn := hCom;
end;
{或者用名字去查找,不过一般害怕有重名
if (caption == your_exit_caption)
begin
hTxt := hCom;
end else if (caption == your_button_cation)
begin
hBtn := hCom;
end;
}
hCom = GetWindow(hCom, GW_HWNDNEXT);
end;
value := your_string; //你要设置的文字
if (hTxt <> NULL)
begin
SendMessage(hTxt, WM_SETTEXT, 0, LPARAM(value));
if (hBtn <> NULL)
begin
SendMessage(hBtn, BM_CLICK, 0, 0);
end;
end;
end;
这个大概可以满足你的要求,试试看,不过我好久没用delphi了,不知道变量类型什么的是不是合法,你自己再调试修改吧
给你个网址,你去看看吧:
http://dev.csdn.net/develop/article/24/24144.shtm
其实很简单的.