如何在无模式对话框中使用 Enter 键?
Posted
技术标签:
【中文标题】如何在无模式对话框中使用 Enter 键?【英文标题】:How to use the Enter key in a modeless dialog? 【发布时间】:2020-08-14 23:16:45 【问题描述】:我一直在为大学开发一个 WinAPI 项目,我们被要求在一个对话框中实现完整的程序。起初,我使用了一个模态对话框,一切正常,除了对话框的任务栏中没有图标,因为我直接在 WM_CREATE 上创建了它,并且没有使主窗口可见,因为它不是用过。
现在我完全放弃了主窗口句柄,只使用CreateDialog
创建一个无模式对话框,但从那以后我不能使用 Enter 键来替代我的默认按钮。
case WM_COMMAND:
if(LOWORD(wparam) == IDOK || LOWORD(wparam) == IDC_OK)
[...] //doing stuff
break;
这是我的全部主要功能:
int WINAPI WinMain(HINSTANCE dieseInstanz, HINSTANCE vorherigeInstanz, LPSTR lpszArgument, int Fensterstil)
MSG Meldung;
HWND dialog = NULL;
dialog = CreateDialog(GetModuleHandle(NULL),MAKEINTRESOURCE(IDC_DIALOG), NULL, dialogHandler);
if(dialog != NULL)
ShowWindow(dialog, SW_SHOW);
else
MessageBox(NULL, "CreateDialog returned NULL", "Warning!", MB_OK | MB_ICONINFORMATION);
while(GetMessage(&Meldung, NULL, 0, 0))
TranslateMessage(&Meldung);
DispatchMessage(&Meldung);
return Meldung.wParam;
我只是做错了一些基本的事情,还是它没有按照我想要的方式工作?
澄清一下:如果我在对话框中按 Enter 键,我只会听到典型的 Windows 通知声音。
【问题讨论】:
【参考方案1】:您的消息循环需要包含对IsDialogMessage()
的调用:
确定消息是否用于指定的对话框,如果是,则处理该消息。
...
IsDialogMessage
处理消息时,它会检查键盘消息并将其转换为相应对话框的选择。例如,按下 TAB 键时,会选择下一个控件或组控件,当按下向下箭头键时,选择组中的下一个控件。因为
IsDialogMessage
函数执行所有必要的消息翻译和分派,所以不能将IsDialogMessage
处理的消息传递给TranslateMessage
或DispatchMessage
函数。
每Using Dialog Boxes: Creating a Modeless Dialog Box:
示例的第二部分是应用程序的主消息循环。 循环包含 IsDialogMessage 函数,以确保用户可以在此无模式对话框中使用对话框键盘界面。
CreateDialog()
文档中也说明了这一点:
CreateDialog
返回后,应用程序使用ShowWindow
函数显示对话框(如果尚未显示)。应用程序使用DestroyWindow
函数销毁对话框。 要支持键盘导航和其他对话框功能,对话框的消息循环必须调用IsDialogMessage
函数。
所以,改变你的消息循环,让它看起来更像这样:
while (GetMessage(&Meldung, NULL, 0, 0))
if (!IsWindow(dialog) || !IsDialogMessage(dialog, &Meldung))
TranslateMessage(&Meldung);
DispatchMessage(&Meldung);
【讨论】:
非常感谢,现在可以使用了!我知道这个电话,但我认为在那种情况下它并不重要。以上是关于如何在无模式对话框中使用 Enter 键?的主要内容,如果未能解决你的问题,请参考以下文章
在不使用 JavaScript 的情况下,如何在选择字段集中时使 Enter 键提交表单?