windows 提供 SetWindowsHookEx 來對windows 的幾個服務進行hook操作

而Hook的項目被定義在 WinUser.h 如下:

  • WH_JOURNALRECORD  
  • WH_JOURNALPLAYBACK
  • WH_KEYBOARD       
  • WH_GETMESSAGE     
  • WH_CALLWNDPROC    
  • WH_CBT            
  • WH_SYSMSGFILTER   
  • WH_MOUSE
  • WH_KEYBOARD_LL
  • WH_MOUSE_LL          

其中只有WH_MOUSE 和 WH_KEYBOARD 可以直接撰寫EXE進行全域的監聽。

以下針對WH_KEYBOARD的案例進行說明:


以下程式碼為 利用 SetWindowsHookEx 對 鍵盤Hook 操作:

 

_hook[IDX_HOOK_MOUSE] = SetWindowsHookEx(WH_MOUSE_LL, HookMouseProcedure, hInst, HOOK_LISTEN_GLOBAL);
if (!_hook[IDX_HOOK_MOUSE])MessageBox(NULL, "Hook mouse fails.", "Error", MB_OK);

以下為SetWindowsHookEx的函數原型:

 

SetWindowsHookExA(
    _In_ int idHook,
    _In_ HOOKPROC lpfn,
    _In_opt_ HINSTANCE hmod,
    _In_ DWORD dwThreadId);

 

首先SetWindowsHookEx 針對其參數進行說明:

1. 為要進行Hook的項目,以此案例為說明即是 WH_MOUSE_LL

2. Hook 處理函數(Function Point),當觸發Hook的目標事件時會呼叫該函數進行處理

3. hInstance 物件

4. 要Hook的目標 Thread Id ( 若設定為0代表全域Hook )


 

如果是進行 Mouse ,滑鼠的動作被存放在wParam之中,而滑鼠的座標資訊則被儲存在lParam之中

以下程式為HookMouseProcedure的處理函數內容:

 

LRESULT CALLBACK HookMouseProcedure(int nCode, WPARAM wParam, LPARAM lParam){
	LPMSLLHOOKSTRUCT p = (LPMSLLHOOKSTRUCT)lParam;
	POINT   pt = p->pt;
	DWORD   mouseData = p->mouseData;

	const char *info = NULL;
	HDC hdc = NULL;
	char text[100], pData[50], mData[50];

	if (nCode >= 0){
		switch (wParam)
		{
		case WM_MOUSEMOVE:info = "Mouse move.";
			break;
		case WM_LBUTTONDOWN:	info = "left button down.";
			break;
		case WM_LBUTTONUP:		info = "left button up.";
			break;
		case WM_LBUTTONDBLCLK:	info = "left button double click.";
			break;
		case WM_RBUTTONDOWN:	info = "right button down.";
			break;
		case WM_RBUTTONUP:		info = "right button up.";
			break;
		case WM_RBUTTONDBLCLK:	info = "right button double click.";
			break;
		case WM_MBUTTONDOWN:	info = "Wheel button down.";
			break;
		case WM_MBUTTONUP:		info = "Wheel button up.";
			break;
		case WM_MBUTTONDBLCLK:	info = "Wheel button double click.";
			break;
		case WM_MOUSEWHEEL:	info = "Wheel button roll.";
			break;
		default:
			info = "W.O.";
			break;
		}

		ZeroMemory(text, sizeof(text));
		wsprintf(text, "Mouse status¡G%10s,0x%x - X: [%04d], Y: [%04d] ,data = %16u", info, wParam, pt.x, pt.y, mouseData);
		hdc = GetDC(_hWnd);
		TextOut(hdc, 0, 10, text, strlen(text));

		ReleaseDC(_hWnd, hdc);
	}

	return CallNextHookEx(_hook[IDX_HOOK_MOUSE], nCode, wParam, lParam);
}

 

 

完整程式碼 ( 連結 )

arrow
arrow
    文章標籤
    win32 winapi c++ hook
    全站熱搜
    創作者介紹
    創作者 Lung-Yu,Tsai 的頭像
    Lung-Yu,Tsai

    Lung-Yu,Tsai 的部落格

    Lung-Yu,Tsai 發表在 痞客邦 留言(0) 人氣()