使用SendKeys 类的需要注意的问题

时间:2021-01-21 06:52:31

SendKeys类可以用于模拟键盘输入,但是如果第一次实现这样的功能时,往往会遇到一点问题,例如我们在一个Form中放置一个Button控件,在Button的Click事件中,编写如下的代码,然后打开“新建 文本文档 (6).txt”文本文件,希望每次点击按钮,都会往文本文件中输入一个A:

IntPtr hwnd = FindWindow(null, "新建 文本文档 (6).txt - 记事本"); //获取句柄
if (hwnd.ToInt32() != 0)
{
    if (SetForegroundWindow(hwnd))
        //SendKeys.Send("^{V}");
        SendKeys.SendWait(Keys.A.ToString()); //只有第一次输出成功,第2次按钮就没的用了
}
else { MessageBox.Show("记事本没有运行 "); }

实际运行时,我们会发现,只有第一次按下按钮,才会成功输入A,而接下来,不管你怎么按,都不会再输入A了,这是为什么呢?遇到这样的问题,最好的方法就是先不要着急,打开MSDN,仔细看看其中的说明,发现这一段文字描述后,你应该就会有主意了:

注意:

已针对 .NET Framework 3.0 更新了 SendKeys 类,以便在 Windows Vista 中运行的应用程序中使用该类。Windows Vista 的增强安全性(称为用户帐户控制或 UAC)可以防止以前的实现按预期工作。

SendKeys 类易出现计时问题,某些开发人员必须解决这些问题。更新的实现仍易出现计时问题,但它略快,可能需要对解决方法进行更改。SendKeys 类尝试先使用以前的实现,如果失败,则使用新实现。因此,在不同的操作系统上,SendKeys 类的行为可能不同。此外,如果 SendKeys 类使用新实现,则将消息发送到另一进程时,SendWait 方法不会等待处理这些消息。

如果无论操作系统如何应用程序都依赖一致的行为,则通过在 app.config 文件中添加下列应用程序设置,可以强制 SendKeys 类使用新实现。

<appSettings>

<add key="SendKeys" value="SendInput"/>

</appSettings>

这段文字指出,SendKeys类会出现计时问题,.NET Framework3.0中的实现也一样会出现,只不过很快会忽略掉,所以我们可以使用新的实现来解决问题。

添加一个应用程序配置文件,添加上述的配置后,再次运行程序,会发现一般情况下都能输入正常了,我还没有遇到“仍易出现计时问题”的情况:_)