2011-09-14 18 views
7

私はキーボード入力をグローバルにキャプチャするWindowsアプリケーションを作っています。ユーザが使用するときにCTRL + ALT + Gショートカットコンボは、アプリケーションがどのようなテキストフィールドにgeneraged GUIDを入力するSendKey.Send()はなぜしばらくしか動かないのですか?

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

を使用してフォーカスされています。そして、それは入力を取っているアプリケーションにかかわらずこれを行うべきです。

これは、最初にCTRL + ALT + Gを入力したときに意図したとおりに機能しますが、その後の試行では何も起こらず、まれにしか成功しません。

私はすべてが非常に単純で一貫している必要があります。私はそれをテストしましたが、SendKey.Send()メソッドは毎回動作しません。

私の問題に関連するものはすべてGoogleで検索しましたが、これまでに何も機能していません。

誰でも洞察力はありますか?

編集1: 私はSendKey.SendWait()も同様に使いました。このキーボードショートカットのアプローチを使用して、新しいGUIDを生成するより応答性の高い方法が本当に必要です。

EDIT 2:私のプロジェクトで他の

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

すべてがちょうどです:

/* 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); 

イベントコードは非常に簡単である:以下

は、コードの重要な部分であります毛羽。

アップデート1

私はこのテーマについて多くの質問を持っていますが、私は今日のために、この上で作業を継続するための時間の外にしています。私は、Jon Raynorのapp.configアプローチをある程度成功させるという提案を実装しました。私が新しい問題を特定したら、編集を投稿し、アプリケーションが意図したとおりに機能するようにすると、この質問を閉じることができます。

+0

キーボード入力をグローバルにキャプチャすることはどういう意味ですか?もしあなたがそれをしているのであれば、あなたはGUIDも受け取ります。確かにRegisterHotKeyが必要です。 –

+0

私はこのプロジェクトにRegisterHotKey pinvokeを使用しています。ホットキーをキャプチャするのは簡単ですが、問題はSendKey.Send()メソッドにあります。 – LamdaComplex

+0

あなたのコードでSendKey.Sendを呼び出すと? –

答えて

7

タイミングの問題が発生している可能性があります。 MSDN documentationによると:

のSendKeysクラスは、Windows Vista上で動作するアプリケーションでの使用を可能に への.NET Framework 3.0用に更新されました。 Windows Vistaの拡張 セキュリティ(ユーザーアカウントコントロールまたはUAC) は、以前の実装が期待どおりに機能しないようにします。

SendKeysクラスはタイミングの問題を抱えていますが、一部の の開発者はこの問題を回避する必要があります。更新された実装はまだタイミング問題の影響を受けやすい ですが、若干速く、 には回避策を変更する必要があります。 SendKeysクラスは先に実装した を使用しようとしますが、失敗した場合は新しい 実装を使用します。その結果、SendKeysクラスは異なるオペレーティングシステム上で異なる動作をすることがあります( )。さらに、SendKeysクラス が新しい実装を使用する場合、SendWaitメソッドは、 メッセージが別のプロセスに送信されるときに処理されるのを待機しません。お使いのアプリケーションに関係なく 、オペレーティング・システムの一貫した動作に依存している場合

は、あなたの app.configファイルに次のアプリケーション設定を追加することによって、新しい 実装を使用するのSendKeysクラスを強制することができます。

<appSettings> 

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

</appSettings> 

代わり 値を使用して、以前の実装を使用するために「JournalHookを」のSendKeysクラスを強制します。

+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% 
} 

は、2つの追加のスクリプトherehereをダウンロードし、その後AutoHotKey_Lをインストールします。

+0

あなたと同じように、この実験では、これまでのところ、どれほど簡単かを考慮して、これまでのところ不満を感じていませんでした。しかし、やはり私は、Windowsで従来のホットキーコマンドがどのように実装されているかについてはほとんど知らなかった。私はあなたのAutoHotKeyソリューションを試し、すぐにこの質問を更新します。 – LamdaComplex

関連する問題