我一直致力于将输入注入 WPF 应用程序。使这个项目变得困难的是我需要能够将输入注入应用程序,即使它在后台运行(即另一个应用程序具有输入焦点)。因此,使用SendInput()函数是不可能的。
到目前为止,我的键盘输入工作正常,但在注入鼠标输入时遇到了麻烦。
当我物理单击鼠标按钮时,我使用 Spy++ 观察发送到 WPF 窗口的窗口消息。然后,我只需手动制作这些相同的鼠标消息(例如WM_LBUTTONDOWN
和WM_LBUTTONUP
)并将它们显式发送到 WPF 窗口以模拟鼠标输入。
不幸的是,这并没有按预期工作(即使我出于测试目的将 WPF 窗口设置为前景窗口)。
我在我的测试 WPF 窗口中添加了一个按钮,单击该按钮会显示一个消息框。但是,当我手动将光标放在按钮上时注入适当的鼠标消息不会导致按钮被单击(即,WPF 框架不会触发 clicked 事件)。
如果我在实际对话框(客户区)上添加鼠标点击处理程序,如果我将光标放在对话框本身上并注入与以前相同的窗口消息,则该处理程序会被调用:
this.MouseLeftButtonDown += WndMouseDown;
public void WndMouseDown(object sender, EventArgs e)
{
...
}
奇怪的是,如果我将按钮的推送模式更改为 Press(即,它被认为是在鼠标按下而不是默认的鼠标向上单击),当我注入与以前相同的消息时,现在会触发按钮单击事件。(值得一提的是,上面示例中的处理程序正确地触发了鼠标按下和升起,因此 WPF 框架似乎确实成功地处理了这两个消息。)
似乎还需要满足一些其他条件才能让 WPF 框架触发鼠标单击事件。有谁知道 WPF 内部如何处理鼠标输入,或者为什么它不将我的鼠标上下消息解释为单击按钮?
(值得一提的是,这种方法[发送窗口消息]在普通的 Win32 窗口上运行良好,例如开始->运行对话框。这里的区别是 WPF 只有一个物理 Win32 窗口,其余的都是 WPF 特定的,这意味着所有窗口消息转到该顶级窗口而不是实际按钮。)
我一直在寻找这个问题的答案,并会感激任何想法或想法。