使用 WM_COPYDATA
客户端(发送端)
// 1. 找到窗口程序 HWND hWnd = FindWindow(NULL, L"Window1"); ? // 2. 构建一个 COPYDATASTRUCT 结构体 COPYDATASTRUCT CopyData = { 0 }; CopyData.dwData = 0x100; // 要传递的一个4字节数据,通常是类型 CopyData.cbData = 0x0A; // 存储数据的缓冲区大小 CopyData.lpData = (LPVOID)"Hello15pb"; // 指向要发送的数据 ? // 3. 发送数据给对象的窗口 SendMessage(hWnd, WM_COPYDATA, NULL, (LPARAM)&CopyData);
服务端(接收端)
// 响应 WM_COPYDATA 消息 case WM_COPYDATA: { // 1. 获取 LPARAM 只想的内容 auto CopyData = (PCOPYDATASTRUCT)lParam; ? // 2. 输出内容 MessageBoxA(hWnd, (LPCSTR)CopyData->lpData, "WM_COPYDATA", MB_OK); ? break; }
使用 邮槽内核对象
客户端(发送端)
// 1. 打开邮槽对象 HANDLE hFile = CreateFile( L"\\\\.\\mailslot\\Sample", // 邮槽名称 GENERIC_WRITE, // 读写属性 FILE_SHARE_READ, // 共享属性 NULL, // 安全属性 OPEN_EXISTING, // 打开方式 FILE_ATTRIBUTE_NORMAL, // 标志位 NULL); // 文件模板(默认留空) ? // 2. 向mailslot写入 DWORD dwWritten = 0; WriteFile(hFile, "Hello", 6, &dwWritten, NULL); ? // 3. 结束 printf("已经向邮槽写入信息!\n"); CloseHandle(hFile);
服务端(接收端)
// 1. 创建邮槽对象 HANDLE hSlot = CreateMailslot( L"\\\\.\\mailslot\\Sample", // 邮槽名 0, // 不限制消息大小 MAILSLOT_WAIT_FOREVER, // 无超时 NULL); // 安全属性 ? // 2. 循环读取邮槽信息 while (true) { // 2.1 获取邮槽消息数量 DWORD dwMsgCount = 0, dwMsgSize = 0; ? // 2.2 获取邮槽信息 GetMailslotInfo( hSlot, // 邮槽句柄 NULL, // 无最大消息限制 &dwMsgSize, // [ 下一条消息的大小 ] &dwMsgCount, // [ 消息的总数量 ] NULL); // 无时限 ? // 2.3 如果没有接收到消息,那么久休眠一阵子 if (dwMsgSize == MAILSLOT_NO_MESSAGE) { Sleep(2000); continue; } ? // 2.4 循环获取全部消息(有可能不只一条) while (dwMsgCount) { DWORD dwRet = 0; PBYTE lpBuffer = new BYTE[dwMsgSize]{ 0 }; ? // 2.5 读取邮槽中的信息 if (!ReadFile(hSlot, lpBuffer, dwMsgSize, &dwRet, NULL)) { printf("ReadFile函数执行失败,错误码:%d.\n", GetLastError()); delete[] lpBuffer; return 0; } printf("邮槽的内容: %s\n", lpBuffer); ? // 2.6 计算剩余的消息数 GetMailslotInfo(hSlot, (LPDWORD)NULL, &dwMsgSize, &dwMsgCount, nullptr); delete[] lpBuffer; } ? }
原文:https://www.cnblogs.com/ltyandy/p/10932778.html