Как я могу конвертировать сообщения мыши Win32 в события мыши WPF?

У меня есть элемент управления Win32 (OpenGL), который мне нужно встроить в наше приложение WPF. Он должен реагировать на события мыши и клавиатуры и распространять их.

Мы создали производный экземпляр HwndHost для размещения собственного окна и переопределили функцию WndProc в этом классе. Чтобы распространять сообщения win32 в WPF, я обрабатываю определенные сообщения мыши и сопоставляю их с событиями WPF, а затем использую статический класс InputManager для их вызова.

Проблема в том, что когда я иду к ним, координаты мыши портятся.

Вот пример кода, который ям, чтобы поднять события:

IntPtr MyHwndHost::WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, bool% handled)
{
  switch (msg)
  {
    case WM_LBUTTONDOWN:
    {
        MouseButtonEventArgs^ eventArgs = gcnew MouseButtonEventArgs(
          Mouse::PrimaryDevice,
          Environment::TickCount,
          MouseButton::Left);

        eventArgs->RoutedEvent = UIElement::PreviewMouseDownEvent;
        eventArgs->Source = this;

        // Raise the WPF event from the specified WPF event source.
        InputManager::Current->ProcessInput(eventArgs);

        eventArgs->RoutedEvent = UIElement::MouseDownEvent;
        InputManager::Current->ProcessInput(eventArgs);

        CommandManager::InvalidateRequerySuggested();

        handled = true;
        return IntPtr::Zero;
    }
    break;
  }

  return HwndHost::WndProc(hwnd, msg, wParam, lParam, handled);
}

Когда мои обработчики событий WPF запущены, и я пытаюсь получить координаты мыши (например,e.GetPosition((IInputElement) sender)) Я получаю неправильные значения (и они всегда являются одинаковыми значениями независимо от того, где исходное событие произошло в моем контроле).

Кажется, что значения, которые я получаю, связаны с расположением экрана окна WPF, в котором размещается приложение, потому что они меняются при изменении положения окна, но неТ соответствуют также фактическому местоположению окна приложения.

я думаю этоможет как-то связано с внутренним состоянием WPF InputManager и с тем фактом, что приватное полеMouseDevice._inputSource являетсяnull когда мои события поднимаются, но мои эксперименты с .net отражением убеждаютТам никаких результатов не было.

Я нене знаю, что еще попробовать. Поддержка клавиатуры работает из коробки, это 'только поддержка мыши, что я могуработать правильно.

Ответы на вопрос(3)

Ваш ответ на вопрос