2011-09-14 142 views
7

我正在製作一個全局捕獲鍵盤輸入的Windows應用程序。當用戶使用CTRL + ALT + G快捷鍵組合時,應用程序使用爲什麼SendKey.Send()只能在一段時間內工作一次?

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()); 
} 

其他的一切在我的項目僅僅是起毛。

更新1

我有關於這個主題更多的問題,但我沒有時間來繼續這方面的工作今天。我實現了Jon Raynor的建議,即使用app.config方法取得某種程度的成功。一旦我隔離了我的新問題,我會發佈一個編輯並可能關閉此問題,如果我的應用程序按預期運行。

+0

你是什麼意思,通過全球捕獲鍵盤輸入?如果你這樣做並不意味着你也收到了GUID。當然你想RegisterHotKey。 –

+0

我正在爲此項目使用RegisterHotKey pinvoke。捕獲熱鍵很容易,問題在於SendKey.Send()方法。 – LamdaComplex

+0

當你在你的代碼中調用SendKey.Send? –

回答

7

您可能會遇到計時問題。按照MSDN documentation

SendKeys類已更新爲.NET Framework 3.0 使其在Windows Vista上運行的應用程序使用。 Windows Vista的安全性(稱爲用戶帳戶控制或UAC) 可防止以前的實現按預期工作。

SendKeys類容易受到計時問題的影響,一些 開發人員必須解決。更新後的實現是 仍然容易受到時間問題的影響,但速度稍快,並且可能需要更改變通方法 。 SendKeys類嘗試先使用先前的實現 ,如果失敗,則使用新的 實現。因此,SendKeys類可能在不同的操作系統上的行爲不同 。此外,SendKeys類 使用新的實現時,SendWait方法將不會等待 郵件發送到另一個進程時處理。

如果您的應用程序依賴於一致的行爲無論 操作系統,您可以強制SendKeys類中加入以下應用程序設置將 app.config文件,以使用新 實施。

<appSettings> 

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

</appSettings> 

要強制SendKeys類使用以前的實現,使用 值「JournalHook」代替。

+0

感謝您的回覆。這確實有助於我朝正確的方向發展。儘管這應該教會我更仔細地閱讀MSDN文檔。我的應用程序仍然存在問題,但它們可能是其他問題的結果。如果我孤立這個問題,我可能會更新這個問題。 – LamdaComplex

1

這不會解決您確切的問題,但是是一種替代方法。我之前已經在託管代碼中嘗試過全局密鑰鉤子。這是一個痛苦。儘管它聽起來很古怪而且原始,但我喜歡AutoHotKey。你可以用它做一些非常有用的事情。

下面是一個示例,它可以實現全局鉤住Ctrl + Alt + G和鍵入guid的要求。最好的部分是編譯內聯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然後下載兩個額外的腳本herehere

+0

像你一樣,這個實驗迄今爲止只帶來了挫敗感,特別是考慮到它應該是多麼容易。但是事實上,我對傳統熱鍵命令在Windows中的實現方式知之甚少。我會嘗試一下你的AutoHotKey解決方案,並儘快更新這個問題。 – LamdaComplex

相關問題