Jak przekonwertować komunikaty myszy Win32 na zdarzenia myszy WPF?

Mam kontrolę Win32 (OpenGL), którą muszę osadzić w naszej aplikacji WPF. Musi reagować na zdarzenia myszy i klawiatury oraz je propagować.

Stworzyłem instancję pochodną HwndHost, aby obsługiwać rodzime okno i przesłoniłem funkcję WndProc w tej klasie. Aby propagować komunikaty win32 do WPF, obsługuję określone komunikaty myszy i odwzorowuję je na zdarzenia WPF, a następnie używam statycznej klasy InputManager do ich podnoszenia.

Problem polega na tym, że kiedy idę do nich, współrzędne myszy są zawalone.

Oto przykład kodu, którego używam do podnoszenia wydarzeń:

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);
}

Gdy moje procedury obsługi zdarzeń WPF są wyzwalane i próbuję pobrać współrzędne myszy (np.e.GetPosition((IInputElement) sender)) Otrzymuję błędne wartości (i zawsze są to te same wartości, niezależnie od tego, gdzie w mojej kontroli wystąpiło oryginalne zdarzenie).

Wartości, które otrzymuję, wydają się być związane z położeniem ekranu okna WPF, które obsługuje aplikację, ponieważ zmieniają się one, gdy zmienia się pozycja okna, ale nie odpowiadają one również rzeczywistej lokalizacji okna aplikacji.

Myślę, że tomoże mieć coś wspólnego ze stanem wewnętrznym WPF InputManager i faktem, że pole prywatneMouseDevice._inputSource jestnull kiedy moje wydarzenia są podniesione, ale moje eksperymenty z odbiciem .net nie przyniosły tam żadnych rezultatów.

Naprawdę nie wiem, czego jeszcze spróbować. Obsługa klawiatury działała po wyjęciu z pudełka, tylko obsługa lokalizacji myszy nie działa poprawnie.

questionAnswers(3)

yourAnswerToTheQuestion