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

时间:2009-09-03 03:20:05

标签: wpf mouse inject

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

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

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

不幸的是,这不能按预期工作(即使我出于测试目的,已将WPF窗口设置为前景窗口)。

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

如果我在实际对话框(客户区)上添加鼠标点击处理程序,那么当我将光标放在对话框本身并注入与以前相同的窗口消息时,该处理程序被调用:

this.MouseLeftButtonDown += WndMouseDown;

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

奇怪的是,如果我将按钮的推模式更改为按下(即,它被认为是单击鼠标按下而不是默认鼠标向上),则当我像以前一样注入相同的消息时,按钮单击事件现在被触发。 (值得一提的是,上面示例中的处理程序正确地触发了鼠标和鼠标,因此WPF框架似乎确实成功处理了这两个消息。)

似乎还需要满足一些其他标准,以便WPF框架触发鼠标单击事件。有没有人知道如何在WPF内部处理鼠标输入,或者为什么它不是单击按钮来解释我的鼠标上下消息?

(值得一提的是,这种方法[发送窗口消息]在普通的Win32窗口上工作正常,例如Start-> Run对话框。这里的区别是WPF只有一个物理Win32窗口,其余的是WPF特定的,这意味着所有窗口消息都会转到顶级窗口而不是实际按钮。)

我一直在寻找答案,并且会感激任何的想法或想法。

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

使用UI自动化执行此操作 - 尝试通过窗口消息手动模拟输入是一个教科书错误,就像试图对俄罗斯发动陆战一样。

答案 2 :(得分:0)

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

Here is an article explaining the whole business。不幸的是,示例代码在VB中,但我确信这不会阻止你。