在WPF应用程序中注入鼠标输入

我一直在努力将输入注入WPF应用程序。 这个项目的难点在于我需要能够将输入注入到应用程序中,即使它在后台运行(即另一个应用程序具有输入焦点)。 因此使用SendInput()函数是不可能的。

到目前为止,我的键盘输入工作正常,但在注入鼠标输入时遇到了麻烦。

我使用Spy ++观察当我物理单击鼠标按钮时发送到WPF窗口的窗口消息。 然后,我手动制作这些相同的鼠标消息(例如WM_LBUTTONDOWNWM_LBUTTONUP ),并将它们显式发送到WPF窗口以模拟鼠标输入。

不幸的是,这并不像预期的那样工作(即使我为了测试目的而将WPF窗口设置为前景窗口)。

我在测试WPF窗口中添加了一个按钮,点击时会显示一个消息框。 当我手动将光标定位在按钮上时,注入适当的鼠标消息不会导致按钮被点击,但是(即,点击的事件不是由WPF框架触发的)。

如果我在实际对话框(客户端区域)上添加一个鼠标点击处理程序,如果将光标置于对话框本身上并注入与以前相同的窗口消息,则该处理程序会被调用:

this.MouseLeftButtonDown += WndMouseDown;

public void WndMouseDown(object sender, EventArgs e)
{
   ...
}

奇怪的是,如果我将按钮的按压模式更改为按按钮(即,它被认为是在鼠标按下而不是默认鼠标上按下),那么当我注入与以前相同的消息时,按钮点击事件现在被触发。 (值得一提的是,上面示例中的处理程序正确地触发了鼠标下降和起伏,所以看起来WPF框架不会成功处理这两个消息。)

似乎还有一些其他标准需要实现,以便WPF框架激发点击鼠标事件。 有人知道如何在WPF内部处理鼠标输入,或者为什么它不会将鼠标的上下信息解释为点击按钮?

(值得一提的是,这种方法[发送窗口消息]在普通的Win32窗口上工作得很好,比如开始 - >运行对话框。这里的区别在于WPF只有一个物理的Win32窗口,其余的都是WPF特定的,这意味着所有的窗口消息转到该顶层窗口而不是实际的按钮。)

我一直在寻找答案,并会欣赏任何想法或想法。


我强烈建议去UIAutomation路线。 您可以通过窗口句柄创建一个AutomationElement。 爬到按钮并调用它。 我只想知道你如何设法让键盘输入工作。 我目前正试图解决相反的问题。 如何获得一个WPF窗口(我设法通过Win32调用获得一个hWnd),以响应虚拟键盘消息。 我已经在有问题的窗口中记录了++间谍会话,并且没有成功复制它的输入。


使用UI自动化来做到这一点 - 试图通过窗口消息手动模拟输入是一个教科书的错误,就像试图开始对俄罗斯的土地战争。


你的策略基本上是合理的,但为了发送消息到另一个进程拥有的窗口,你必须先注册消息。

这是一篇解释整个业务的文章。 示例代码不幸在VB中,但我相信这不会阻止你。

链接地址: http://www.djcxy.com/p/44925.html

上一篇: Injecting Mouse Input in WPF Applications

下一篇: Best way to implement keyboard shortcuts in a Windows Forms application?