以编程方式触发MouseLeftButtonDown事件

问题描述:

我试图以编程方式手动触发WPF控件上的MouseLeftButtonDown事件,因为我使用Microsoft Surface SDK,它不会触发MouseLeftButtonDown事件,而是触发ContactDown事件。基本上我试图将MouseLeftButtonDown事件向下推送到控件,以在处理ContactDown事件时触发控件上的正确行为。以编程方式触发MouseLeftButtonDown事件

我猜我必须以某种方式使用控件上的RaiseEvent方法来做到这一点与MouseButtonEventArgs,但我有一些麻烦搞清楚参数。

在此先感谢您的帮助!

您可以使用Win32 interop欺骗鼠标和键盘事件。调查MSDN/pinvoke.net上的SendInput函数。

请注意,这将导致系统和其他应用程序认为鼠标实际上被点击。如果您只想启动WPF事件,请尝试RaiseEvent(new RoutedEventArgs(UIElement.MouseLeftButtonDownEvent))

+0

感谢您的提示。我收到您发布的RaiseEvent方法的异常: 'System.Windows.RoutedEventArgs'类型的对象无法转换为类型'System.Windows.Input.MouseButtonEventArgs'。 – RajenK 2010-06-15 11:18:17

+0

尝试'RaiseEvent(新的MouseButtonEventArgs(Mouse.PrimaryDevice,Environment.TickCount,MouseButton.Left));' – devios1 2010-06-15 12:08:23

+1

InvalidOperationException发生那个: 每个RoutedEventArgs必须有一个非空的RoutedEvent与它关联。 – RajenK 2010-06-21 14:23:24

希望在控件中触发某个事件常常是代码中的设计问题的指示器。事件处理程序应该触发行为,而不是执行它。我建议您将执行由MouseLeftButtonDown事件处理程序触发的操作的代码移动到单独的方法中。然后可以从ContactDown事件处理程序调用相同的方法。

+0

我同意这将是最好的解决方案,但由于我没有访问此特定控件的源代码(只有二进制文件),恐怕这是行不通的。 – RajenK 2010-06-13 20:53:01

var grid = new Grid();    

int timestamp = new TimeSpan(DateTime.Now.Ticks).Milliseconds; 
const MouseButton mouseButton = MouseButton.Left; 
var mouseDownEvent = 
    new MouseButtonEventArgs(Mouse.PrimaryDevice, timestamp, mouseButton) { 
     RoutedEvent = UIElement.MouseLeftButtonDownEvent, 
     Source = grid, 
    }; 

这是我在测试代码中触发事件的方式。