我对对话框中的一个按钮做了一个 SetFocus。按钮获得虚线轮廓。当用户按下返回键时,对话框会收到一条 IDOK 消息,而不是来自我设置焦点的按钮的消息。在其他情况下也会发生同样的事情。
为什么会这样?我怎样才能使返回充当按钮按下?
普通的 c++ windows 应用程序,没有 MFC,没有 NET。
功能,而不是错误。[Enter] 键操作标记为对话框默认按钮的按钮。使用DEFPUSHBUTTON
.rc 文件中的 或BS_DEFPUSHBUTTON
样式标志。这通常是“确定”按钮,因此可以IDOK
返回。[Escape] 键也很特殊,通常是 [Cancel] 按钮。如果您回想以前如何使用对话框,这势必会敲响警钟。
您可以通过按空格键来单击具有焦点的按钮。
在另一个SO 问题中,我找到了可能对您有所帮助的知识库文章:
如果对话框或其控件之一当前具有输入焦点,则按 ENTER 键会导致 Windows 发送 WM_COMMAND 消息,其中 idItem (wParam) 参数设置为默认命令按钮的 ID。如果对话框没有默认的命令按钮,则 idItem 参数默认设置为 IDOK。
当应用程序接收到 idItem 设置为默认命令按钮 ID 的 WM_COMMAND 消息时,焦点将保留在按下 ENTER 键之前具有焦点的控件上。此时调用 GetFocus() 将返回在按下 ENTER 键之前具有焦点的控件的句柄。应用程序可以检查这个控件句柄并确定它是否属于对话框中的任何编辑控件。如果是这样,则用户正在将数据输入到编辑控件之一中,然后按 ENTER。此时,应用程序可以向对话框发送 WM_NEXTDLGCTL 消息以将焦点移至下一个控件。
根据MSDN,
对话框键盘界面
系统为对话框提供了特殊的键盘接口,对多个按键进行特殊处理。该界面生成与对话框中的某些按钮相对应的消息,或者将输入焦点从一个控件更改为另一个控件。以下是此界面中使用的键及其各自的操作。
...
ENTER:向对话框过程发送 WM_COMMAND 消息。wParam 参数设置为 IDOK 或默认按钮的控件标识符。
由于系统拦截并处理直接通过对话框按下的 ENTER 键,因此您需要在对话框过程中通过调用GetFocus()
来处理它,首先查看哪个控件具有焦点,然后为该特定控件执行适当的操作。