천객만래 [千客萬來] (It has an interminable succession of visitors)

'SetWindowsHookEx'에 해당되는 글 1건

  1. 2011.07.28 [개발/MFC] 키보드 후킹

[개발/MFC] 키보드 후킹

Hooking 중에서 키보드 후킹에 대해서 구현 방법을 알아보자.


/////////////////////////////////////////////////////////////////
//
// Hooking 전역 키보드 후킹
//
/////////////////////////////////////////////////////////////////

// MFC 다이얼로그 전역키보드 메세지를 가로챈다.

HWND g_hWnd = NULL;
HHOOK g_hHook = NULL;

LRESULT CALLBACK KeyHookProc(int nCode, WPARAM wParam, LPARAM lParam);

BOOL SBLiveDlg::SetHookProc()
{
 if (g_hHook != NULL)
  UnHookProc();
 g_hHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyHookProc, (HINSTANCE)theApp.m_hInstance, NULL);

 return TRUE;
}

void SBLiveDlg:UnHookProc()
{
 if (g_hHook != NULL)
 {  
  UnHookWindowsHookEx(g_hHook);
  g_hHook = NULL;
 }
}

/////////////////////////////////////////////////////////////////
// Hook Procedure
/////////////////////////////////////////////////////////////////
LRESULT CALLBACK KeyHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
 if (nCode >= 0)
 {
  int nVKey = (int)wParam;

  PKBDLLHOOKSTRUCT pHookKey = (PKBDLLHOOKSTRUCT)lParam;

  if (nVKey == WM_KEYDOWN)
  {
   if (pHookKey->vkCode == VK_ESCAPE)
    SendMesage(g_hWnd, (WM_USER+1004), 0, 0);
  }
 }
 // Callnexthookex를 호출해줘야 한다.
 return ::CallNextHookEx(g_hHook, nCode, wParam, lParam);
}

 


 }
}


후킹(Hooking)이란  프로그램의 코드상에서 특정 지점의 메세지나 명령을 가로채서 원하는 작업을 구현하는 기술을 말한다.

지역 후킹(Thread ) : 특정 스레드에서 발생하는 메세지들에서
시스템 후킹(System wide) : 시스템의 모든 스레드에서 발생하는 메세지들에서

위의 소스에서 후킹을 처리하는 중심이 되는 함수는 LRESULT CALLBACK KeyHookProc(...)함수이다.

후킹을 하기 위해서 후킹을 설정하고 해제하는 함수가 있다.
HHOOK SetWindowsHookEx(int idHook, HOOKPROC lpfn, HINSTANCE hMod, DWORD dwThreadId);

int idHook : 후킹 타입으로 WH_KEYBOARD 같은게 있다.
HOOKPROC lpfn : 후킹 프로시저의 주소(함수명)
HINSTANCE hMod : 후킹 프로시저의 인스턴스핸들
DWORD dwThreadId : 후킹 프로시저가 감시할 스레드 ID

후킹 해제
BOOK UnhookWindowsHookEx(HHOOK hhk);


참고로 키보드 후킹시에 nCode값을 살펴보면
바이트 번호    키값        내용

     --------------------------------------------------------------------
             0        Transition Status    Key Down 1
                            Key Up     0
     --------------------------------------------------------------------
             1       Previous Key State 이전에 어떤키가
                               눌려졌는가에대한 값
      --------------------------------------------------------------------
             2       Context Code    Alt키가 눌려지면 1
                                          아니면 0
      --------------------------------------------------------------------
           3-6      Extend Key Flag      확장 키보드에서 키가 눌려지면 1
                                                                                   아니면 0
      --------------------------------------------------------------------
           8-15     OEM Scan Code  키보드 스캔코드
      --------------------------------------------------------------------
          16-31                Repeat Count     키값의 반복횟수



 

Posted by SB패밀리