이전글 ( 키보드 후킹하기 )에서 이어 집니다.

키보드 후킹에 이어 마우스 후킹입니다.
마우스 후킹은 키보드 후킹이랑 같습니다. 단지 훅을 설치할때  WH_KEYBOARD_LL대신 WH_MOUSE_LL를 사용해야 한다는 것 외에는 별다를 것이 없습니다.

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

마우스를 후킹하여 좌표를 얻어오는건 그다지 어려운 일이 아니다. 마우스의 위치를 알려주는 API가 있기 때문입니다.

void ShowMouse(HDC hdc)
{
	TCHAR strM[256];

	POINT pos;
	GetCursorPos(&pos);//마우스 좌표를 알려주는 API
	wsprintf(strM, L"X : %6d, Y : %6d", pos.x, pos.y);
}


문제는 이것을 실시간으로 좌표를 출력해주는 것이 힘든 것이저 ㅡ,.ㅡ;

위 함수를 만들고 메시지프록( WndProc, MsgProc 등등) 에서 case WM_PAINT:놈을 찾아 위함수를 넣고 마우스 후킹코드에 PostMessage( NULL, WM_PAINT, NULL, NULL); 를 넣고 실행해봅시다.

중단점을 잡아보면 알겠지만 후킹까지만 오고 WM_PAINT까지는 오지 않습니다.
당연하지만 WM_PAINT가 호출된 윈도우를 NULL로 잡았으니까 그렇저 ㅎㅎㅎ

메시지프록( WndProc, MsgProc 등등)의 시작부분에서 HWND를 받아서 전역변수에 저장하고
HWND hwndWnd;

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	int wmId, wmEvent;
	PAINTSTRUCT ps;
	HDC hdc; 

	hwndWnd = hWnd;

	...
	...
	...
}


코드를 PostMessage( hwndWnd, WM_PAINT, NULL, NULL); 이렇게 수정합시다.
WM_PAINT까지 넘어가고 마우스 ShowMouse()도 동작하지만 화면은 변하지 않습니다.
헐키.... 화면크기를 조정하거나 최소화 하거나 해야 값이 변하는걸 알수 있습니다.

이것은 WM_PAINT가 호출될때는 화면 전체를 다시 그리는 것이 아니고 무효화영역(다시 그려야 할 필요성이 있는 영역을 말한다.)만 다시 그리기 때문에 발생하는 현상입니다. 이 무효화영역을 우리가 좌표를 출력할 곳으로 설정해야 제대로 동작할수 있다는 것을 느낄수 있을 것입니다. 그 무효와 영역을 만들어주는 함수가 InvalidateRect입니다.

이제 후킹 코드에 InvalidateRect(hwndWnd, NULL, true); 이렇게 넣고 PostMessage는 지워줍니다. ( InvalidateRect가 호출되면 WM_PAINT가 호출 되므로 따로 호출할 필요가 없습니다.)

동작 시켜보면 이제는 창과 관계없이 좌표가 출력되는걸 볼수 있습니다.



댓글 작성

이름
패스워드
홈페이지
비밀글

티스토리 툴바