GetMessage和PeekMessage的区别


 
在Win32中使用GetMessage和PeekMessage都可以获取对应该程序产生的消息。
他们有什么区别呢?
GetMessage的一般用法是GetMessage(&msg,NULL,0,0);
这样可以接受所有的消息,GetMessage在没有产生消息的时候并不返回,
而是一直在等待,直到一个消息返回;
当消息不是WM_QUIT时,返回一个非零值,也就是说,当是WM_QUIT时会返回一个零。
如果你在使用中如下使用:
While(true)
{
if(GetMessage(&msg,NULL,0,0))
    break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}


则会出现问题,什么问题呢,就是你结束程序时,窗口是结束了。
但是你去任务管理器里看,还能看到那个进程。
所以正确的用法应是:
While(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}




PeekMessage不管有没有消息都会返回一个值,有消息是非零值,没有消息则是零值。
所以如果上面代码用PeekMessage的话就不会出现这样的问题了。
在使用PeekMessage的时候需要指定对消息的处理方法,一般使用PM_REMOVE,即删除消息。
PeekMessage(&msg,NULL,0,0,PM_REMOVE);
使用这个函数一个问题是他会一直占用你的CPU,因为一般情况下我们会一直让他循环,
而这个函数就会一直不停的取消息。


当然这两个函数各有各的好处,PeekMessage可以在没有输入消息的时候也处理一些事情。




关于这个两个函数的详细信息:
BOOL GetMessage(
  LPMSG lpMsg,         // 一个MSG的指针
  HWND hWnd,           // 一般为当前窗口的句柄
  UINT wMsgFilterMin,  // 要取的消息的最小值
  UINT wMsgFilterMax   // 要取的消息的最大值
);


如果第三,四个参数都为零,则取所有的消息。
如果出现错误,比如参数一或参数而指向的指针或句柄无效,则会返回-1.


BOOL PeekMessage(
  LPMSG lpMsg,        
  HWND hWnd,          
  UINT wMsgFilterMin, 
  UINT wMsgFilterMax,   //前四个参数和GetMessage的一样
  UINT wRemoveMsg      // 取完消息要做的操作
);


最后一个参数有PM_NOREMOVE和PM_REMOVE两种方式,前一种就是取完消息后不删除消息,
不知道这中方式在什么情况下会采用,我目前还没有见过。
一般都是采用后一种删除的方法。


两个函数主要有以下两个区别:


    1.GetMessage将等到有合适的消息时才返回,而PeekMessage只是撇一下消息队列。


    2.GetMessage会将消息从队列中删除,而PeekMessage可以设置最后一个参数wRemoveMsg来决定是否将消息保留在队列中。


      在Windows的内部,GetMessage和PeekMessage执行着相同的代码。而两者最大的不同之处则体现在没有任何消息返回到应用程序的情况下。在此种情况下,PeekMessage会返回一个空值到应用程序,GetMessage会在此时让应用程序休眠。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GetMessagePeekMessage是Windows API中用于处理消息队列的函数。它们的主要区别如下: 1. GetMessage的主要功能是从消息队列中“取出”消息,消息被取出以后,就从消息队列中将其删除;而PeekMessage的主要功能是“窥视”消息,如果有消息,就返回true,否则返回false。PeekMessage也可以从消息队列中取出消息,这要用到它的一个参数(UINT wRemoveMsg),如果设置为PM_REMOVE,消息则被取出并从消息队列中删除;如果设置为PM_NOREMOVE,消息就不从消息队列中取出。 2. 如果GetMessage从消息队列中取不到消息,则线程就被操作系统挂起,等到操作系统重新调度该线程时才继续执行;而PeekMessage挂起线程,如果没有消息,它立即返回,并且线程继续执行。 3. GetMessage每次都等待消息,直到取到消息才返回;而PeekMessage只是查询消息队列,没有消息就立即返回,从返回值判断是否取到了消息。 综上所述,GetMessagePeekMessage区别在于GetMessage阻塞线程并且从消息队列中删除消息,而PeekMessage阻塞线程并且可以选择是否删除消息。 #### 引用[.reference_title] - *1* *2* [GetMessagePeekmessage区别](https://blog.csdn.net/lala_achun/article/details/6201486)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [GetMessagePeekMessage区别](https://blog.csdn.net/hellokandy/article/details/52275366)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值