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;
}
}