我试图在某些过程中使用SetWindowsHookEx来挂钩鼠标。我正在使用Delphi 7。 代码(DLL):
function MouseProc(code: integer; wParam: WPARAM; lParam: LPARAM)
: LongInt; stdcall;
var
AppWnd: HWND;
begin
Result := 0;
if (code < 0) then
Result := CallNextHookEx(HookHandle, code, wParam, lParam)
else begin
AppWnd := FindWindowW('ichookapplication', nil);
SendMessage(AppWnd, MW_MOUSEHOOKED, wParam, GetCurrentProcessId);
Result := CallNextHookEx(HookHandle, code, wParam, lParam);
end;
end;
procedure HookThreadId(theadId: Cardinal) export; stdcall;
var
e: DWORD;
begin
HookHandle := SetWindowsHookEx(WH_MOUSE, @MouseProc, 0, theadId);
if (HookHandle = 0) then
begin
e := GetLastError;
MessageBox(0, 'error', PAnsiChar(IntToStr(e)), MB_OK);
end;
end;
MW_MOUSEHOOKED是WM_USER + 101;
应用程序:
//loading code
if (dll = 0) then
begin
dll := LoadLibrary('mhook.dll');
@Hook := nil;
@SetThreadHook := nil;
end;
if (dll > HINSTANCE_ERROR) then
begin
pH := GetProcAddress(dll, 'Hook');
@Hook := pH;
pSth := GetProcAddress(dll, 'HookThreadId');
@SetThreadHook := pSth;
end;
// attach code
h := FindWindow(nil, 'Form1');
terminalProc := GetWindowThreadProcessId(h, nil);
if (terminalProc = 0) then
begin
ShowMessage(IntToStr(GetLastError));
Exit;
end;
SetThreadHook(terminalProc);
因此。 SetWindowsHookEx返回1428错误:无法在没有模块句柄的情况下设置非本地挂钩。 但据我所知,如果我不需要使用DLL hmodule ... 我怎么会这样工作: 每个鼠标事件都将使用WM_DATA传递给我的应用程序(窗口类是'ichookapplication')(wParam是事件数据,lParam是ProcessId)
谢谢!
答案 0 :(得分:2)
WH_MOUSE
是一个全局钩子。 DLL将被注入到钩子进程中。您需要提供模块句柄。与错误代码1428
相关联的名称非常明确,ERROR_HOOK_NEEDS_HMOD
。这并不像提供模块句柄那么困难。通过HInstance
。
如果您不想注射,则需要使用WH_MOUSE_LL
代替WH_MOUSE
。