安装全局钩子程序(鼠标钩子)

来源:互联网 发布:储存卡损坏数据恢复 编辑:程序博客网 时间:2024/05/21 16:23

新建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 HookDllEXPORTSSetHook @1UnLockHook @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 parametersShowWindow (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) ;}

不知道为什么,鼠标右键点击一次,会产生很多的消息窗口??

0 0
原创粉丝点击