我需要自己处理一些keydown,但是其他一些我更喜欢传递给原始的RichEdit程序。 这是代码(不相关的部分被截断):
LRESULT CALLBACK REWndProc( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp )
{
switch( msg)
{
case WM_KEYDOWN:
{
switch( wp )
{
case VK_LEFT:
return CallWindowProc( (WNDPROC)g_OrigREWndProc, hwnd, msg, wp, lp );
break;
case VK_RIGHT:
return CallWindowProc( (WNDPROC)g_OrigREWndProc, hwnd, msg, wp, lp );
break;
case VK_UP:
return CallWindowProc( (WNDPROC)g_OrigREWndProc, hwnd, msg, wp, lp );
break;
case VK_DOWN:
return CallWindowProc( (WNDPROC)g_OrigREWndProc, hwnd, msg, wp, lp );
break;
}
}
}
}
其中g_OrigREWndProc指向原始RichEdit过程。问题是每次在Windows 10中都没有由g_OrigREWndProc处理那些VK_LEFT \ VK_RIGHT。有时消息被正确处理 - 插入位置正朝着相关方向改变。但在另一个时间没有任何反应:我按左键(例如),但插入位置保持不变。然后我再次按左键,再没有任何反应。但是,当我多次尝试时,它会生效 - 插入位置最终会改变。
重要的是:当我按相关按钮时,总是会触发WM_KEYDOWN和案例VK_ *,因此在我们进入CallWindowProc后问题就开始了。其他一些消息也是如此,例如WM_CHEY的WM_CHEYDOWN + VK_RETURN。但是在Windows 7中一切都很好,问题只出现在Windows 10中。
但有趣的是,当我自己处理事件时,它们都是完美的,所以当我使用
模拟VK_RETURN时SendMessage( g_hwnd_RE, EM_REPLACESEL, (WPARAM)false, (LPARAM)L"\r" );
每次按RETURN都会很完美。