안녕하세요?
WM_PAINT를 시스템 전역후킹하려고 하는데 어려움이 있어서 이렇게 쓰게 됬슴돠..^^;;
질문의 요지는 WH_CALLWNDPROC을 후킹해서 화면에 보내지는 WM_PAINT를 모두 후킹하려고 하는데 화면의 모든 윈도우의 WM_PAINT가 걸려지지 않고 dll을 로드시킨 APP에서만 WM_PAINT가 걸려지는데 그 이유가 뭔가 하는것 인데요(키보드는 잘걸리는뎅..ㅡ.ㅡ),, 아마 제가 쓴 방법이 잘못된거 같아서요.. 부디 이 초보에게 한수 가르쳐 주세용~ ^-^;;
다음은 dll소스의 일부분입니다.
var
hKBHook: HHook; // 키보드 훅 핸들
hCallWndHook: HHook; // 모니터 메세지 훅 핸들
hVeneto: THandle; // dll을 로드시킨 App의 핸들
// 키보드 훅 프로시져
function MyKBHook(nCode : Integer; wParam : WPARAM; lParam : LPARAM) : LongInt; stdcall;
begin
if nCode >= 0 then
begin
Result := Integer(true);
Exit;
end;
Result := CallNextHookEx(hKBHook, nCode, wParam, lParam);
end;
// 모니터 메세지 훅 프로시저
function CallWndProc(nCode : Integer; wParam : WPARAM; lParam : LPARAM) : LongInt; stdcall;
var
cwpStruct: PCWPStruct;
begin
if (nCode = HC_ACTION) then
begin
cwpStruct := PCWPStruct(lParam);
if (hVeneto <> 0) then
begin
case cwpStruct^.message of
WM_PAINT:
begin
SendMessage(hVeneto, WM_USER + 50, 0, 0);
end;
end;
end;
end;
Result := CallNextHookEx(hCallWndHook, nCode, wParam, lParam);
end;
// 훅 시작하기
function SetHook(hWnd: THandle): boolean;
begin
Result := false;
if (hWnd = 0) then Exit;
hKBHook := SetWindowsHookEx(WH_KEYBOARD, MyKBHook, HInstance, 0);
hCallWndHook := SetWindowsHookEx(WH_CALLWNDPROC, CallWndProc, HInstance, 0);
if (hKBHook > 0) and (hCallWndHook > 0) then
begin
hVeneto := hWnd;
Result := true;
end;
end;
// 훅 끝내기
function UnHook: Boolean;
begin
Result := UnhookWindowsHookEx(hKBHook) and UnhookWindowsHookEx(hCallWndHook);
end;
Exports
SetHook,
UnHook;
begin
hVeneto := 0;
end.