GetMessage
和PeekMessage
函数可以用来实现消息过滤功能,程序在接收消息的时候可以限定消息列表中窗口句柄或指定消息的范围来达到过滤功能。当然使用这些过滤是完全合法的,但是你要确信那些没有用的消息也要被适当的进行处理。
一个普遍的错误就是在你的消息循环中对GetMessage函数使用窗口过滤。代码如下:
while (GetMessage(&msg, hwnd, 0, 0)) { // 错误!
TranslateMessage(&msg);
DispatchMessage(&msg);
}
虽然我们在程序中只创建了一个窗口,可是程序仍然可能会出错。
你可能会问这是为什么,我的程序明明只有一个窗口,为什么还能收到其它窗口的消息?这个过滤(是多余的)应该不会产生任何的副作用,是不是?
其实很多系统的服务都可能会为你创建一些窗口。举个例子:如果Edit控件允许输入字符,那么这个Edit控件就可能会创建一个辅助的窗口来处理字符输入。假如你初始化了COM,那么COM可能会决定需不需要创建一个辅助窗口来执行线程的列集。假如你只用一个执行过滤功能的GetMessage函数,那么发到辅助窗口的消息将会永远收不到。在开发过程中,你可能会绞尽脑汁来分析,为什么我的程序在只是执行一个drag/drop操作就引起了程序挂起。