天天看點

windows hookDemo

windows程式設計視窗建立以及hook(鈎子函數)的簡單使用:

#include<Windows.h>
//winMain:入口函數,HINSTANCE:應用程式執行個體句柄類型

//回調函數
LRESULT CALLBACK  WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

//滑鼠鈎子處理函數
LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam);
//鍵盤鈎子處理函數
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam);

//滑鼠鈎子句柄
HHOOK g_hMouseHook;
//鍵盤鈎子句柄
HHOOK g_hKeyboardHook;

//視窗句柄
HWND g_hWnd;


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, LPSTR lpCmdLine, int nCmdShow) {

	//1,設計視窗類
	TCHAR  szAppClassName[] = TEXT("hookDemo");

	WNDCLASS wc = { 0 };
	wc.cbClsExtra = 0;                  //視窗類的額外空間大小
	wc.cbWndExtra = 0;                 //視窗的額外空間大小
	wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //白色畫刷
	wc.hCursor = LoadCursor(NULL, IDC_ARROW);   //光标句柄
	wc.hIcon = NULL;                    //視窗圖示
	wc.hInstance = hInstance;        //   目前應用程式執行個體句柄
	wc.lpfnWndProc = WindowProc; //視窗處理函數
	wc.lpszClassName = szAppClassName;  //視窗類型名
	wc.lpszMenuName = NULL;
	wc.style = CS_HREDRAW | CS_VREDRAW; //視窗類的風格

   //2,注冊視窗類
	RegisterClass(&wc);

	//3,建立視窗
	g_hWnd = CreateWindow(szAppClassName, TEXT("我隻是win32 hook程式設計的demo"), WS_OVERLAPPEDWINDOW, 400, 200, 800, 600, NULL, NULL, hInstance, NULL);

	//4,顯示視窗
	ShowWindow(g_hWnd, SW_SHOW);

	//5,更新視窗
	UpdateWindow(g_hWnd);

	//6,消息循環,windows應用程式是通過消息機制驅動運作
	MSG msg;
	while (GetMessage(&msg, NULL, 0, 0)) {
		TranslateMessage(&msg);   //将虛拟鍵資訊轉換為字元資訊
		DispatchMessage(&msg); //将消息分發給視窗處理函數
	}


	return 0;

}


LRESULT CALLBACK  WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
	switch (uMsg) {
	case WM_CREATE: //視窗建立消息
 	    g_hMouseHook = SetWindowsHookEx(WH_MOUSE, MouseProc, NULL, GetCurrentThreadId());
		g_hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, NULL, GetCurrentThreadId());
		break;

	case WM_MOUSEMOVE:// 滑鼠移動消息
	{
		 //根據目前滑鼠的位置
		int x = LOWORD(lParam); 
		int y = HIWORD(lParam);
		TCHAR str[255];
		wsprintf(str, L"目前滑鼠坐标(%d,%d)", x, y);
		SetWindowText(hWnd, str);
	}
	break;
	case WM_LBUTTONDOWN: //滑鼠按下消息
		MessageBox(hWnd, L"滑鼠按下", L"提示", MB_OK);
		break;

	case WM_KEYDOWN: //鍵盤按下消息
		MessageBox(hWnd, L"鍵盤按下", L"提示", MB_OK);
		break;
	case WM_CLOSE: //視窗關閉消息
		DestroyWindow(hWnd);
		break;
	case WM_DESTROY: //視窗銷毀消息
		PostQuitMessage(0); //WM_QUIT
		break;
	}



	return DefWindowProc(hWnd, uMsg, wParam, lParam);

}


LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam) {

    // return 1;  //表示對目前消息已經處理了,這樣消息也就不會向下傳遞
	
	return CallNextHookEx(g_hMouseHook, nCode, wParam, lParam);  //放行

}
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) {
	//return 1;//屏蔽所有鍵

	//屏蔽空格鍵
	if (wParam == VK_SPACE) {
		return 1;
	}
	else
		return CallNextHookEx(g_hKeyboardHook, nCode, wParam, lParam);  //其他鍵放行

	if (wParam == VK_F2) {

		//解除安裝所有鈎子
		UnhookWindowsHookEx(g_hMouseHook);
		UnhookWindowsHookEx(g_hKeyboardHook);
		return 1;
   }

}

           

繼續閱讀