小编Jos*_*osh的帖子

如何将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);
}
Run Code Online (Sandbox Code Playgroud)

当我的WPF事件处理程序被触发并且我尝试检索鼠标坐标(例如e.GetPosition((IInputElement) sender))时,我收到错误的值(并且无论我的控件中原始事件发生在何处,它们总是相同的值).

我得到的值似乎与托管应用程序的WPF窗口的屏幕位置有关,因为它们在窗口位置发生变化时会发生变化,但它们也不对应于应用程序窗口的实际位置.

我认为这可能与WPF InputManager的内部状态有关,而且私有字段MouseDevice._inputSourcenull …

.net wpf winapi hwndhost

11
推荐指数
1
解决办法
1619
查看次数

如何根据两个补丁之间的差异创建补丁

我已经在我的本地 SVN 工作副本中进行了修改,创建了一个补丁,并将该补丁提交给存储库维护者。

存储库维护者合并了该补丁,但我对该服务器的访问又中断了一周(我的 VPN 令牌已过期,获取新令牌需要一些时间),因此在它再次备份之前,我无法更新我的工作副本。

与此同时,我对我的本地工作目录进行了进一步的修改,并创建了第二个补丁。

如何将两个补丁之间的差异作为 .patch 文件发送给 repo 维护者以应用我的最新更改?

或者,有没有一种方法可以在离线状态下将 SVN 更新应用到我的本地存储库(例如通过电子邮件发送给我的文件)。

注意:我在 Windows 上,使用 TortoiseSVN,但会尝试任何工具,让我到达我需要的地方。

svn tortoisesvn

5
推荐指数
1
解决办法
1316
查看次数

标签 统计

.net ×1

hwndhost ×1

svn ×1

tortoisesvn ×1

winapi ×1

wpf ×1