返回键为焦点按钮生成IDOK

时间:2013-04-14 16:27:57

标签: windows winapi

我将SetFocus设置为对话框中的按钮。按钮获得虚线轮廓。当用户按下返回键时,对话框会收到IDOK消息而不是按钮中的消息,我设置了焦点。在其他情况下也会发生同样的事情。

为什么会这样?我怎样才能让回报作为按钮按下?

普通的c ++ windows app,没有MFC,没有NET。

3 个答案:

答案 0 :(得分:2)

功能,而不是错误。 [Enter]键操作按钮,该按钮被标记为对话框的默认按钮。使用.rc文件中的DEFPUSHBUTTONBS_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()在对话框过程中处理它,以便首先查看哪个控件具有焦点,并执行相应的操作对于那个特定的控制。