新建win32 dynamic link library HookDll,有两个文件.c和.def
HookDll.c
#include <windows.h> HHOOK mouseHook; //接收由SetWindowsHookEx返回的旧的钩子 HINSTANCE hmod; BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { hmod = hinstDLL; return TRUE; } //回调函数,用于处理截获的按键消息 LRESULT CALLBACK MouseProc(int code, WPARAM wParam, LPARAM lParam) { if(wParam == WM_RBUTTONDOWN) { MessageBox(NULL,TEXT("aaa"), TEXT("bbb"), MB_OK); //输出按键信息,注意这里按下和弹起都会输出 return 1; }else{ return CallNextHookEx(mouseHook,code,wParam,lParam); //将消息还给钩子链,不要影响别人 } } void SetHook() { //安装钩子 mouseHook = SetWindowsHookEx(WH_MOUSE, (HOOKPROC)&MouseProc, //回调函数地址 hmod, 0); } void UnLockHook() { UnhookWindowsHookEx (mouseHook); }
HookDll.def
LIBRARY HookDll EXPORTS SetHook @1 UnLockHook @2
加入.def文件即可生成.lib(或者在函数前加extern "C"),表示以C的方式编译导出
在P先生的Hello win98 基础上加入钩子
/*------------------------------------------------------------ HELLOWIN.C -- Displays "Hello, Windows 98!" in client area (c) Charles Petzold, 1998 ------------------------------------------------------------*/ #include <windows.h> #pragma comment(lib,"HookDll"); _declspec(dllimport) void SetHook(); _declspec(dllimport) void UnLockHook(); LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, 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 ; } 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) ; //安装钩子 SetHook(); 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: UnLockHook(); PostQuitMessage (0) ; return 0 ; } return DefWindowProc (hwnd, message, wParam, lParam) ; }
不知道为什么,鼠标右键点击一次,会产生很多的消息窗口??