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

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

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

Ответы [ 2 ]

0 голосов
/ 18 мая 2011

Я действительно решил проблему с помощью следующего кода в представлении 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 для переключения на другое представление без необходимости используйте мышь.

0 голосов
/ 17 мая 2011

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

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

...