我将SetFocus设置为对话框中的按钮。按钮获得虚线轮廓。当用户按下返回键时,对话框会收到IDOK消息而不是按钮中的消息,我设置了焦点。在其他情况下也会发生同样的事情。
为什么会这样?我怎样才能让回报作为按钮按下?
普通的c ++ windows app,没有MFC,没有NET。
答案 0 :(得分:2)
功能,而不是错误。 [Enter]键操作按钮,该按钮被标记为对话框的默认按钮。使用.rc文件中的DEFPUSHBUTTON
或BS_DEFPUSHBUTTON
样式标志。这通常是" OK"按钮,这样可以获得IDOK
。 [Escape]键也很特别,通常是[Cancel]按钮。如果你回想一下以前如何使用对话框,这肯定会敲响一声。
您可以通过按空格键来单击具有焦点的按钮。
答案 1 :(得分:1)
在另一个SO question我发现KB article可能对您有所帮助:
如果对话框或其中一个控件当前具有输入焦点, 然后按ENTER键使Windows发送WM_COMMAND 将idItem(wParam)参数设置为ID的消息 默认命令按钮。如果对话框没有默认值 命令按钮,然后idItem参数默认设置为IDOK。
当应用程序收到idItem设置为的WM_COMMAND消息时 默认命令按钮的ID,焦点仍然是 按下ENTER键之前具有焦点的控件。调用 此时GetFocus()返回具有的控件的句柄 按下ENTER键之前的焦点。该应用程序可以检查 这个控件处理并确定它是否属于任何一个 编辑对话框中的控件。如果是,那么用户就是 将数据输入其中一个编辑控件,然后执行此操作, 按ENTER键。此时,应用程序可以发送 WM_NEXTDLGCTL消息到对话框将焦点移动到下一个 控制。
答案 2 :(得分:0)
根据MSDN,
对话框键盘界面
系统为对话框提供了一个特殊的键盘界面,可以对多个键进行特殊处理。界面生成与对话框中某些按钮对应的消息,或将输入焦点从一个控件更改为另一个控件。以下是此界面中使用的键及其各自的操作。
...
ENTER:将WM_COMMAND消息发送到对话框过程。 wParam参数设置为IDOK或默认按钮的控件标识符。
由于系统截取并处理直接通过对话框输入的ENTER键,您需要通过调用GetFocus()
在对话框过程中处理它,以便首先查看哪个控件具有焦点,并执行相应的操作对于那个特定的控制。