过滤窗口消息的危害性

GetMessagePeekMessage 函数可以用来实现消息过滤功能,程序在接收消息的时候可以限定消息列表中窗口句柄或指定消息的范围来达到过滤功能。当然使用这些过滤是完全合法的,但是你要确信那些没有用的消息也要被适当的进行处理。

一个普遍的错误就是在你的消息循环中对GetMessage函数使用窗口过滤。代码如下: 

        while (GetMessage(&msg, hwnd, 0, 0)) { // 错误!
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }

虽然我们在程序中只创建了一个窗口,可是程序仍然可能会出错。

你可能会问这是为什么,我的程序明明只有一个窗口,为什么还能收到其它窗口的消息?这个过滤(是多余的)应该不会产生任何的副作用,是不是? 

其实很多系统的服务都可能会为你创建一些窗口。举个例子:如果Edit控件允许输入字符,那么这个Edit控件就可能会创建一个辅助的窗口来处理字符输入。假如你初始化了COM,那么COM可能会决定需不需要创建一个辅助窗口来执行线程的列集。假如你只用一个执行过滤功能的GetMessage函数,那么发到辅助窗口的消息将会永远收不到。在开发过程中,你可能会绞尽脑汁来分析,为什么我的程序在只是执行一个drag/drop操作就引起了程序挂起。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值