我有一个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);
}
Run Code Online (Sandbox Code Playgroud)
当我的WPF事件处理程序被触发并且我尝试检索鼠标坐标(例如e.GetPosition((IInputElement) sender))时,我收到错误的值(并且无论我的控件中原始事件发生在何处,它们总是相同的值).
我得到的值似乎与托管应用程序的WPF窗口的屏幕位置有关,因为它们在窗口位置发生变化时会发生变化,但它们也不对应于应用程序窗口的实际位置.
我认为这可能与WPF InputManager的内部状态有关,而且私有字段MouseDevice._inputSource是null …
我已经在我的本地 SVN 工作副本中进行了修改,创建了一个补丁,并将该补丁提交给存储库维护者。
存储库维护者合并了该补丁,但我对该服务器的访问又中断了一周(我的 VPN 令牌已过期,获取新令牌需要一些时间),因此在它再次备份之前,我无法更新我的工作副本。
与此同时,我对我的本地工作目录进行了进一步的修改,并创建了第二个补丁。
如何将两个补丁之间的差异作为 .patch 文件发送给 repo 维护者以应用我的最新更改?
或者,有没有一种方法可以在离线状态下将 SVN 更新应用到我的本地存储库(例如通过电子邮件发送给我的文件)。
注意:我在 Windows 上,使用 TortoiseSVN,但会尝试任何工具,让我到达我需要的地方。