为什么SendKey.Send()只在一段时间内工作

本文关键字:一段时间 工作 SendKey Send 为什么 | 更新日期: 2023-09-27 18:08:31

我正在制作一个全局捕获键盘输入的Windows应用程序。当用户使用CTRL + ALT + G快捷键组合时,应用程序使用

SendKey.Send(Guid.NewGuid().ToString());

在焦点文本字段中键入生成的GUID。无论应用程序是否接受输入,它都应该这样做。

当你第一次输入CTRL + ALT + G时,它就像我想的那样工作,但随后的尝试没有任何结果,或者只是非常罕见的成功。

我的意思是,这一切都应该非常简单和一致。我有一个工作的全局键盘钩子,它一直工作,我已经测试过了,但是SendKey.Send()方法并不是每次都工作。

我已经在谷歌上搜索了所有与我的问题相关的东西,但到目前为止还没有任何效果。

有人有什么见解吗?

编辑1 :我也尝试过使用SendKey.SendWait(),做同样的事情。我真的想要一种响应更快的方式来使用这种键盘快捷方式来生成新的GUID。

编辑2 :

下面是代码的主要部分:

/* Initialization Code Here */
// register the event that is fired after the key press.
hook.KeyPressed += new EventHandler<KeyPressedEventArgs>(hook_KeyPressed);
// register the control + alt + F12 combination as hot key.
hook.RegisterHotKey((uint)(HotkeyModifiers.Control | HotkeyModifiers.Alt), Keys.G);

事件代码非常简单:

void hook_KeyPressed(object sender, KeyPressedEventArgs e)
{
    SendKeys.SendWait(Guid.NewGuid().ToString());
}

在我的项目中其他的一切都只是绒毛。

Update 1:

关于这个主题我确实有更多的问题,但是我今天没有时间继续做这个了。我已经实现了Jon Raynor关于使用app.config方法的建议,并取得了一定程度的成功。一旦我隔离了我的新问题,我将发布一个编辑,如果我的应用程序正常运行,可能会关闭这个问题。

为什么SendKey.Send()只在一段时间内工作

您可能会遇到时间问题。根据MSDN文档:

SendKeys类已经在。net Framework 3.0中更新为使其在Windows Vista上运行的应用程序中使用。增强的Windows Vista的安全性(称为用户帐户控制或UAC)防止先前的实现按预期工作。

SendKeys类容易受到时间问题的影响开发人员不得不解决这个问题。更新后的实现如下仍然容易受到时间问题的影响,但稍微快一点,可能要求对变通方法进行更改。SendKeys类尝试使用首先使用之前的实现,如果失败,则使用新的实现。因此,SendKeys类的行为可能会有所不同在不同的操作系统上。另外,当SendKeys类使用新的实现,SendWait方法将不会等待发送到另一个进程时要处理的消息。

如果您的应用程序依赖于一致的行为,而不管在操作系统中,您可以强制SendKeys类使用new控件中添加以下应用程序设置来实现app.config文件。

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

强制SendKeys类使用以前的实现,使用

这不会解决您的确切问题,但这是另一种方法。我以前在托管代码中尝试过全局键挂钩。这很痛苦。虽然听起来很做作和原始,但我喜欢自动热键。你可以用它做一些非常强大的事情。

下面是一个示例,它实现了全局绑定Ctrl+Alt+G和键入向导的要求。最好的部分是它编译内联c#,所以你仍然可以使用System.Guid.NewGuid()。一旦你有了一个工作脚本,你可以把它编译成一个exe,这样没有安装AutoHotKey的人就可以运行它了。

#NoEnv
#SingleInstance
#Include CLR.ahk
#Include COM.ahk
;minimize delay between key presses
SetKeyDelay, -1
;create c# code
CLR_Start()
_g := CLR_CompileC#("class c{public string GetNewGuid(){return System.Guid.NewGuid().ToString();}}", "System.dll").CreateInstance("c")
;hook keyboard ctrl+alt+g
^!g::InsertGuid()
;generate a guid and type it
InsertGuid() {
    global
    local guid := _g.GetNewGuid()
    Send,%guid%
}

如果你想尝试一下,安装AutoHotKey_L,然后在这里和这里下载两个额外的脚本。