c++ - EN_UPDATE 工作不可靠?
问题描述
我需要在我的 RichEdit 框中拦截按键和其他用户操作。我发现拦截 WM_KEYDOWN 或 WM_CHAR 中的用户输入太复杂了,因为某些按键会触发 WM_CHAR,其中一些不会触发,而且还有其他一些问题。
所以我决定收听 EN_UPDATE 消息,因为据说这个事件会在每次更改时触发,就在 RichEdit 控件开始重绘之前(https://docs.microsoft.com/en-us/windows/desktop/controls/en -更新)。好吧,这听起来像是一个值得信赖的机制,可以拦截所有的变化。
但我发现并不是每个 WM_KEYDOWN 都会触发 EN_UPDATE。我快速按下了许多按钮(通常的“char”按钮,如“d”、“f”等,没有特殊键),发现当我输入 100 个字符时,WM_KEYDOWN 也触发了 100 次,但 EN_UPDATE 仅触发了 96 次(EN_UPDATE的激活次数不等,有时等于按键次数,不知道取决于什么)。WM_KEYDOWN 的数量和输入的字符数当然总是相等的。
这是代码:
BOOL CEditorView::OnCommand( WPARAM wParam, LPARAM lParam )
{
static long count = 0;
if( HIWORD( wParam) == EN_UPDATE )
{
if( (HWND)lParam == g_hwnd_RE )
{
if( g_allowProcessing )
{
count++;
}
}
}
return CDockablePane::OnCommand( wParam, lParam );
}
///// and WM_KEYDOWN
case WM_KEYDOWN:
{
g_testCount++;
return DefSubclassProc( hwnd, msg, wp, lp );
break;
}
我做错了什么还是只是 EN_UPDATE 的特定工作方式?当用户输入太快时,它可能会累积变化。
解决方案
当控件即将重绘自身时发送EN_UPDATE 。这并不意味着控件必须在每个 WM_KEYDOWN 之后更新,例如,当键在一点点下降时,控件可能具有一些缓存机制来延迟更新。
这不是每个控件的标准,您可能有一个在每次按键时更新的控件,即使按键之间有 1 毫秒的延迟,并且您可能有一个每秒更新的控件,无论它获得多少键。这取决于控制。
因此,如果你真的想得到每个键的通知,你必须使用 WM_KEYDOWN。EN_UPDATE 通常用于获取控件的当前状态并更新另一个控件。
推荐阅读
- ubuntu-16.04 - 当我连接时,鳄梨酱关闭套接字到 guacd
- ios - 使用 Button 将文本添加到 UITableViewcell 中包含的文本字段值
- javascript - JS/JQUERY如何在同一个DIV中优先点击按钮
- spring - Thymeleaf 表达式对象:#session 和 ${session....}
- elasticsearch - 如何在 Spring Data ES 3.2.0.M1 中使用 High Level Rest Client
- reactjs - 通过重新选择将选择器结果传递给另一个选择器
- ios - 使用带有情节提要参考的“Unwind Segue”时“没有标识符的segue”
- java - 加载资源时,什么决定了 Maven 依赖项的行为?
- php - 删除数组值引号
- oracle - Oracle - 获取经过身份验证的用户