WINAPI对话框ESC键未触发回调问题及解决方法
对话框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);
实际运行中的现象:
- 点击自定义Cancel按钮时,对话框回调收到
WM_COMMAND消息且lParam==ID_CUSTOM_CANCEL - 点击标题栏关闭按钮时,回调收到
WM_COMMAND消息且lParam==ID_CANCEL - 按下ESC键时,回调函数完全未收到任何相关消息
我希望Windows能像处理回车键默认按钮那样,原生支持ESC键的关闭逻辑,不想通过WM_KEYDOWN或自定义快捷键的方式手动处理。
排查过程
测试中发现一个奇怪现象:添加TEXT控件并进入该控件后,ESC键突然生效了。一开始以为是TABSTOP设置的问题,但TABSTOP需要手动选中控件才会生效,显然不是问题根源。
最终解决
排查后发现问题出在对话框回调的WM_INITDIALOG处理逻辑中——末尾缺少了return TRUE。添加这一行后,ESC键的原生处理和TABSTOP功能都恢复正常。
推测原因:如果对话框没有正确处理WM_INITDIALOG并返回TRUE,即使对话框处于前台,也无法正确获取输入焦点,导致系统的默认键盘消息处理逻辑无法触发。
内容的提问来源于stack exchange,提问作者odo
相关产品推荐
相关产品推荐

