Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 单击winforms控件时如何释放wpf控件捕获的鼠标_C#_Wpf_Winforms - Fatal编程技术网

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

C# 单击winforms控件时如何释放wpf控件捕获的鼠标,c#,wpf,winforms,C#,Wpf,Winforms,我有一个winforms应用程序,它承载一个wpf控件。在某个时刻,wpf控件捕获鼠标。我想在鼠标在控件外单击时释放它。我知道我可以订阅PreviewMouseDownOutsideCapturedElement事件或订阅PreviewMouseDown并执行命中测试。然后在事件处理程序中释放鼠标捕获 我不知道的是,在我释放鼠标后,如何让鼠标点击通过?例如,如果我在wpf控件捕获鼠标时单击winforms按钮,我想同时执行释放鼠标和单击按钮。因为现在我必须执行双击来按下按钮:第一次单击取消捕获,

我有一个winforms应用程序,它承载一个wpf控件。在某个时刻,wpf控件捕获鼠标。我想在鼠标在控件外单击时释放它。我知道我可以订阅
PreviewMouseDownOutsideCapturedElement
事件或订阅
PreviewMouseDown
并执行命中测试。然后在事件处理程序中释放鼠标捕获


我不知道的是,在我释放鼠标后,如何让鼠标点击通过?例如,如果我在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控件捕获鼠标时,应用程序的其他部分将禁用所有鼠标悬停效果


事实上,我最终使用了本地鼠标和键盘挂钩,而不是鼠标捕获。

可能与此相关,尽管它是关于单击窗口按钮的