我有一个winforms应用程序,它承载一个wpf控件。在某些时候,wpf控件捕获鼠标。我想在控件外单击鼠标时释放它。我知道我可以订阅PreviewMouseDownOutsideCapturedElement
事件或订阅PreviewMouseDown
并执行命中测试。然后在事件处理程序中释放鼠标捕获。
我不知道的是,在释放鼠标后,如何让鼠标点击?例如,如果我在wpf控件捕获鼠标时单击winforms按钮,我想同时执行这两个操作 - 释放鼠标并单击按钮。因为现在我必须执行双击以按下按钮:首先单击取消捕获,然后第二个按下按钮。我想知道是否有办法避免它。
答案 0 :(得分:0)
由于没有回复我通过使用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效果。
我实际上最终使用的是本地鼠标和键盘钩子,而不是鼠标捕捉。