2014-02-06 78 views
1

我試圖在某些過程中使用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)

謝謝!

+2

除非您確實有充分的理由勾住單個進程,否則通常應該使用[原始輸入](http://msdn.microsoft.com/en-us/library/windows/desktop/ms645536.aspx)而不是' SetWindowsHookEx()'接收鼠標和鍵盤輸入。順便說一句,'WH_MOUSE'回調通常在安裝它的線程的上下文中運行,因此在回調中調用'GetCurrentProcessId()'將返回應用程序的進程ID,而不是被掛鉤的應用程序的進程ID。 –

回答

2

WH_MOUSE是一個全局鉤子。該DLL將被注入掛鉤進程。你確實需要提供一個模塊句柄。與錯誤代碼1428相關聯的名稱非常清晰,ERROR_HOOK_NEEDS_HMOD。這並不像提供模塊句柄那樣困難。通過HInstance

如果你不想注入,那麼你需要使用WH_MOUSE_LL而不是WH_MOUSE

+1

謝謝!我修改HookThreadId並將Dll模塊句柄傳遞給CallNextHookEx。代碼運作良好。 – user2598575