日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

进程间通信——自定义消息方式实现(SetWindowsHookEx)

發布時間:2025/3/21 windows 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 进程间通信——自定义消息方式实现(SetWindowsHookEx) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文演示如何使用自定義消息來實現進程間通信。
原理:使用SetWindowsHookEx給目標進程添加一段HOOK程序,用來處理自定義消息,然后用SendMessage向目標進程發送自定義消息,從而實現進程間通信。

項目分為兩部分:設置HOOK的DLL和消息發送程序。

DLL

定義3個函數,分別用于安裝鉤子,卸載鉤子和自定義消息處理函數。其中前兩個函數是導出函數,由消息發送程序調用。
代碼如下:

// dllmain.cpp : 定義 DLL 應用程序的入口點。 #define _CRT_SECURE_NO_WARNINGS #include "framework.h" #include <stdio.h>HHOOK g_HookProc; extern "C" void __declspec(dllexport) SetHook(); // 安裝HOOK extern "C" void __declspec(dllexport) UnHook(); // 卸載HOOK LRESULT CALLBACK MessageHookProc(int nCode, WPARAM wParam, LPARAM lParam); //消息處理函數BOOL APIENTRY DllMain( HMODULE hModule,DWORD ul_reason_for_call,LPVOID lpReserved) {switch (ul_reason_for_call){case DLL_PROCESS_ATTACH:case DLL_THREAD_ATTACH:case DLL_THREAD_DETACH:case DLL_PROCESS_DETACH:break;}return TRUE; }extern "C" void __declspec(dllexport) SetHook() {g_HookProc = SetWindowsHookEx(WH_CALLWNDPROC, MessageHookProc, GetModuleHandle(TEXT("MessageHook.dll")), 0); }extern "C" void __declspec(dllexport) UnHook() {if (NULL != g_HookProc)UnhookWindowsHookEx(g_HookProc); }LRESULT CALLBACK MessageHookProc(int nCode, WPARAM wParam, LPARAM lParam) //我們自己的程序處理 {if (nCode == HC_ACTION){PCWPSTRUCT pcw = (PCWPSTRUCT)lParam;if (pcw->message == WM_USER + 0x1){char szBuf[200] = { 0 };sprintf(szBuf, "wParam: %d\nlParam: %d\nPID: %d\n", pcw->wParam, pcw->lParam,GetCurrentProcessId());MessageBoxA(0, szBuf, "接收到自定義消息", 0);}}return CallNextHookEx(g_HookProc, nCode, wParam, lParam); //繼續調用鉤子過程 }

其中,安裝鉤子和卸載鉤子由消息發送程序調用,自定義消息處理函數則被目標程序加載后,在目標程序的4GB地址空間內執行,在該函數內獲取當前進程id,會發現是目標程序的pid。

消息發送程序

這個程序的工作是設置全局鉤子,然后向目標程序發送消息,消息自動轉交給自定義消息處理函數MessageHookProc處理。
代碼如下:

#include <Windows.h> #include <stdio.h>BOOL Inject() {// 安裝HOOKHMODULE hModule = LoadLibrary(TEXT("MessageHook.dll"));if (hModule == NULL){printf("LoadLibrary失敗\n");return FALSE;}typedef void(*PFNSETHOOK)();PFNSETHOOK pFnSetHook = (PFNSETHOOK)GetProcAddress(hModule, "SetHook");if (NULL == pFnSetHook){printf("獲取函數地址失敗\n");return FALSE;}pFnSetHook();// 發送自定義消息HWND hWnd = FindWindow(NULL, TEXT("掃雷"));if (!hWnd){printf("獲取窗口句柄失敗\n");return FALSE;}SendMessage(hWnd, WM_USER + 0x1, (DWORD)100, (DWORD)200);return TRUE; }int main() {Inject();return 0; }

運行結果:

通過運行結果可以看到,自定義消息已經發送給了掃雷進程,并且由MessageHookProc處理,打印了兩個參數和掃雷的PID,另外,可以借助工具查看,我們的DLL已經注入到了掃雷進程中。

總結

以上是生活随笔為你收集整理的进程间通信——自定义消息方式实现(SetWindowsHookEx)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。