7

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

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

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

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

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

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

this.MouseLeftButtonDown += WndMouseDown;

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

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

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

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

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

4

3 回答 3

3

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

于 2009-10-06T03:33:12.900 回答
1

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

于 2009-09-04T03:39:43.060 回答
0

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

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

于 2009-09-04T04:01:43.133 回答