我有一个模式对话框,我想在单击“取消”按钮或按下退出键时关闭它。如何处理对话框程序中的转义键按下?
这是我当前的对话框程序:
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:
无法捕获键盘输入,我没有主意了。
如何处理模式对话框中的键盘输入?
感谢 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;
}