win32 c++ 在没有子类化的编辑控件中检测“输入”?

Posted

技术标签:

【中文标题】win32 c++ 在没有子类化的编辑控件中检测“输入”?【英文标题】:win32 c++ detecting 'enter' in a edit control withot subclassing? 【发布时间】:2011-06-02 14:54:17 【问题描述】:

基本上,我想要一个 Enter 来触发一条消息,当编辑控件获得焦点并且用户按下 Enter 时,我可以捕捉到消息。网上所有的解决方案似乎都是关于子类化的,但我想知道是否有另一种解决方法?

例如,我的按钮有一个标识符 ID_BUTTON_SEND。这是我的想象;

case WM_COMMAND:
     switch (LOWORD(wParam))
            case ID_BUTTON_SEND
                 if ('enter was pressed') 
                      do this
                 else
                      default

...你明白了 :) 我已经阅读了 http://support.microsoft.com/kb/102589,但坦率地说,选项 1 对我来说没有多大意义。

干杯

【问题讨论】:

【参考方案1】:

最好的方法是在调用 TranslateMessage 之前。因此,如果使用 MFC,请覆盖 CWnd::PreTranslateMessage。如果仅使用 Win API,则只需在调用 TranslateMessage 之前检查您的消息泵中包含的消息。

【讨论】:

我要查找什么消息? WM_CHAR、WM_KEYPRESS 什么的?另外 - 这是否会对性能产生影响,每次收到消息时都进行此检查? 不要担心性能问题,它们可以忽略不计。但是,我忘记了要查找的消息:) 但由于它尚未被翻译,我认为 WM_KEYDOWN 将是要查找的消息。 (或 WM_KEYUP 也是)。【参考方案2】:

您可以捕获焦点更改事件,当编辑控件获得焦点事件时,只需将对话框默认按钮更改为 *ID_BUTTON_SEND* 按钮。然后当焦点丢失时删除这个默认按钮标志。

这意味着当编辑控件有焦点时,只要用户点击回车,对话框就会自动触发 *ID_BUTTON_SEND* 默认按钮。

您可以通过将 BS_DEFPUSHBUTTON 添加到按钮的 GWL_STYLE 中,使该按钮成为默认按钮

【讨论】:

【参考方案3】:

只是重申知识库文章。对于选项 1,您实际上可以简单地在 WM_COMMAND 中处理 IDOK。

case WM_COMMAND:
  if(wParam == IDOK)
     ENTER WAS PRESSED
  else
    REGULAR EVENT HANDLING
  

这是检查 Enter 的一种更简单、更简洁的方法。

【讨论】:

谢谢!几天来一直试图追踪它。对于 OP,您可以检查控件的 HWND,因为它在您的 lparam 中。

以上是关于win32 c++ 在没有子类化的编辑控件中检测“输入”?的主要内容,如果未能解决你的问题,请参考以下文章

编辑控件不会获得焦点! win32 c++

C++ Win32,可以编辑控件由所有者绘制吗?

在 Win32 中子类化 MonthCal 控件

c++ win32输出一个文本

如何读取文本文件并将其显示在 win 32 unicode 字符集中的编辑控件上?

在编译的 exe 中编辑字符串变量? C++ win32