WH_GETMESSAGE를 이용해서 메모장으로 가는 WM_CHAR 메시지를 후킹하여 제거하는 모듈을 만들고 있습니다. 후킹함수를 심을 때(installKBSilentHook), 메모장의 핸들(정확히 말하면, 'Notepad'의 차일드인 'Edit'의 윈도우핸들)을 넘겨주고, 후킹콜백함수에서 WM_CHAR 메시지 발생시 MSG 레코드의 hwnd와 후킹함수를 심을 때 인자로 받아온 핸들을 비교하여 메모장에서 발생한 메시지인지 판별하고 있습니다.
그런데 이상하게 후킹함수를 심을 때 넘겨준 핸들을 hVideoware에 저장하는데, 정작 후킹콜백함수에서는 hVideoware가 0으로 초기화되어 버리더라구요..;; 궁여지책으로 후킹콜백에서 FindWindow로 메모장의 핸들을 얻는 방법도 있긴 합니만, 결국에 메모장이 아니라 다른 어플리케이션의 메시지의 후킹하고자 하는 거라서 ...
도움 부탁드립니다.
<!--CodeS-->
library KeyboardHook;
uses
Windows, Messages;
var
HKbHook : HHOOK;
HVideoware : HWND;
function KBHook(code : Integer; wParam : WPARAM; lParam : LPARAM): LongInt; stdcall;
begin
if code >= 0 then begin
if (PMsg(lParam)^.message = WM_CHAR) then begin
if HVideoware = 0 then
MessageBox(0,'Hvideoware =0','message',MB_OK);
if (HVideoware = PMsg(lParam)^.hwnd) then begin
PMsg(lParam)^.message := WM_NULL;
Result := 0;
Exit;
end;
end;
end;
Result := CallNextHookEx(HKbHook, code, wParam, lParam);
end;
function installKBSilentHook(hVideoware : HWND) : Boolean; exports;
begin
HKbHook := SetWindowsHookEx(WH_GETMESSAGE, KBHook, HInstance, 0);
HVideoware := hVideoware;
if HKbHook > 0 then
Result:= true
else
Result:= false;
end;
function uninstallKBSilentHook : Boolean; exports;
begin
if HKbHook <> 0 then begin
Result := UnhookWindowsHookEx(HKbHook);
end else begin
Result := false;
end;
end;
procedure Process_Attach;
begin
end;
procedure Process_Detach;
begin
end;
procedure EntryPointProc(Reason : Integer);
begin
case Reason of
DLL_PROCESS_ATTACH : Process_Attach;
DLL_PROCESS_DETACH : Process_Detach;
DLL_THREAD_ATTACH: {};
DLL_THREAD_DETACH: {};
end;
end;
Exports
installKBSilentHook,
uninstallKBSilentHook,
begin
DllProc := @EntryPointProc;
EntryPointProc(DLL_PROCESS_ATTACH);
end.
<!--CodeE-->