Win32编程之全局钩子(十七)
一、动态链接库
库头文件:
1 2 3 4 5 6 7 8 | #pragma once #include <Windows.h> extern "C" { __declspec ( dllexport ) void __stdcall SetHookVal( HHOOK hookVal); __declspec ( dllexport ) LRESULT CALLBACK MouseProc( int code, WPARAM wParam, LPARAM lParam); } |
库源文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | #include "HookMsg.h" #include <Windows.h> /* 共享数据段 */ #pragma data_seg("shared") HHOOK g_hHook = 0; #pragma data_seg() #pragma comment(linker, "/section:shared,rws") BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: OutputDebugString(TEXT( "HookMsg DLL_PROCESS_ATTACH" )); break ; case DLL_THREAD_ATTACH: OutputDebugString(TEXT( "HookMsg DLL_THREAD_ATTACH" )); break ; case DLL_THREAD_DETACH: OutputDebugString(TEXT( "HookMsg DLL_THREAD_DETACH" )); break ; case DLL_PROCESS_DETACH: OutputDebugString(TEXT( "HookMsg DLL_PROCESS_DETACH" )); break ; } return TRUE; } void __stdcall SetHookVal( HHOOK hookVal) { g_hHook = hookVal; } LRESULT CALLBACK MouseProc( int code, WPARAM wParam, LPARAM lParam) { if (code < 0) { return CallNextHookEx(g_hHook, code, wParam, lParam); } switch (wParam) { case WM_LBUTTONDOWN: { OutputDebugString(TEXT( "HookMsg MouseProc WM_LBUTTONDOWN" )); PMOUSEHOOKSTRUCT pInfo = (PMOUSEHOOKSTRUCT)lParam; WCHAR buff[30] = { 0 }; wsprintf(buff, TEXT( "HookMsg (%d, %d)" ), pInfo->pt.x, pInfo->pt.y); OutputDebugString(buff); } default : break ; } return CallNextHookEx(g_hHook, code, wParam, lParam); } |
二、全局钩子调用
1 2 3 4 5 6 7 8 9 10 11 12 13 | typedef LRESULT (CALLBACK *MOUSE_PROC) ( int code, WPARAM wParam, LPARAM lParam); typedef void (WINAPI *HOOK_VAL) ( HHOOK hookVal); void SetWinHook() { OutputDebugString(TEXT( "hookApp Load Library" )); g_hModule = LoadLibrary(TEXT( "HookMsg.dll" )); if (g_hModule != NULL) { MOUSE_PROC pMouse = (MOUSE_PROC)GetProcAddress(g_hModule, "MouseProc" ); HOOK_VAL pSetHook = (HOOK_VAL)GetProcAddress(g_hModule, "SetHookVal" ); HHOOK hHook = SetWindowsHookEx(WH_MOUSE, pMouse, ( HINSTANCE )g_hModule, 0); pSetHook(hHook); } } |
三、挂钩指定线程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | HHOOK g_hHook = 0; HMODULE g_hModule = NULL; typedef LRESULT (CALLBACK* MOUSE_PROC) ( int code, WPARAM wParam, LPARAM lParam); typedef void (WINAPI* HOOK_VAL) ( HHOOK hookVal); DWORD GetMainThreadIdFormName( const WCHAR * szName) { DWORD idThread = 0; //主线程ID DWORD idProcess = 0; //进程ID PROCESSENTRY32 pe; //进程信息 pe.dwSize = sizeof (PROCESSENTRY32); HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); //获取系统进程列表快照 if (Process32First(hSnapshot, &pe)) { //返回系统中第一个进程的信息 do { if (_wcsicmp(pe.szExeFile, szName) == 0) { idProcess = pe.th32ProcessID; break ; } } while (Process32Next(hSnapshot, &pe)); //下一个进程 } CloseHandle(hSnapshot); //删除快照 if (idProcess == 0) { return 0; } //获取进程的主线程ID THREADENTRY32 te; te.dwSize = sizeof (THREADENTRY32); hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0); //系统所有线程快照 if (Thread32First(hSnapshot, &te)) { //第一个线程 do { if (idProcess == te.th32OwnerProcessID) { idThread = te.th32ThreadID; break ; } } while (Thread32Next(hSnapshot, &te)); //下一个线程 } CloseHandle(hSnapshot); //删除快照 return idThread; } LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_CREATE: { OutputDebugString(TEXT( "hookApp Load Library" )); //获取指定进程的主线程ID DWORD ulThreadId = GetMainThreadIdFormName(TEXT( "notepad.exe" )); g_hModule = LoadLibrary(TEXT( "HookMsg.dll" )); if (g_hModule != NULL) { MOUSE_PROC pMouse = (MOUSE_PROC)GetProcAddress(g_hModule, "MouseProc" ); HOOK_VAL pSetHook = (HOOK_VAL)GetProcAddress(g_hModule, "SetHookVal" ); HHOOK hHook = SetWindowsHookEx(WH_MOUSE, pMouse, ( HINSTANCE )g_hModule, ulThreadId); pSetHook(hHook); } break ; } case WM_DESTROY: { if (g_hHook != 0) { UnhookWindowsHookEx(g_hHook); FreeLibrary(g_hModule); } PostQuitMessage(0); break ; } default : return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } |
分类:
Windows核心编程
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?