对话框中的 WINAPI Esc 键处理

问题描述 投票:0回答:1

互联网上已经写了很多关于人们对对话框中默认 ESC 键处理感到恼火的帖子,但这正是我真正期望但无法实现的。 简而言之,我在资源中的对话框定义

ID_DIALOG DIALOGEX 0, 0, 200, 200
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_TOOLWINDOW
CAPTION "Dialog"
FONT 8, "MS Sans Serif"
BEGIN
PUSHBUTTON "Cancel", ID_CUSTOM_CANCEL, 10, 10, 50, 14
END

我通过以下方式显示此对话框:

DialogBox(NULL, MAKEINTRESOURCE(ID_DIALOG), hwnd_main, DialogCallback);

当我单击按钮时,将使用

Message == WM_COMMAND
lParam==ID_CUSTOM_CANCEL
调用对话框回调函数。

当我单击对话框标题上的“关闭”按钮时,将使用

Message == WM_COMMAND
lParam==ID_CANCEL
调用对话框回调函数。

但是当我按 ESC 键时,对话框回调函数永远不会被调用。

我知道在我的代码中很少有方法可以处理这个问题,但我希望 Windows 应该有一种本地支持,就像对默认按钮的 ENTER 键支持一样。 我知道我可以通过 WM_KEYDOWN 或定义加速键来处理相同的问题,但是有没有更少的“手动”方式来处理这个问题?

在测试不同的对话框行为时,我注意到如果我添加 TEXT 控件并输入此控件,那么 ESC 就会像魔术一样工作。我最初假设问题出在 TABSTOP 设置上,即使在上面的示例中,我也没有将

WS_TABSTOP
添加到 PUSHBUTTON,但后来我发现 TABSTOP 不起作用,直到我在对话框上手动选择一个控件。 沿着这条路我找到了我的问题的解决方案。其他人对 TABSTOP 也有同样的问题,并且根本原因丢失了
return TRUE
WM_INITDIALOG
的末尾。 对我来说很有魅力,ESC 键和 TABSTOP 现在都可以使用。 无论它位于屏幕上所有内容的顶部,它看起来都像对话框,如果
WM_INITDIALOG
没有被正确处理,它就没有某种焦点。

winapi modal-dialog
1个回答
0
投票

问题的最后一段描述了我如何发现解决方案。 根本原因是处理WM_INITDIALOG后没有返回TRUE。 更多详细信息请参见 MSDN 当前消息文档的链接: https://learn.microsoft.com/en-us/windows/win32/dlgbox/wm-initdialog

接收默认键盘焦点的控件始终是对话框中第一个可见、未禁用且具有 WS_TABSTOP 样式的控件。当对话框过程返回 TRUE 时,系统检查控件以确保该过程没有禁用它。如果已禁用,系统会将键盘焦点设置到下一个可见、未禁用且具有 WS_TABSTOP 的控件。

仅当应用程序将键盘焦点设置为对话框的控件之一时,它才可以返回 FALSE。

© www.soinside.com 2019 - 2024. All rights reserved.