消息通信-发送端
#include <windows.h>
// 定义一个枚举说明消息的类型,需要和 _COPYDATA 一起使用
enum MessageType
{
msg_login,
msg_send
};
typedef struct _COPYDATA
{
union {
// 如果当前是登录请求,使用下面的结构
struct {
char username[0x100];
char password[0x100];
} login;
// 如果是给某个人发消息,使用下面的结构体
struct {
char to[0x100];
char message[0x100];
} send;
};
} COPYDATA, *PCOPYDATA;
int main()
{
// 作为发送端,只要能够使用 Send/PostMessage 进行消息的发送就可以了,可以不是 GUI 程序
HWND hWnd = FindWindow(NULL, L"我的窗口");
// 创建一个结构体保存用户的登录信息
COPYDATA Login{ "xiaoming", "password" };
COPYDATASTRUCT CopyData{};
CopyData.dwData = msg_login; // 需要传递的第一个成员,通常用于指定消息的类型
CopyData.cbData = sizeof(COPYDATA); // 需要发送的数据(主要指 lpData 指针指向的)的长度
CopyData.lpData = &Login; // 需要发送的内容,通常是一个指向结构体的指针
// 通过 MSDN 查找到 WM_COPYDATA 的两个附加参数分别为:
// wParam: 用于设置发送端窗口的句柄,如果接收端没有用到,可以不给,通常用于接收端回信息
// lParam: 一个指针,指向 COPYDATASTRUCT 结构体,保存了需要发送的内容
SendMessage(hWnd, WM_COPYDATA, NULL, (LPARAM)&CopyData);
// 创建一个结构体保存用户的发送信息
COPYDATA Send{ "xiaohong", "你好吗" };
CopyData.dwData = msg_send; // 需要传递的第一个成员,通常用于指定消息的类型
CopyData.lpData = &Send; // 需要发送的内容,通常是一个指向结构体的指针
// 通过 MSDN 查找到 WM_COPYDATA 的两个附加参数分别为:
// wParam: 用于设置发送端窗口的句柄,如果接收端没有用到,可以不给,通常用于接收端回信息
// lParam: 一个指针,指向 COPYDATASTRUCT 结构体,保存了需要发送的内容
SendMessage(hWnd, WM_COPYDATA, NULL, (LPARAM)&CopyData);
return 0;
}
消息通信-接收端
#include <windows.h>
#include "resource.h"
// 定义一个枚举说明消息的类型,需要和 _COPYDATA 一起使用
enum MessageType
{
msg_login,
msg_send
};
typedef struct _COPYDATA
{
union {
// 如果当前是登录请求,使用下面的结构
struct {
char username[0x100];
char password[0x100];
} login;
// 如果是给某个人发消息,使用下面的结构体
struct {
char to[0x100];
char message[0x100];
} send;
};
} COPYDATA, * PCOPYDATA;
// 对话框的回调函数,用于处理对话框产生的一系列消息,如果处理了返回 TRUE,否则返回 FALSE
INT_PTR CALLBACK DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_COPYDATA:
{
// 附加参数 1 是句柄,这次没有传递,附加参数 2 是结构体指针,需要用到
auto CopyData = (PCOPYDATASTRUCT)lParam;
// 根据结构体中的消息类型 dwData 使用不同的结构体解析内容
PCOPYDATA Message = (PCOPYDATA)CopyData->lpData;
switch (CopyData->dwData)
{
case msg_login:
{
MessageBoxA(hDlg, Message->login.username , Message->login.password, MB_OK);
break;
}
case msg_send:
{
MessageBoxA(hDlg, Message->send.to, Message->send.message, MB_OK);
break;
}
}
break;
}
case WM_CLOSE:
{
EndDialog(hDlg, 0);
break;
}
default:
{
return FALSE;
}
}
return TRUE;
}
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int CmdShow)
{
DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgProc);
return 0;
}