C ++ / CLI: окно взаимодействия не настроено должным образом - PullRequest
0 голосов
/ 25 января 2010

Я пытаюсь загрузить элемент управления WPF в приложение C ++ / CLI, используя класс HwndSource .

UBOOL MyWindowWrapper::Init(const HWND InParentWindowHandle) {
    Interop::HwndSourceParameters sourceParams( "WindowName" );
    sourceParams.PositionX = 0;
    sourceParams.PositionY = 0;
    sourceParams.ParentWindow = (IntPtr)InParentWindowHandle;
    sourceParams.WindowStyle = (WS_VISIBLE | WS_CHILD);
    sourceParams.HwndSourceHook = nullptr;

    InteropWindow = gcnew Interop::HwndSource(sourceParams);

    Control = gcnew MyWPFUserControl();
    InteropWindow->RootVisual = Control;

    InteropWindow->AddHook( gcnew Interop::HwndSourceHook(
        this, &MyWindowWrapper::MessageHookFunction ) );
    return TRUE;
}

И я определяю функцию Hook, чтобы события клавиатуры передавались в окно:

IntPtr MyWindowWrapper::MessageHookFunction( IntPtr HWnd, int Msg,
        IntPtr WParam, IntPtr LParam, bool% OutHandled ) {
    IntPtr Result = (IntPtr)0;
    OutHandled = false;

    if( Msg == WM_GETDLGCODE ) {
        OutHandled = true;

        // This tells Windows that we'll need keyboard events for this control
        Result = IntPtr( DLGC_WANTALLKEYS | DLGC_WANTCHARS | DLGC_WANTMESSAGE );
    }
    return Result;
}

А вот мои проблемы:

  • Заголовок окна пуст (поэтому параметр «WindowName» не учитывается)
  • Передаются только некоторые события клавиатуры: пробел, управление, стрелки в порядке, но я не могу ввести любой символ во всех текстовых полях

Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 08 июня 2010

Существует известная несовместимость взаимодействия WPF в собственном модальном диалоге .

Подведение итогов:

Из-за деталей реализации, сообщения WM_CHAR проглатываются модальным диалоговым насосом сообщений в функции IsDialogMessage(), прежде чем они попадают под ваш контроль. Вы можете заставить себя получить их, обрабатывая WM_GETDLGCODE в функции хука и возвращая DLGC_WANTCHARS.

0 голосов
/ 26 января 2010

Относительно пустого заголовка - это потому, что имя окна HwndSource не имеет никакого отношения к заголовку окна. Окно HwndSource, которое создает код выше, является дочерним элементом окна, представленного InParentWindowHandle. Именно это окно, чей текст используется для строки заголовка. Вы должны вызвать SetWindowText(), используя этот HWND, чтобы установить заголовок окна.

Что касается проблемы с набором текста, вы уверены, что вам нужно добавить хук? Я только создал небольшие тестовые приложения с интеграцией WPF / Win32, но я не помню, чтобы мне приходилось делать что-то особенное, чтобы гарантировать, что элементы управления WPF получили весь ввод с клавиатуры.

...