本文主要介绍了Win32 API主消息循环的两种处理方法:使用GetMessage方法构造主消息循环、使用PeekMessage方法构造主消息循环。
(1)使用GetMessage方法构造主消息循环
一般应用程序都使用用GetMessage方法构造主消息循环,该方法是获得一条线程 的消息。对于VS2005自动生成的Win32 Windows程序上面有些不足。
因为VS2005生成的主消息循环如下;
// Main message loop:
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
简单看看的确没有问题,但是当我们去查阅MSDN文档看到GetMessage消息时候可以看到这样一段
If there is an error, the return value is -1.
所以我们应该把上面这个主循环修改为下面这样的形式,增加一个临死变量。
// Main message loop:
BOOL bRet;//临时变量,存储GetMessage方法返回值
// Main message loop:
while ((bRet = GetMessage(&msg, NULL, 0, 0))!=0)
{
if(bRet==-1){
//表示GetMessage获得的信息有错误
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
(2)使用PeekMessage方法构造主消息循环
PeekMessage常常用于Windows开发游戏中,PeekMessage在处理获得消息时候和GetMessage一样,关键不同的是PeekMessage在没有消息处理的时候还会继续保持循环激活状态,并且继续占用资源。
// Main message loop:
while (true)
{
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)){
if(msg.message == WM_QUIT){
break;
}
else{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
//表示GetMessage获得的信息有错误
}
else{
//循环处理的函数
}
}: