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