2011-09-25 182 views
3

我有一些直接WPF 3.5控件处理左键单击,我需要在Surface应用程序(SDK 1.0)中使用。我面临的问题是,默认情况下不起作用。我正在考虑将每个控件包装在SurfaceContentControl中,并将ContactTouchDownContactTapGesture事件翻译成相应的MouseDown事件。注入/模拟WPF路由鼠标点击事件

问题归结为 - 如何“注入”或模拟任意路由鼠标事件?我试过InputManager.Current.ProcessInput(),但没有太多。任何帮助表示赞赏。

回答

1

尝试使用AutomationPeer类。例如ButtonAutomationPeer用于Button。以下代码启动点击。

ButtonAutomationPeer peer = new ButtonAutomationPeer(button); 
IInvokeProvider provider = (IInvokeProvider)peer.GetPattern(PatternInterface.Invoke); 
provider.Invoke(); 
+0

谢谢。如果我想点击一个'Path'或者任何非''Button'?怎么办?如果我不想特别点击任何内容,但只想在(X,Y)处发送点击并查看谁获得了它,该怎么办?如果你知道目标实际上是一个'Button',你的解决方案就很好。 – wpfwannabe

1

evpo的想法很有意思(尽管如果您使用自定义控件,他们很少会使用AutomationPeer类)。

您不能简单地通过向应用程序发送WM_MOUSE *事件来“注入”鼠标输入... WPF确实会处理消息,但是当它确定该事件的鼠标位置时,它将查询实际鼠标API,而不是尝试你在WM中粘贴的东西。

所以你所能做的只是告诉窗口移动实际的鼠标光标,并像点击/释放按钮一样操作。一些代码,你可以使用这是在http://www.codeproject.com/KB/system/globalmousekeyboardlib.aspx

也就是说,虽然技术上可以做到这一点,它吮吸......你有一个昂贵的多点触控设备,但1)显示在其2鼠标光标)限制它的任意部分被用来'单点触摸'(并且这些任意部分中只有一个是一次和3个),想出一个任意的方法来确定你将哪个手指当作鼠标控制的手指