MFC中PeekMessage与GetMessage的区别

一、PeekMessage与GetMessage

`PeekMessage`函数可以从消息队列中获取消息,但是不会将该消息从队列中移除,可以理解为偷窥消息。该函数的原型如下:


BOOL PeekMessage(
  LPMSG lpMsg,
  HWND  hWnd,
  UINT  wMsgFilterMin,
  UINT  wMsgFilterMax,
  UINT  wRemoveMsg
);

GetMessage`函数会将获取的消息从队列中移除。该函数的原型如下:

BOOL GetMessage(
  LPMSG lpMsg,
  HWND  hWnd,
  UINT  wMsgFilterMin,
  UINT  wMsgFilterMax
);

 二、区别

  1. 消息处理方式:

    • PeekMessage:这个函数用于检查消息队列中是否有消息等待处理。如果有消息,它会将消息复制到指定的消息结构体,但不会将消息从队列中移除。这意着 PeekMessage 不会阻塞程序执行,它会立即返回,无论是否有消息。
    • GetMessage:与 PeekMessage 不同,GetMessage 会将消息从队列中移除并将其复制到指定的消息结构体中。如果队列中没有消息,GetMessage 会阻塞程序的执行,直到有消息到达为止。
  2. 适用场景:

    • PeekMessage:通常用于多线程应用程序或需要非阻塞方式处理消息的情况,例如游戏循环中的消息处理。它允许程序继续执行其他任务而不必等待消息。
    • GetMessage:通常用于传统的 Windows 应用程序,如窗口应用程序。它会等待消息到达,因此适用于需要响应用户输入的情况。
  3. 消息处理的方式:

    • PeekMessage:可以使用 PM_REMOVE 标志来指示是否从队列中移除消息。如果指定了 PM_REMOVE,则消息将被移除,否则不会。这意味着你可以选择是只查看消息还是查看并处理消息。
    • GetMessage:无论如何,消息都会被移除并返回。

三、实例

下面是一个简单的示例代码,展示了如何使用`PeekMessage`函数和`GetMessage`函数:

HWND hWnd;  // 窗口句柄

MSG msg;
while (PeekMessage(&msg, hWnd, 0, 0, PM_REMOVE)) {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}

while (GetMessage(&msg, hWnd, 0, 0)) {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}

在以上示例中,调用`PeekMessage`函数和`GetMessage`函数来获取并处理消息。`TranslateMessage`函数用于翻译键盘消息,`DispatchMessage`函数用于分发消息给窗口过程进行处理

参考:

https://www.cnblogs.com/simonryan/p/3936447.html

PeekMessage和GetMessage函数的主要区别_gencheng的博客-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值