在Windows 10

时间:2018-06-12 19:29:27

标签: subclassing richedit

我需要自己处理一些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都会很完美。

0 个答案:

没有答案