LockSystem 함수 호출 한 번이면 끝남.
후킹 종료는 UnHookWindowsHookEx(HookID);
LLKeyHookFunc; 에 모든 걸 표현하면 됨.
// 키보드 훅 구조체
type
PKeyHookStruct=^TKeyHookStruct;
TKeyHookStruct=record
vkCode: Integer;
ScanCode: Integer;
Flags: Integer;
Time: Integer;
dwExtraInfo: Integer;
end;
type
PKeyHookStruct=^TKeyHookStruct;
TKeyHookStruct=record
vkCode: Integer;
ScanCode: Integer;
Flags: Integer;
Time: Integer;
dwExtraInfo: Integer;
end;
// 훅 핸들
var
HookID: HHOOK;
HookID: HHOOK;
// 키 입력 필터링 함수 - 아래의 예는 Ctrl+ESC, Window Key, Alt+tab, Alt+ESC 를 씹어먹는다.
////////////////////////////////////////////////////////////////////////////////
function LLKeyHookFunc(HookCode: Integer; KeyCode: wParam; kStrokeInfo: lParam): LResult; stdcall;
var PKeyHook: PKeyHookStruct;
begin
// 키 정보 받아오기
PKeyHook:=Ptr(kStrokeInfo);
////////////////////////////////////////////////////////////////////////////////
function LLKeyHookFunc(HookCode: Integer; KeyCode: wParam; kStrokeInfo: lParam): LResult; stdcall;
var PKeyHook: PKeyHookStruct;
begin
// 키 정보 받아오기
PKeyHook:=Ptr(kStrokeInfo);
Result:=0;
// 각종 키 입력검사
if HookCode>=0 then begin
// CTRL + ESC
if ((PKeyHook.vkCode=VK_ESCAPE) and (GetAsyncKeyState(VK_CONTROL)<-32766)) then Result:=1
// Window Key
else if ((PKeyHook.vkCode=VK_LWIN) or (PKeyHook.vkCode=VK_RWIN)) then Result:=1
// ALT + TAB
else if ((pKeyHook.vkCode=VK_TAB) and (GetAsyncKeyState(VK_LMENU)<-32766)) then Result:=1
// ALT + ESC
else if ((PKeyHook.vkCode=VK_ESCAPE) and (GetAsyncKeyState(VK_LMENU)<-32766)) then Result:=1
end;
// 각종 키 입력검사
if HookCode>=0 then begin
// CTRL + ESC
if ((PKeyHook.vkCode=VK_ESCAPE) and (GetAsyncKeyState(VK_CONTROL)<-32766)) then Result:=1
// Window Key
else if ((PKeyHook.vkCode=VK_LWIN) or (PKeyHook.vkCode=VK_RWIN)) then Result:=1
// ALT + TAB
else if ((pKeyHook.vkCode=VK_TAB) and (GetAsyncKeyState(VK_LMENU)<-32766)) then Result:=1
// ALT + ESC
else if ((PKeyHook.vkCode=VK_ESCAPE) and (GetAsyncKeyState(VK_LMENU)<-32766)) then Result:=1
end;
// 필터링 된 키가 아니라면 계속 진행
if (Result=0) then Result:=CallNextHookEx(HookID, HookCode, KeyCode, kStrokeInfo);
end;
if (Result=0) then Result:=CallNextHookEx(HookID, HookCode, KeyCode, kStrokeInfo);
end;
// 훅을 거는 함수
////////////////////////////////////////////////////////////////////////////////
procedure LockSystem;
const WH_KEYBOARD_LL=13;
begin
HookID:=SetWindowsHookEx(WH_KEYBOARD_LL, @LLKeyHookFunc, hInstance, 0);
end;
////////////////////////////////////////////////////////////////////////////////
procedure LockSystem;
const WH_KEYBOARD_LL=13;
begin
HookID:=SetWindowsHookEx(WH_KEYBOARD_LL, @LLKeyHookFunc, hInstance, 0);
end;
'Delphi' 카테고리의 다른 글
[Delphi] Indy10 - TIdTCPServer 를 이용해 원하는 클라이언트에 원하는 타이밍에 Send 하기 (0) | 2009.04.18 |
---|---|
[Delphi] Indy10 을 이용한 Stream 전송 (TCP/IP) (0) | 2009.04.18 |
자신의 ip 알아내기 (0) | 2009.04.18 |
[Delphi] 문자열 반복처리시 성능향상법 (0) | 2009.04.18 |
BDS에서 고정폭 글꼴 사용하기 (0) | 2009.04.18 |