Windows 为什么要翻译信息

Windows 为什么要翻译信息,windows,winapi,visual-c++,Windows,Winapi,Visual C++,我试图理解“消息循环”。 这就是它的样子: MSG msg = { }; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } 到目前为止,我很清楚(至少我希望如此)这个概念。当用户使用键盘和鼠标与windows应用程序交互时,这些事件将由相应的设备驱动程序转换为适当的消息,并发布到系统消息队列 操作系统从队列中逐个删除消息,并检查每

我试图理解“消息循环”。 这就是它的样子:

MSG msg = { };
while (GetMessage(&msg, NULL, 0, 0))
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}
到目前为止,我很清楚(至少我希望如此)这个概念。当用户使用键盘和鼠标与windows应用程序交互时,这些事件将由相应的设备驱动程序转换为适当的消息,并发布到系统消息队列

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

现在在我的申请中

MSG msg;
GetMessage(&msg, NULL, 0, 0);
从特定于线程的消息队列中删除消息并填充消息结构

但是
TranslateMessage
据说可以将虚拟击键转换为字符,并将其发回调用线程的消息队列

DispatchMessage
指示操作系统调用相应目标窗口的Windows过程

两个疑问:

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

2) 鼠标事件呢?它们是直接调度的吗?

简而言之

  • 是的,它只是将虚拟击键转换为字符消息
  • 是的,他们是直接派遣的,看到这个了吗
  • 详情请参阅


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

    while (GetMessage(&msg, NULL, 0, 0))
    {
        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
    
    加速器在这里很重要,也被称为“快捷键”。无论哪个窗口具有焦点,您的程序都希望响应它们。Like F1显示程序的帮助文件,无论哪个控件具有焦点。您不希望必须编写将每个控件窗口子类化以识别F1的代码

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