Chrome与Windows UI通信

tech2025-08-15  12

Chrome与Windows UI通信

查看网上有较多的进程间通信处理,这里使用两种方式进行处理 1,MappingFile的处理 这种方式存在一个不足是进程间更新无法实时 传递的结构体

struct ShareMappingInfo { int uiHandle; int chromeHandle; int other; };

进程1创建mapping

static void CreateMappingFile(HWND hWnd) { HANDLE hMySharedMapFile = CreateFileMapping((HANDLE)0xFFFFFFFF, NULL, PAGE_READWRITE, 0, sizeof(ShareMappingInfo), L"ShareMemWithChrome"); LPSTR pszMySharedMapView = (LPSTR)MapViewOfFile(hMySharedMapFile, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0); ShareMappingInfo data = { (int)hWnd,100,50 }; if (0 > memcpy_s(pszMySharedMapView, sizeof(ShareMappingInfo), &data, sizeof(ShareMappingInfo))) { printf("mapping file error"); } }

进程2读取

static void GetMappingFileData() { HANDLE hMySharedMapFileRcv = OpenFileMapping(FILE_MAP_READ | FILE_MAP_WRITE, FALSE, L"ShareMemWithChrome"); if (hMySharedMapFileRcv) { LPTSTR lpMapAddr = (LPTSTR)MapViewOfFile(hMySharedMapFileRcv, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0); ShareMappingInfo result; memcpy_s(&result, sizeof(ShareMappingInfo), lpMapAddr, sizeof(ShareMappingInfo)); printf("get mapping file data: uiHandle=%d,%d,%d\n", result.uiHandle, result.chromeHandle, result.other); if (!UnmapViewOfFile(lpMapAddr)) { printf("could not unmap view of file\n"); } } }

2, SendMessage/PostMessage 发送端chrome 通过FindWindow查询到对应windowsUI的句柄,使用句柄使用SendMessage/PostMessage进行发送 chrome:

#define UI_CHROME 2000 // 自定义消息ID,需与UI保持一致 HWND hd = FindWindow(L"Windows_UI_Name", L"Windows_UI_Name"); if (hd) { PostMessage(hd, WM_COMMAND, UI_CHROME , 10); // 或者 SendMessage(hd, WM_COMMAND, UI_CHROME , 10); // 两者差异在意post将消息放入处理队列后立即返回进行其他处理,send需要等待返回 }

UI: UI对应有自己的消息处理函数WndProc

static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_COMMAND:{ int wmId = LOWORD(wParam); switch (wmId) { case UI_CHROME : { cout << "Handle the message:" <<(int)lParam<< endl; // 输出应该是10 break; } } } } }
最新回复(0)