Входные данные клавиатуры в пользовательском элементе управления WPF не отправляются в контейнер WinForms - PullRequest
9 голосов
/ 20 апреля 2011

У нас есть приложение WinForms, которое мы постепенно преобразовываем в WPF. На этом этапе основной формой приложения является форма (WinForm), которая содержит вертикальную боковую панель, встроенную в WPF. Боковая панель находится в элементе управления ElementHost.

В основной форме KeyPreview имеет значение true, и мы переопределяем OnKeyDown () для обработки сочетаний клавиш в приложениях. Когда боковая панель имеет фокус, события клавиатуры не отправляются в OnKeyDown.

Как правильно это исправить?

1 Ответ

8 голосов
/ 04 мая 2011

Да, кажется, что KeyPreview не учитывается ElementHost, вот обходной путь:

Получите из ElementHost и переопределите ProcessCmdKey, когда результат base.ProcessCmdKey говорит, что «не обработан», передайте сообщениеparent, даже если это не ваша основная форма, таким образом ваша основная форма получит ее, потому что другие элементы управления winforms будут работать правильно.Вот образец ...

public class KeyPreviewEnabledElementHost : ElementHost
{
    public KeyPreviewEnabledElementHost()
    {
    }

    [DllImport("user32.dll")]
    public static extern int SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam); 

    protected override bool ProcessCmdKey(ref System.Windows.Forms.Message m, System.Windows.Forms.Keys keyData)
    {
        bool processed = base.ProcessCmdKey(ref m, keyData);

        if (!processed)
        {
            SendMessage(Parent.Handle, m.Msg, m.WParam, m.LParam);
        }

        return processed;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...