我有一个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反射进行的实验没有产生任何结果。我真的不知道还能尝试什么。键盘支持可以直接使用,只有鼠标位置支持无法正确工作。