GetMessage和PeekMessage的区别
来源:互联网 发布:windows 图标 闪烁 编辑:程序博客网 时间:2024/05/24 05:15
在Win32中使用GetMessage和PeekMessage都可以获取对应该程序产生的消息。
他们有什么区别呢?
GetMessage的一般用法是GetMessage(&msg,NULL,0,0);这样可以接受所有的消息,GetMessage在没有产生消息的时候并不返回,而是一直在等待,直到一个消息返回;当消息不是WM_QUIT时,返回一个非零值,也就是说,当是WM_QUIT时会返回一个零。
如果你在使用中如下使用:
While(true)
{
if(GetMessage(&msg,NULL,0,0))
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(
);
如果第三,四个参数都为零,则取所有的消息。
如果出现错误,比如参数一或参数而指向的指针或句柄无效,则会返回-1.
BOOL PeekMessage(
);
最后一个参数有PM_NOREMOVE和PM_REMOVE两种方式,前一种就是取完消息后不删除消息,
不知道这中方式在什么情况下会采用,我目前还没有见过。
一般都是采用后一种删除的方法。
两个函数主要有以下两个区别:
1.GetMessage将等到有合适的消息时才返回,而PeekMessage只是撇一下消息队列。
2.GetMessage会将消息从队列中删除,而PeekMessage可以设置最后一个参数wRemoveMsg来决定是否将消息保留在队列中。
在Windows的内部,GetMessage和PeekMessage执行着相同的代码。而两者最大的不同之处则体现在没有任何消息返回到应用程序的情况下。在此种情况下,PeekMessage会返回一个空值到应用程序,GetMessage会在此时让应用程序休眠。
- Peekmessage和Getmessage的区别
- GetMessage和 PeekMessage 的区别
- Peekmessage和Getmessage的区别
- Peekmessage和Getmessage的区别
- Peekmessage和Getmessage的区别
- Peekmessage和Getmessage的区别
- GetMessage和PeekMessage的区别
- GetMessage和PeekMessage的区别
- GetMessage和PeekMessage的区别
- GetMessage和PeekMessage的区别
- PeekMessage和GetMessage的区别
- GetMessage和PeekMessage的区别
- GetMessage和PeekMessage的区别
- GetMessage和PeekMessage的区别
- GetMessage和PeekMessage的区别
- GetMessage和PeekMessage的区别
- PeekMessage和GetMessage的区别
- Peekmessage和Getmessage的区别(转载)
- 学习笔记之MySQL
- 学习《Python基础教程(第二版)》笔记10--抽象2
- CCF 201509-2 日期计算
- Java过滤器,SpringMVC拦截器之间的区别与执行顺序
- [NOIP2015提高组Day1T2]信息传递_强联通分量
- GetMessage和PeekMessage的区别
- React入门HelloWorld示例
- 使用RestController访问请求报NetworkError: 406 Not Acceptable错误
- 渲染世界的OpenGL<7>基础变换代码分析
- 通过xml定义背景形状
- 认识java
- 来玩Play框架01 简介
- Cocos网络篇[3.2](3) ——Socket连接(1)
- Android——Service 四大组件之二