2012-06-13

WH_MOUSE는 글로벌 훅이 불가

마우스 커서가 위치한 창의 Process ID나 Thread ID를 가져오려면 WH_MOUSE를 사용해서 후킹을 해야하는데 잘 동작하지 않아, 검색해봤으나 아무리 찾아도 관련 정보를 찾을 수 없었다.
마우스 후킹된 데이터를 저장하는 스트럭쳐만 MSLLHOOKSTRUCT대신 MOUSEHOOKSTRUCT를 사용하는 소스는 봤는데, 그렇게 하면 그냥 마우스의 x,y 좌표만 얻을 수 있다(POINT pt값).

MOUSEHOOKSTRUCT의 구조( 이걸 사용해봤자.. 메모리에 있는 내용은 MSLLHOOKSTRUCT)
typedef struct tagMOUSEHOOKSTRUCT {
  POINT     pt;
  HWND      hwnd;
  UINT      wHitTestCode;
  ULONG_PTR dwExtraInfo;
} MOUSEHOOKSTRUCT, *PMOUSEHOOKSTRUCT, *LPMOUSEHOOKSTRUCT;

MSLLHOOKSTRUCT의 구조
typedef struct tagMSLLHOOKSTRUCT {
  POINT     pt;
  DWORD     mouseData;
  DWORD     flags;
  DWORD     time;
  ULONG_PTR dwExtraInfo;
} MSLLHOOKSTRUCT, *PMSLLHOOKSTRUCT, *LPMSLLHOOKSTRUCT;



그나마 microsoft의 페이지에서 WH_MOUSE로 후킹하는 자료를 찾았으나, 내용은 아래처럼 글로벌 훅이 지원되지 않는다는 말만 있고, 훅이 글로벌 훅이 아닌 Form1에서만 동작했다.
WH_MOUSE만 글로벌 훅이 안된다고 하면 그러려니 할탠데 글로벌 훅 자체가 안된다고 하니, 다른 방법이 있지 않을까 한다.
WH_MOUSE_LL, WH_KEYBOARD_LL은 글로벌 훅이 동작하니까..



이하 MS의 글로벌 후크가 지원되지 않는 다는 내용.

http://support.microsoft.com/kb/318804/ko

글로벌 후크가 .NET Framework에서 지원되지 않음

Microsoft .NET Framework에서는 글로벌 후크를 구현할 수 없습니다. 글로벌 후크를 설치하려면 일관성 있고 유효한 함수를 호출해야 하는 다른 프로세스에 DLL 자체를 삽입하는 기본 동적 연결 라이브러리(DLL) 내보내기가 후크에 있어야 합니다. 이러한 DLL 내보내기는 .NET Framework에서 지원되지 않습니다. 이러한 함수 포인터는 동적으로 만들어지는 프록시이기 때문에 관리되는 코드에는 함수 포인터에 대해 일관성 있는 값이라는 개념이 없습니다.

댓글 3개: