C++中PostMessage和SendMessage函数的用途、区别、使用方法及使用示例

在C++的Windows编程中,PostMessageSendMessage是用于进程间通信(IPC)的重要函数,特别是在同一应用程序的不同部分或不同应用程序之间发送消息时。这两个函数都用于向窗口发送消息,但它们在发送方式和行为上有所不同。

PostMessage

PostMessage函数将消息放入指定窗口的消息队列中,并立即返回。它不会等待消息被处理就继续执行。这是异步操作,发送消息的线程不会被阻塞。

用途
  • 当你不关心消息何时被处理,或者不想发送消息的线程被阻塞时。
  • 当消息处理可以稍后进行,不需要立即结果时。
使用方法
BOOL PostMessage(
  HWND   hWnd,       // 窗口句柄
  UINT   Msg,        // 消息标识符
  WPARAM wParam,     // 附加的消息信息
  LPARAM lParam      // 附加的消息信息
);
使用示例
HWND hwnd = /* 获取目标窗口句柄 */;
PostMessage(hwnd, WM_COMMAND, (WPARAM)ID_MYCOMMAND, 0);

SendMessage

SendMessage函数向指定的窗口发送消息,并等待窗口处理完该消息后才返回。这是同步操作,发送消息的线程会被阻塞,直到接收窗口处理完消息为止。

用途
  • 当你需要确保消息被处理,并获取处理结果时。
  • 当消息需要立即处理,并且发送线程需要等待其完成时。
使用方法
LRESULT SendMessage(
  HWND   hWnd,       // 窗口句柄
  UINT   Msg,        // 消息标识符
  WPARAM wParam,     // 附加的消息信息
  LPARAM lParam      // 附加的消息信息
);
使用示例
HWND hwnd = /* 获取目标窗口句柄 */;
LRESULT result = SendMessage(hwnd, WM_GETTEXT, (WPARAM)bufferSize, (LPARAM)buffer);

区别

  • 同步与异步SendMessage是同步的,它会阻塞发送消息的线程直到消息被处理;PostMessage是异步的,它立即返回,不会等待消息被处理。
  • 返回值SendMessage返回消息处理的结果;PostMessage返回一个布尔值,表示消息是否成功放入队列。
  • 性能影响SendMessage可能导致发送线程阻塞,从而影响性能;PostMessage不会阻塞发送线程,性能影响较小。

综合示例

下面是一个简单的示例,演示了如何使用PostMessageSendMessage

#include <Windows.h>

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
    switch (uMsg) {
        case WM_USER: {
            // 处理自定义消息
            char* text = (char*)lParam;
            MessageBox(hwnd, text, "Custom Message", MB_OK);
            break;
        }
        case WM_CLOSE:
            DestroyWindow(hwnd);
            break;
        default:
            return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }
    return 0;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
    const char CLASS_NAME[] = "Sample Window Class";
    WNDCLASS wc = { };

    wc.lpfnWndProc = WindowProc;
    wc.hInstance = hInstance;
    wc.lpszClassName = CLASS_NAME;

    if (!RegisterClass(&wc)) {
        MessageBox(NULL, "Window Registration Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK);
        return 0;
    }

    HWND hwnd = CreateWindowEx(0, CLASS_NAME, "Sample Window", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 240, 120, NULL, NULL, hInstance, NULL);
    if (hwnd == NULL) {
        MessageBox(NULL, "Window Creation Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK);
        return 0;
    }

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    // 使用 PostMessage 发送自定义消息
    char* customMessage = "Hello from PostMessage!";
    PostMessage(hwnd, WM_USER, 0, (LPARAM)customMessage);

    // 使用 SendMessage 设置窗口文本(假设有相应的处理逻辑)
    SendMessage(hwnd, WM_SETTEXT,  0, (LPARAM)customMessage);

相关推荐

  1. C++max函数使用示例

    2024-03-14 21:44:02       54 阅读
  2. DELETE、TRUNCATE DROP 在MySQL区别使用示例

    2024-03-14 21:44:02       39 阅读
  3. MFCCString用法使用示例

    2024-03-14 21:44:02       39 阅读
  4. C/C++ 引用指针区别使用场景

    2024-03-14 21:44:02       32 阅读
  5. Hive窗口函数使用示例

    2024-03-14 21:44:02       45 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-14 21:44:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-14 21:44:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-14 21:44:02       82 阅读
  4. Python语言-面向对象

    2024-03-14 21:44:02       91 阅读

热门阅读

  1. 算法--每日一练

    2024-03-14 21:44:02       43 阅读
  2. GSAP动画学习

    2024-03-14 21:44:02       38 阅读
  3. vue+vite根据版本号清空用户浏览器缓存

    2024-03-14 21:44:02       39 阅读
  4. 为HTTP的2024端口设置重定向

    2024-03-14 21:44:02       38 阅读
  5. leetcode热题HOT 240. 搜索二维矩阵 II

    2024-03-14 21:44:02       41 阅读
  6. [Vue] 自定义命令

    2024-03-14 21:44:02       37 阅读
  7. C++ const关键字

    2024-03-14 21:44:02       39 阅读