加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

windows – 为什么正是TranslateMessage

发布时间:2020-12-14 02:09:43 所属栏目:Windows 来源:网络整理
导读:我试图理解’消息循环’. 这是它的样子: MSG msg = { };while (GetMessage(msg,NULL,0)){ TranslateMessage(msg); DispatchMessage(msg);} 到目前为止,我很清楚(至少我希望如此)这个概念.当用户使用键盘和鼠标与Windows应用程序交互时,这些事件由相应的设备
我试图理解’消息循环’.
这是它的样子:

MSG msg = { };
while (GetMessage(&msg,NULL,0))
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}

到目前为止,我很清楚(至少我希望如此)这个概念.当用户使用键盘和鼠标与Windows应用程序交互时,这些事件由相应的设备驱动程序转换为适当的消息并发布到系统消息队列.

操作系统逐个从队列中删除消息,并检查每个消息以将它们发送到负责创建目标窗口的相应应用程序的线程队列.

现在在我的申请中

MSG msg;
GetMessage(&msg,0);

从特定于线程的消息队列中删除消息并填充MSG结构.

但据说TranslateMessage将虚拟键击转换为字符并将它们发送回调用者线程的消息队列.

DispatchMessage指示操作系统调用适当目标窗口的Windows过程.

两个疑惑:

1)TranslateMessage的确切功能是什么;它只是将虚拟键击转换为字符消息(我假设虚拟击键是字母和数字以外的键击),如果字符消息被发回队列,则不是循环被破坏?

2)鼠标事件怎么样?他们直接派遣了吗?

解决方法

是的,当您的消息循环看起来像这样时,您必须调用TranslateMessage()是没有意义的.但这不是规范的Petzold消息循环的样子:

while (GetMessage(&msg,0))
{
    if (!TranslateAccelerator(msg.hwnd,hAccelTable,&msg))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
}

加速器在这里很重要,否则称为“快捷键”.无论哪个窗口具有焦点,您的程序都希望对它们做出响应.就像F1显示程序的帮助文件一样,无论哪个控件都有焦点.您不希望编写将每个控制窗口子类化以识别F1的代码.

因此,如果它是一个快捷键,那么您不想调用TranslateMessage.如果密钥恰好与键入密钥匹配,则密钥不应生成WM_CHAR消息.这就是为什么它是一个单独的电话.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读