메세지 훅을 걸면서 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.
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.
'Delphi' 카테고리의 다른 글
[Delphi] 로컬-서버 유닉스 타임 (UnixTime) 비교 (0) | 2010.05.06 |
---|---|
[Delphi] 로컬 파일 크기 가져오기 (0) | 2010.05.06 |
[Delphi] ContextMenu, FindWindow (0) | 2010.04.29 |
[Delphi] CreateProcess 완료 시점 (WaitForInputIdle) (0) | 2010.04.28 |
[Delphi] DLL의 Form의 Deactivate 처리 (0) | 2010.04.26 |