c# - 单击winforms控件时如何释放wpf控件捕获的鼠标

标签 c# wpf winforms

我有一个托管 wpf 控件的 winforms 应用程序。在某些时候 wpf 控件捕获鼠标。我想在控件外单击鼠标时释放它。我知道我可以订阅 PreviewMouseDownOutsideCapturedElement 事件或订阅 PreviewMouseDown 并执行 HitTest 。然后在事件处理程序中释放鼠标捕获。

我不知道的是,松开鼠标后如何让鼠标点击通过?例如,如果我在 wpf 控件捕获鼠标时单击 winforms 按钮,我想同时执行这两项操作 - 释放鼠标并单击按钮。因为现在我必须执行双击才能按下按钮:第一次单击取消捕获,第二次单击按钮。我想知道是否有办法避免它。

最佳答案

由于没有响应,我通过使用 winapi 模拟鼠标点击解决了我的问题:

AddHandler(Mouse.PreviewMouseDownOutsideCapturedElementEvent, 
                   new MouseButtonEventHandler((s, e) =>
                       {
                           Mouse.Capture(null);
                           if (e.LeftButton == MouseButtonState.Pressed)
                           {
                               MouseInterop.LeftClick();
                           }
                        }));


public static class MouseInterop
{
    public static void LeftClick()
    {
        var x = (uint) Cursor.Position.X;
        var y = (uint) Cursor.Position.Y;
        mouse_event(MOUSEEVENTF_LEFTDOWN, x, y, 0, 0);
    }

    [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
    private static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint cButtons, uint dwExtraInfo);

    private const int MOUSEEVENTF_LEFTDOWN = 0x02;
}

这显然是我没有找到更好的方法的黑客行为。

编辑:

回到这个问题。上述方法具有使其无法使用的副作用。例如,当您使用 WPF 控件捕获鼠标时,应用程序的其他部分将禁用所有 MouseOver 效果。

我实际上最终使用了本地鼠标和键盘钩子(Hook),而不是鼠标捕获。

关于c# - 单击winforms控件时如何释放wpf控件捕获的鼠标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25402819/

相关文章:

c# - 如何使 Livecharts 数据工具提示仅显示当前悬停?

c# - 无法从 Microsoft.Extensions.Logging.Abstractions 加载类型

c# - Gtk.Application.Invoke 不工作

C# 获取数据库行中的所有项目

c# - 为什么 IsFocused 没有在 Label 上触发

c# - C#中的多个并行任务不会缩短计算时间

c# - 递归乘法

c# - 在 Web 应用程序中使用 WPF 在内存中创建 3D 视觉对象。适用于 Cassini,不适用于 IIS

c# - 堆栈面板内的图像高度

c# - DataGridViewComboBoxColumn 选定值/索引