如何处理模式对话框上的键盘输入?

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

我有一个模式对话框,我想在单击“取消”按钮或按下退出键时关闭它。如何处理对话框程序中的转义键按下?

这是我当前的对话框程序:

INT_PTR CALLBACK DialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_INITDIALOG:
        return true;

    case WM_COMMAND:
        switch (LOWORD(wParam)) {
        case IDC_CANCEL:
            EndDialog(hDlg, false);
            return true;
        default:
            return false;
        }

    // this doesn't work
    case WM_KEYDOWN:
        if (wParam == VK_ESCAPE) {
            EndDialog(hDlg, false);
            return true;
        }
        return false;

    case WM_CLOSE:
        EndDialog(hDlg, false);
        return true;

    default:
        return false;
    }
    return false;
}

我知道,如果我将模态对话框更改为非模态对话框,我可以使用加速器表使 Escape 成为取消按钮的加速器,但我想保持对话框为模态。在

SetFocus(hDlg)
下使用
case WM_INITDIALOG:
无法捕获键盘输入,我没有主意了。

如何处理模式对话框中的键盘输入?

c++ winapi
1个回答
0
投票

感谢 Richard Critten 和 GPT-4 提供了这个答案:我可以简单地处理命令 IDCANCEL,当在对话框上按 Esc 时会自动发送该命令。为了使事情更清晰,我可以更改“取消”按钮以发送相同的命令 IDCANCEL。这给了我们这个对话框程序:

INT_PTR CALLBACK DialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_INITDIALOG:
        return true;

    case WM_COMMAND:
        switch (LOWORD(wParam)) {
        case IDCANCEL:  // note this change
            EndDialog(hDlg, false);
            return true;
        default:
            return false;
        }

    // no need to handle key presses

    case WM_CLOSE:
        EndDialog(hDlg, false);
        return true;

    default:
        return false;
    }
    return false;
}
© www.soinside.com 2019 - 2024. All rights reserved.