| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3122 人关注过本帖
标题:Windows程序中的消息循环方法
只看楼主 加入收藏
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
结帖率:79.17%
收藏
 问题点数:0 回复次数:6 
Windows程序中的消息循环方法
Windows程序通常也是这样:

    while (int ret=GetMessage(&sMsg, NULL, 0, 0)) {        // 消息循环
        if (ret != -1) {
            TranslateMessage(&sMsg);
            DispatchMessage(&sMsg);
        }
    }

这就是说TranslateMessage(&sMsg)起 等待信号作用,而DispatchMessage(&sMsg)起处理信号作用
但是我有个疑问,这个 等待信号 函数是怎么实现的?
不会是这个等待信号 TranslateMessage函数就是将CPU挂起
而DispatchMessage函数就相当一个中断函数,在有消息的时侯,产生一个中断信号
从而退出挂起状态,转而执行 信号处理??
搜索更多相关主题的帖子: Windows 
2008-09-20 23:02
Arcticanimal
Rank: 3Rank: 3
等 级:论坛游民
威 望:7
帖 子:341
专家分:20
注 册:2007-3-17
收藏
得分:0 
你可以试着去掉TranslateMessage(&sMsg);和DispatchMessage(&sMsg);这两句看看有什么效果就知道了.
当前线程的消息队列中没有消息时GetMessage的调用会导致当前线程被挂起, 直到有新的消息被投递到当前线程的消息队列. TranslateMessage 将virtual-key消息转换为字符消息, DispatchMessage调用窗口过程函数, 或者其他响应函数. 其实, 如果程序里面用到加速键, 那么在TranslateMessage之前还要调用TranslateAccelerator. 所以TranslateMessage并不是必须的.

try new catch
2008-09-21 09:37
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
收藏
得分:0 
回复 2# Arcticanimal 的帖子
哦,您的意思是他们由各自的分工:
TranslateMessage 处理键盘输入
而 DispatchMessage 处理除了键盘输入信号之外的消息?
2008-09-21 10:45
xyt_bluesky
Rank: 1
等 级:新手上路
威 望:1
帖 子:27
专家分:0
注 册:2008-8-16
收藏
得分:0 
不是这么说的吧?我正在学习windows编程,貌似上面说滴不是很正确呢!
2008-09-21 12:28
Arcticanimal
Rank: 3Rank: 3
等 级:论坛游民
威 望:7
帖 子:341
专家分:20
注 册:2007-3-17
收藏
得分:0 
回复 3# vfdff 的帖子
不是,
   TranslateMessage把部分虚拟键消息转换为字符消息投递到当前线程的消息队列中. 当前的虚拟键消息不作任何改变, 继续应有的处理.
   除加速键外的消息都是由DispatchMessage传回给系统, 再由系统去调用适当的回调函数(注册的窗口过程或者WM_TIMER的响应函数等等).
   TranslateAccelerator 直接把加速键消息转换为命令消息, 然后调用窗口回调函数.
所以正常的调用方式如下:
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}

如果程序里面不需要用到键盘消息, 完全可以不调用TranslateMessage和TranslateAccelerator. 甚至DispatchMessage也可以省掉, 最简单的如下调用

while (GetMessage(&msg, NULL, 0, 0))
{
  YourWindowProc(msg.hwnd, msg.message, msg.wParam, msg.lParam);
}

try new catch
2008-09-21 15:52
chenlou
Rank: 1
来 自:湖北黄冈武穴
等 级:新手上路
威 望:2
帖 子:49
专家分:0
注 册:2008-9-21
收藏
得分:0 
上面的兄弟说的很对!我目前正在学习这个。
2008-09-21 22:45
无名小子
Rank: 1
等 级:新手上路
威 望:1
帖 子:30
专家分:0
注 册:2007-8-11
收藏
得分:0 
恩。5楼正解~~
2008-09-22 10:13
快速回复:Windows程序中的消息循环方法
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025473 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved