2014-02-06 3 views
1

Im 어떤 과정에서 SetWindowsHookEx를 Hook Mouse로 사용하려고합니다. 임 사용 델파이 7 코드 (DLL)Windows Hooks 사용법 이해

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입니다.

고마워요!

+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 대신 WH_MOUSE_LL을 사용해야합니다.

+1

고마워요! 나는 HookThreadId를 수정하고 Dll 모듈 핸들을 CallNextHookEx에 전달합니다. 코드가 잘 작동합니다. – user2598575