메세지 훅을 걸면서 DLL Injection이 되면서 핫키를 등록해서,
해당 핫키 메세지를 내가 건 메세지 훅에서 사용하기.




library MyHotKey;

uses
  Windows, Messages, SysUtils, Forms;


var
  gHHOOK: HHOOK;
  gHWND: HWND;
  gHotKeyID: Integer;



// Message Proc
function GetMsgProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
var
  pMsg: PMSG;
  ModKey, VirtualKey: Integer;
begin
  Result:=0;
 
  if nCode=HC_ACTION then begin
    pMsg:=PMSG(lParam);
 
    case pMsg.message of
      WM_HOTKEY: begin // 메세지가 WM_HOTKEY이고
        ModKey:=LOWORD(pMsg.lParam);
        VirtualKey:=HIWORD(pMsg.lParam);

        // Ctrl + Space일 경우
        if (ModKey=MOD_CONTROL) and (VirtualKey=VK_SPACE) then begin
          OutputDebugString('Ctrl + Space!!!');
        end;
      end;
    end;
  end;

  if Result=0 then Result:=CallNextHookEx(gHHOOK, nCode, wParam, lParam);
end;



// 훅을 걸기 위해 사용하는 함수
function StartHook(pID: DWORD): Boolean; stdcall;
var
  dwPID: DWORD;
  dwThreadID: DWORD;
begin
  Result:=False;

  dwPID:=0;
  if gHHOOK=0 then begin
    gHWND:=WindowFromProcessID(pID);
    dwThreadID:=GetWindowThreadProcessId(gHWND, dwPID);
    gHHOOK:=SetWindowsHookEx(WH_GETMESSAGE, @GetMsgProc, hInstance, dwThreadID);
    Result:=True;
  end;
end;




// 아래의 함수를 import 해서 호출하면서 훅을 걸 수 있음
exports
  StartHook name 'StartHook';


procedure DllMain(dwReason: DWORD);
begin
  // 내가 원하는 프로세스에만 Injection
  if Pos('프로세스명', LowerCase(Application.ExeName))<1 then Exit;

  case dwReason of
    DLL_PROCESS_ATTACH: begin
      // 핫키를 등록하고자 하는 윈도우 핸들
      gHWND:=FindWindow('CLASS', 'CAPTION');

      gHotKeyID:=GlobalAddAtom('MyHotKey');
      // Ctrl + Space 핫키 등록
      RegisterHotKey(gHWND, gHotKeyID, MOD_CONTROL, VK_SPACE);
    end;

    DLL_PROCESS_DETACH: begin
     
// Hook 해제
      if gHHOOK>0 then begin
        UnHookWindowsHookEx(gHHOOK);
        gHHOOK:=0;
      end;
      
      // 핫키 해제
      UnregisterHotKey(gHWND, gHotKeyID);
      GlobalDeleteAtom(gHotKeyID);
    end;
  end;
end;



begin
  DLLProc:=@DllMain;
  DllMain(DLL_PROCESS_ATTACH);
end.









Posted by bloodguy
,