消息通信-发送端

    1. #include <windows.h>
    2. // 定义一个枚举说明消息的类型,需要和 _COPYDATA 一起使用
    3. enum MessageType
    4. {
    5. msg_login,
    6. msg_send
    7. };
    8. typedef struct _COPYDATA
    9. {
    10. union {
    11. // 如果当前是登录请求,使用下面的结构
    12. struct {
    13. char username[0x100];
    14. char password[0x100];
    15. } login;
    16. // 如果是给某个人发消息,使用下面的结构体
    17. struct {
    18. char to[0x100];
    19. char message[0x100];
    20. } send;
    21. };
    22. } COPYDATA, *PCOPYDATA;
    23. int main()
    24. {
    25. // 作为发送端,只要能够使用 Send/PostMessage 进行消息的发送就可以了,可以不是 GUI 程序
    26. HWND hWnd = FindWindow(NULL, L"我的窗口");
    27. // 创建一个结构体保存用户的登录信息
    28. COPYDATA Login{ "xiaoming", "password" };
    29. COPYDATASTRUCT CopyData{};
    30. CopyData.dwData = msg_login; // 需要传递的第一个成员,通常用于指定消息的类型
    31. CopyData.cbData = sizeof(COPYDATA); // 需要发送的数据(主要指 lpData 指针指向的)的长度
    32. CopyData.lpData = &Login; // 需要发送的内容,通常是一个指向结构体的指针
    33. // 通过 MSDN 查找到 WM_COPYDATA 的两个附加参数分别为:
    34. // wParam: 用于设置发送端窗口的句柄,如果接收端没有用到,可以不给,通常用于接收端回信息
    35. // lParam: 一个指针,指向 COPYDATASTRUCT 结构体,保存了需要发送的内容
    36. SendMessage(hWnd, WM_COPYDATA, NULL, (LPARAM)&CopyData);
    37. // 创建一个结构体保存用户的发送信息
    38. COPYDATA Send{ "xiaohong", "你好吗" };
    39. CopyData.dwData = msg_send; // 需要传递的第一个成员,通常用于指定消息的类型
    40. CopyData.lpData = &Send; // 需要发送的内容,通常是一个指向结构体的指针
    41. // 通过 MSDN 查找到 WM_COPYDATA 的两个附加参数分别为:
    42. // wParam: 用于设置发送端窗口的句柄,如果接收端没有用到,可以不给,通常用于接收端回信息
    43. // lParam: 一个指针,指向 COPYDATASTRUCT 结构体,保存了需要发送的内容
    44. SendMessage(hWnd, WM_COPYDATA, NULL, (LPARAM)&CopyData);
    45. return 0;
    46. }

    消息通信-接收端

    #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;
    }