为什么SendKey.Send()只能偶尔使用一次?

Lam*_*lex 7 .net c# keyboard-shortcuts keyboard-events

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

SendKey.Send(Guid.NewGuid().ToString());
Run Code Online (Sandbox Code Playgroud)

在任何文本字段中键入生成的GUID.无论应用程序采取何种输入,它都应该这样做.

当你第一次键入CTRL + ALT + G时,它的工作方式与我的预期完全相同,但后续尝试不会产生任何结果,或者只是非常罕见的成功.

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

我看过Google的任何与我的问题相关的内容,但到目前为止还没有任何工作.

有人有任何见解吗?

编辑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);
Run Code Online (Sandbox Code Playgroud)

事件代码非常简单:

void hook_KeyPressed(object sender, KeyPressedEventArgs e)
{
    SendKeys.SendWait(Guid.NewGuid().ToString());
}
Run Code Online (Sandbox Code Playgroud)

我项目中的其他任何事情都只是松懈.

更新1:

关于这个问题,我确实有更多的问题,但是今天我没有时间继续研究这个问题.我已经实现了Jon Raynor建议使用app.config方法取得一定程度的成功.一旦我解决了我的新问题,我将发布一个编辑,如果我的应用程序按预期运行,可能会关闭此问题.

Jon*_*nor 7

您可能遇到计时问题.根据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> 
Run Code Online (Sandbox Code Playgroud)

要强制SendKeys类使用先前的实现,请改为使用值"JournalHook".