我試圖在某些過程中使用SetWindowsHookEx掛鉤鼠標。即時通訊使用的Delphi 7. 代碼(DLL):瞭解如何使用Windows掛鉤
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是不需要的... 我如何whant它將工作: 每個鼠標事件將傳遞到我的應用程序(窗口類是'ichookapplication')使用WM_DATA(wParam是事件數據,lParam是ProcessId)
謝謝!
除非您確實有充分的理由勾住單個進程,否則通常應該使用[原始輸入](http://msdn.microsoft.com/en-us/library/windows/desktop/ms645536.aspx)而不是' SetWindowsHookEx()'接收鼠標和鍵盤輸入。順便說一句,'WH_MOUSE'回調通常在安裝它的線程的上下文中運行,因此在回調中調用'GetCurrentProcessId()'將返回應用程序的進程ID,而不是被掛鉤的應用程序的進程ID。 –