WPF快捷方式激活时,键入HwndHost父富编辑控件



我正在编写一个WPF应用程序,它包含了一个传统的MFC richtext编辑器。我在HwndHost中包装了richtext编辑器。HwndHost控件位于WPF TabControl旁边。

在http://www.kempy.co.uk/code/Test.png上运行应用程序的截图

除了对焦问题和导航问题(上/下/左/右/tab/enter)我已经设法解决,我仍然有一个引人注目的问题:

每当在面板上的富文本控件(即快捷键)中键入一个字符时,该快捷键将被激活,而富文本控件永远不会得到该字符。在http://www.kempy.co.uk/code/Test.zip上附上了一个简单的测试项目来演示这种行为。在富编辑控件中按P或C键将使面板聚焦或单击按钮,即使富文本控件具有键盘焦点。

供参考,这里是代码,允许丰富的编辑控件处理Tab, Enter, Up, Down, Left, Right

#undef TranslateAccelerator
virtual bool TranslateAccelerator (System::Windows::Interop::MSG% msg, ModifierKeys modifiers) = IKeyboardInputSink::TranslateAccelerator
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    if (msg.message == WM_KEYDOWN)
    {
        // we want tabs when the rich edit is focused, send rich edit control a tab WM_CHAR 
        if (msg.wParam == (IntPtr)VK_TAB)
        {
            if (GetFocus() == m_pRichEdit->GetSafeHwnd())
            {
                m_pRichEdit->SendMessage(WM_CHAR, 't', 0);
                return true;
            }
            else
            {
                return false;
            }
        }
        else if (
            msg.wParam == (IntPtr)VK_UP
            || msg.wParam == (IntPtr)VK_DOWN
            || msg.wParam == (IntPtr)VK_LEFT
            || msg.wParam == (IntPtr)VK_RIGHT
            || msg.wParam == (IntPtr)VK_RETURN)
        {
            // need cursor keys and enter/return, send KEYDOWN messages to rich edit control
            m_pRichEdit->SendMessage(msg.message, msg.wParam.ToInt32(), msg.lParam.ToInt32());
            return true;
        }
    }
    return false;
}

是否需要重写OnMnemonic?

Dr Dobs关于互操作的文章…

http://drdobbs.com/windows/197003872?pgno=3

最新更新