프로그래밍/C++

[C++ WinAPI] 키보드 후킹

당근천국 2010. 12. 26. 03:13

키보드 후킹이란 말 그대로 키가 눌렸을 때 그 키의 정보를 가지고 오거나 수정 하는 것을 말합니다.

 

연관글 영역

 

 

0. 키보드 후킹을 하자

흔히 해킹기법으로 잘 알려졌지만 쓰기에 따라서 굉장히 유용한 기능(?)이죠.
특정 키를 막거나 키보드 메크로를 만들거나 할 때 많이 사용합니다.

 

 

1. 후킹 시 사용할 함수 작성

먼저 후킹 됐을때 사용할 함수를 정의합니다.

 

'WinAPI'인 'LowLevelKeyboardProc'를 정의하면 됩니다.

(참고 : MS Learn - LowLevelKeyboardProc 함수 )

HHOOK hKeyboardHook;

LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) 

{

    PKBDLLHOOKSTRUCT p; 

    if (nCode == HC_ACTION) 
    {
        p = (PKBDLLHOOKSTRUCT) lParam;

        if (((p->vkCode == VK_LWIN) || (p->vkCode == VK_RWIN)) 
                                                || ( p->flags & LLKHF_ALTDOWN) 
                                                || (p->vkCode == VK_TAB)
           )

            return 1; 

   }

   return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam);
}

1번 줄 : 'HHOOK hKeyboardHook' 설치된 훅의 인스턴스를 저장할 변수입니다.

 

11번 줄: 넘어온 키 정보입니다.

 

이후 코드는 넘어온 키 정보를 사용하는 코드입니다.

 

 

2. 훅(hook) 설치

 

후킹을 하려면 훅을 후킹 할 대상에 연결해야 합니다.

그때 사용하는 함수가 'SetWindowsHookEx'입니다.

hKeyboardHook  = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, hInst, 0); // hook 설치

 

훅을 제거할 때는

UnhookWindowsHookEx(hKeyboardHook); //제거
hKeyboardHook = NULL;

(이 예제코드는 'int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpszCmdParam, int nCmdShow)' 에서 사용할 때의 예제입니다.)

 

 

 

에러 상황

컴파일했는데 'PKBDLLHOOKSTRUCT'를 못 찾는 에러가 난다면

#define _WIN32_WINNT 0x0400

를 추가하여 막을수 있습니다.

 

 

마무리

이 방법으로 Alt + Del + Ctrl 만 빼고 모든 시스템키까지 막을 수 있습니다....

(정작 중요한 건 Alt + Del + Ctrl 데 말입니다-_-;;;)