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

dre*_*jer 6 wpf mouse inject

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

到目前为止,我已经有键盘输入工作,但是在注入鼠标输入时遇到了麻烦.

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

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

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

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

this.MouseLeftButtonDown += WndMouseDown;

public void WndMouseDown(object sender, EventArgs e)
{
   ...
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

我一直在寻找这个答案的高低,并会欣赏任何想法或想法.

Ana*_*tts 1

使用 UI Automation 来做到这一点 - 尝试通过窗口消息手动模拟输入是教科书式的错误,就像试图对俄罗斯发动陆地战争一样。