c++ - 为什么这个 Windows 消息循环不处理快捷键/tab 键?
问题描述
在长时间处理期间使用的代码中有以下循环:
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键。
解决方案
这些功能是由IsDialogMessage()
您不调用的功能实现的。
MSG msg = { 0 };
while (GetMessage(&msg, NULL, 0, 0)) {
if (!IsDialogMessage(hwndDlg, &msg)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
推荐阅读
- orocommerce - 产品问题:“未知实体类型:productsearch。”
- python - RuntimeError:python 多处理错误
- laravel-5 - 无法与主机 smtp.gmail.com 建立连接 - Laravel
- lex - Lex 文件不读取文件中的字符或单词
- c# - Roslyn:如何修复 RS2008 警告?
- rust - 隐式错误类型转换的问题
- mongodb - 使用蓝图过滤日期
- c# - 自定义 ASP.NET ControllerBase 的序列化行为
- dynamics-business-central - 如何使用测试页和记录
- spring-boot - mysql数据库中不存在表