【问题标题】:Why this Windows message loop does not handle shorcut/tab keys?为什么这个 Windows 消息循环不处理快捷键/tab 键?
【发布时间】:2020-12-16 06:22:05
【问题描述】:

在冗长处理过程中使用的代码中有以下循环:

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

(可以作为按钮单击的动作添加到对话框中以演示问题)。在这个循环中,对话框被正确绘制并对几乎所有内容做出反应,除了当我按下例如 ALT 以显示热键下划线时,例如 O 下划线:

它还会忽略用于在控件之间切换的 TAB 键。循环中是否缺少使此功能起作用的东西?我还尝试在 WindowProc 中查找 WM_COMMAND,它对应于通过键 O 按下特定按钮,并且在上述循环的情况下,WM_COMMAND 永远不会传入......如果我用鼠标单击,或者我删除自定义循环,生成 WM_COMMAND。

如何使这种行为与自定义循环一起工作?请注意,这只是一个演示示例,在实际代码中它做的更多(禁用导致此操作和可能递归的按钮),但问题是相同的,其中某处是类似的循环,忽略了这些选项卡/alt键。

【问题讨论】:

    标签: c++ user-interface winapi mfc


    【解决方案1】:

    这些功能是由IsDialogMessage() 实现的,您没有调用。

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

    【讨论】:

    • 它有效,谢谢! (自从我在 MFC CDialog 课程中以来,我所做的只是小修改就是用 !IsDialogMessage(&msg) 替换条件)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-13
    • 1970-01-01
    相关资源
    最近更新 更多