Как я могу передавать сообщения WM_KEYDOWN элементу управления WinForms внутри CWinFormsView?

#winforms #onkeydown

#winforms #onkeydown

Вопрос:

У меня есть элемент управления WinForms (скажем, C) внутри CWinFormsView V приложения MDI. C переопределяет метод OnKeyDown. Я также переопределил OnMouseUp в C и вызываю там метод Focus(), поэтому, когда я нажимаю внутри C, сообщения с клавиатуры переходят непосредственно к нему, и все работает правильно.

Однако я хотел бы иметь возможность управлять C с помощью клавиатуры при переключении на V без необходимости щелкать внутри представления. Как я могу этого добиться? Нужно ли мне перехватывать сообщения WM_KEYDOWN в V и передавать их вручную размещенному элементу управления (другими словами, на C)? C на самом деле является дочерним окном V, разве оно не должно каким-то образом работать автоматически?

Комментарии:

1. Переопределите метод OnInitDialog() представления. В случае базовой реализации установите фокус на один из элементов управления и верните FALSE .

Ответ №1:

Если я понял ваш вопрос, то самый простой способ — заставить V перенаправлять нажатия на C.

Посмотрите на Form.KeyPreview — для V — который позволит V видеть все нажатия клавиш, когда он или один из его дочерних элементов находятся в фокусе. Затем вы можете переслать его в C.

Ответ №2:

На самом деле я решил проблему с помощью следующего кода в V представлении:

 BOOL CMyView::PreTranslateMessage(MSG* pMsg)
{
    if( pMsg->message == WM_KEYDOWN || pMsg->message == WM_MOUSEWHEEL )
    {
        ::SendMessage( (HWND) m_myControl->Handle.ToInt32(), pMsg->message, pMsg->wParam, pMsg->lParam );
    }

    return CWinFormsView::PreTranslateMessage(pMsg);
}
  

Также я удалил код, который устанавливает фокус на C при щелчке мыши. Таким образом, он никогда не фокусируется, но получает сообщения родительского представления (мне нужны WM_KEYDOWN и WM_MOUSEWHEEL) из PreTranslateMessage. Важно не настраивать фокус, потому что в противном случае я потерял бы возможность переключаться между представлениями MDI с помощью Ctrl Tab (если был сфокусирован на C). Итак, теперь я могу свободно переключаться между ними, затем, когда V становится активным, я могу использовать клавиши для управления C, но я все еще могу использовать Ctrl Tab для переключения на другой вид без использования мыши.