저 하늘의 구름처럼~

About Global Mouse Hooking (마우스 전역 후킹) 본문

WIN32 API

About Global Mouse Hooking (마우스 전역 후킹)

강백호v 2009. 1. 25. 08:40

전역 마우스 후킹을 하고자 하면, 후킹 모듈을 dll로 만들어야만 한다. 그리고나서 dll 과 후킹 서버 프로그램이 서로 통신을 하여야 하는데, 이때 SendMessage가 사용 된다. SendMessage로 메시지를 전달하기 위해서는 dll과 후킹 서버 프로그램 간에 서로 통신하기 위한 연결이 필요로 한데,이때 고유한 메시지임을 식별이 필요한데,  이것은 RegisterWindowMessage 라는 함수를 통해 등록이 가능하다.  UINT hooktest = RegisterWindowMessage("Hook_Test"); 와 같이 dll 측에 통신을 위한 메시지 값을 등록 시켜 주어야 한다.
마찬가지로 후킹 프로그램 측에서도 이러한 절차가 필요하게 되는데, UINT LMOUSE_UP_HOOK = ::RegisterWindowMessage(("MOUSE_LBUTTONUP_EVENT"));와 같이 적어 준다음,
메시지를 받아처리 해줄 함수를 afx_msg LRESULT OnMouseLBTUP(WPARAM wParam ,LPARAM lParam); 다음과 같이 헤더 파일에 선언해 준다.  그 다음으로, 메시지 맵에 정의 해준 함수 OnMouseLBTUP(WPARAM wParam ,LPARAM lParam)와 등록된 메시지인 LMOUSE_UP_HOOK를 연결해 주면되는데, 그 구문은 다음과 같다.
ON_REGISTERED_MESSAGE(LMOUSE_UP_HOOK,OnMouseLBTUP)
개략으로 적으로 필요한 기본적인 내용을 알아 보았다. 본 포스트 글에서는 후킹 자체에 대한 설명 보다는, 어떻게 메시지를 등록 시키는가 초점을 맞추어서 설명하고자 한다.
HHOOK hookMouse = NULL;
HWND hwnd;
extern "C" __declspec(dllexport) bool InitializeMouseHook(HWND hWnd)
{
hwnd = hWnd;
hookMouse = SetWindowsHookEx(WH_MOUSE,(HOOKPROC)MouseHookCallback,g_appInstance,0);
}
//전역 마우스 후킹을 설치하기위한 구문이다. SetWindowsHookEx 함수를 통해 훅 프로시저를 생성 가능하게 한다. 첫 번째 인자로, 후킹의 종류가 무엇인지를 정해 주게 된다.두 번째 인자로, 실질적인 기능을 수행하게 될 콜백 함수를 등록해주게 되고, 서 번째 인자에는 dll 의 인스턴스 값을 넘겨주며, 마지막 인자에 0을 넣어 주게 되면, 실행 중인 모든 스레드로 대상을 지정한다는 의미이다.
static LRESULT CALLBACK MouseHookCallback(int code, WPARAM wparam, LPARAM lparam)
{
 if (code >= 0)
UINT msg;
 MOUSEHOOKSTRUCT* pMouse = (MOUSEHOOKSTRUCT*)lparam;
 if(wparam == WM_LBUTTONUP){
    msg = RegisterWindowMessage(("MOUSE_LBUTTONUP_EVENT"));
  }
if (msg != 0)
   SendMessage(hwnd, msg, wparam, MAKELPARAM(pMouse->pt.x, pMouse->pt.y));

}
// 후킹의 콜백함수 부분이다. wparam 에는 마우스 이벤트의 종류가 넘어오게 되고, lparam에는 구체적인 마우스 정보가 MOUSEHOOKSSTRUCT 구조체에 담겨져 넘어 오게 된다.
왼쪽 마우스 업 이벤트가 발생하게 되면, 후킹 모듈간의 통신을 위한 식별자를 RegisterWindowMessage를 통해서 선언 한다.
MAKELPARAM을 통해 마우스 정보를 lparam에 담고난 다음에, SendMessage를 통해 전송을 하게 된다.
extern "C" __declspec(dllexport) void UninitializeMouseHook()
{
 if (hookMouse != NULL)
  UnhookWindowsHookEx(hookMouse);
 hookMouse = NULL;

}

//마우스 후킹을 해제 하기 위한 부분이다.

다음으로, 후킹 서버 쪽 등록 방법이다.
서두에서 언급 하였듯이,UINT LMOUSE_UP_HOOK = ::RegisterWindowMessage(("MOUSE_LBUTTONUP_EVENT"));와 같이 적어 준다음,
메시지를 받아처리 해줄 함수를 afx_msg LRESULT OnMouseLBTUP(WPARAM wParam ,LPARAM lParam); 다음과 같이 헤더 파일에 선언해 준다.  그 다음으로, 메시지 맵에 정의 해준 함수 OnMouseLBTUP(WPARAM wParam ,LPARAM lParam)와 등록된 메시지인 LMOUSE_UP_HOOK를 연결해 주면되는데, 그 구문은 다음과 같다.
ON_REGISTERED_MESSAGE(LMOUSE_UP_HOOK,OnMouseLBTUP)
마지막으로 LRESULT CGlobalMouseTestDlg::OnMouseLBTUP(WPARAM wraram, LPARAM lparam){
       point.x = (int)(short)LOWORD(lparam);
       point.y = (int)(short)HIWORD(lparam);

}
// 연결 해준 함수에서 처리를 하여 주면된다..
마우스 후킹에 관해서... 간략하게 정의 해본다..
부족한점은 다들 이해 부탁함. (--__);;