如何在无模式对话框中使用 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 处理的消息传递给TranslateMessageDispatchMessage 函数。

每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 键?的主要内容,如果未能解决你的问题,请参考以下文章

ckeditor - 在源模式下禁用ENTER键

按下 Enter 键时如何关闭 WPF 窗口(对话框)?

在不使用 JavaScript 的情况下,如何在选择字段集中时使 Enter 键提交表单?

如何在无模式猫鼬中添加对象数组?

编辑单元格时如何在 QTableView 中使用 Enter 键导航

如何使用键盘上的 Enter 键登录网站? [关闭]