以最简单的p先生写的hello win98为例,要实现效果是鼠标右键点击客户区之前首先弹出一个消息框(钩子先处理消息,不传递下去),点击空格键之前首先弹出一个消息框,然后再鼠标位置写文本
/*------------------------------------------------------------ HELLOWIN.C -- Displays "Hello, Windows 98!" in client area (c) Charles Petzold, 1998 ------------------------------------------------------------*/ #include <windows.h> LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; //回调函数声明,为了尽早见到亲切的主函数,将回调函数的定义写在最后面 LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam); LRESULT CALLBACK MouseProc(int code, WPARAM wParam, LPARAM lParam); HWND hwnd ; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT ("HelloWin") ; MSG msg ; WNDCLASS wndclass ; wndclass.style = CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc = WndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclass.hInstance = hInstance ; wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ; wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ; wndclass.lpszMenuName = NULL ; wndclass.lpszClassName = szAppName ; if (!RegisterClass (&wndclass)) { MessageBox (NULL, TEXT ("This program requires Windows NT!"), szAppName, MB_ICONERROR) ; return 0 ; } hwnd = CreateWindow (szAppName, // window class name TEXT ("The Hello Program"), // window caption WS_OVERLAPPEDWINDOW, // window style CW_USEDEFAULT, // initial x position CW_USEDEFAULT, // initial y position CW_USEDEFAULT, // initial x size CW_USEDEFAULT, // initial y size NULL, // parent window handle NULL, // window menu handle hInstance, // program instance handle NULL) ; // creation parameters ShowWindow (hwnd, iCmdShow) ; UpdateWindow (hwnd) ; while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg) ; DispatchMessage (&msg) ; } return msg.wParam ; } HHOOK mouseHook; //接收由SetWindowsHookEx返回的旧的钩子 HHOOK keyboardHook; //接收由SetWindowsHookEx返回的旧的钩子 LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc ; PAINTSTRUCT ps ; RECT rect ; POINT point; int x, y; switch (message) { case WM_CREATE: //PlaySound (TEXT ("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC) ; //安装钩子 mouseHook = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)&KeyboardProc, //回调函数地址 NULL, GetCurrentThreadId()); keyboardHook = SetWindowsHookEx(WH_MOUSE, (HOOKPROC)&MouseProc, //回调函数地址 NULL, GetCurrentThreadId()); return 0 ; case WM_KEYDOWN: hdc = GetDC(hwnd); GetCursorPos(&point); // 获取鼠标指针位置(屏幕坐标) ScreenToClient(hwnd, &point); // 将鼠标指针位置转换为窗口坐标 switch(wParam) { case VK_SPACE: TextOut (hdc, point.x, point.y, TEXT("hello left!"), 12); } ReleaseDC(hwnd, hdc); return 0; case WM_RBUTTONDOWN: hdc = GetDC(hwnd); x = LOWORD(lParam); y = HIWORD(lParam); TextOut (hdc, x, y, TEXT("hello right!"), 12); ReleaseDC(hwnd, hdc); return 0; case WM_PAINT: hdc = BeginPaint (hwnd, &ps) ; GetClientRect (hwnd, &rect) ; DrawText (hdc, TEXT ("Hello, Windows 98!"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER) ; EndPaint (hwnd, &ps) ; return 0 ; case WM_DESTROY: UnhookWindowsHookEx (mouseHook); UnhookWindowsHookEx (keyboardHook); PostQuitMessage (0) ; return 0 ; } return DefWindowProc (hwnd, message, wParam, lParam) ; } //回调函数,用于处理截获的按键消息 LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam) { if(wParam == VK_SPACE) { MessageBox(hwnd,TEXT("aaa"), TEXT("bbb"), MB_OK); //输出消息框 return CallNextHookEx(mouseHook,code,wParam,lParam); //将消息还给钩子链,不要影响别人 //return 1; }else { return CallNextHookEx(keyboardHook,code,wParam,lParam); //将消息还给钩子链,不要影响别人 } } //回调函数,用于处理截获的按键消息 LRESULT CALLBACK MouseProc(int code, WPARAM wParam, LPARAM lParam) { if(wParam == WM_RBUTTONDOWN) { MessageBox(hwnd,TEXT("aaa"), TEXT("bbb"), MB_OK); return 1; }else { return CallNextHookEx(mouseHook,code,wParam,lParam); //将消息还给钩子链,不要影响别人 } }