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++ 在没有子类化的编辑控件中检测“输入”?的主要内容,如果未能解决你的问题,请参考以下文章