Q&A

  • 전역 키후킹에서 핸들값이 자꾸 없어져요?
안녕하세요.

  전역후킹을 한번 해보려니 힘드네요.  파일 통해 핸들을 기록하고 읽오 오는 것은 되는데요. 그러면 약간씩 훅이 풀리는 경우가 있더라구요.  그래서  메모리에 올려서 사용하려고 합니다. 그런데 이렇게 하니, 다른 프로그램에서 키를 누른 다음에는  핸들 값을 잃어 버려서 UnHook 할때 에러가 발생합니다.

핸들값을 읽어 버리지 않을 려면 값을 어디에, 언제 선언해주어야 하나요?

아래는 DLL파일 소스입니다. ^^;;;

unit uHookApi;

interface



function HookKB : Boolean;
function UnHookKB : Boolean;


implementation

uses
   ShareMem, Windows,Messages;

type
  PDLLData = ^TDLLData;
  TDLLData = record
    HKbHook : HHook;
end;


const
   MMName = 'Hookss';

var

  // 요 것 들을 어디에 다 나두어야  다른 애플리캐이션에 가도 읽어버리지 않을까요?

   DLLData : PDLLData;    
   mHandle : THandle;  

function MyKBHook(Code : Integer;wParam:WPARAM;lParam : LPARAM):LongInt;stdcall;
begin

   if Code >= 0 then
   begin
      Result := Integer(TRUE);
      Exit;
   end;
   Result := CallNextHookEx(DLLData^.HKbHook,Code,wParam,lParam);
end;

function HookKB : Boolean;
var
   Hnd : THandle;
begin
   Hnd := OpenFileMapping(FILE_MAP_WRITE,false,MMName);
   DLLData := MapViewOfFile(Hnd,FILE_MAP_WRITE,0,0,Sizeof(TDLLData));
   DLLData^.HKbHook := SetWindowsHookEx(WH_KEYBOARD,MyKBHook,HInstance,0);
   CloseHandle(Hnd);
end;

function UnHookKB : Boolean;
var
   Hnd : THandle;
begin
   Hnd := OpenFileMapping(FILE_MAP_WRITE,false,MMName);
   DLLData := MapViewOfFile(Hnd,FILE_MAP_WRITE,0,0,Sizeof(TDLLData));
   Result := UnHookWindowsHookEx(DLLData^.HKbHook);
   CloseHandle(Hnd);
end;


Initialization
   mHandle := CreateFileMapping($FFFFFFFF,nil,PAGE_READWRITE,
   0,Sizeof(TDLLData),MMName);

   if GetLastError = ERROR_ALREADY_EXISTS then halt;
   DLLData := MapViewOfFile(mHandle,FILE_MAP_WRITE,0,0,Sizeof(TDLLData));
finalization
   UnmapViewOfFile(DLLData);
   CloseHandle(mHandle)
end.
0  COMMENTS