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입니다.
고마워요!
개별 프로세스를 연결해야하는 강력한 이유가 없다면 일반적으로 [원시 입력] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms645536.aspx) 대신 ' SetWindowsHookEx()'를 호출하여 마우스 및 키보드 입력을받습니다. 덧붙여 말하자면'WH_MOUSE' 콜백은 일반적으로 그것을 설치하는 쓰레드의 컨텍스트에서 실행되기 때문에 콜백에서'GetCurrentProcessId()'를 호출하면 걸려있는 앱의 프로세스 ID가 아니라 앱의 프로세스 ID가 반환됩니다. –