2011-07-15 3 views
0

フォーカスに関係なくキーストロークを監視するWindowsアプリケーションを作成する必要があります。特定のキーストローク(具体的にはCtrl + V)を検出すると、特定の操作を実行する必要があります。C#で特定のキーストロークを監視する

Windowsのキーストロークをフォーカスに関係なくC#からどのように監視できますか?

+0

はこちらをご覧:http://stackoverflow.com/questions/1100285/c-how-to-detect-the-currently-pressed-key/1927644#1927644 –

+0

私はのための一般的な用語を考えますこれは** Keylogger ** – V4Vendetta

+0

私には一種のキーロガーのような音がします。 Pythonでこれを行うための非常に単純な方法を見ましたが、20行のコードや何かのようでしたが、それは別の日です。 :) – Jethro

答えて

2

私はあなたの質問を完全に理解していませんが、ウィンドウフォーカスに関係なくグローバルキーを登録したい場合は、RegisterHotKey windows APIを使用できます。

+0

RegisterHotKeyを使用して[Ctrl + V]を登録しても、ユーザーはこのキーボードショートカットを他のアプリケーションのクリップボードから引き継ぐことができますか?私がこれを書いているのは、プログラムが自動的にクリップボード内の次の項目をキューに入れて、ユーザーが[Ctrl + v]を繰り返し押して(アプリからアプリへのデータ入力をしている) – Ozzah

+0

RegisterHotKeyのMSDN記述に基づいて、グローバルに動作するはずです。したがって、アクティブでない場合でも、プログラム内のすべてのメッセージをキューに入れることができるはずです。しかし、既にCtrl + Vはシステムに登録されているので、わかりません。ちょうど試して。 –

+0

私は試してみましたが、私のアプリケーションはCtrl + Vをキャプチャしてフォーカスを当てたウィンドウを受信するのを止めています。これは私が望むものではありません:http://stackoverflow.com/questions/6838540/c-detecting-ctrlv-with-registerhotkey-but- not-intercepting-it – Ozzah

1

本当に簡単な方法は、GetASyncKeyStateを使用することです。 私はゲームのためだけに使用しますが、ここではうまくいくと思います。

インポートこの:

その後
[DllImport("user32.dll")] 
static extern short GetAsyncKeyState(System.Windows.Forms.Keys vKey); 

あなたが宣言することができ、それは一度だけ、それが押されています場合に発生する必要がある場合は、あなただけの

if(GetAsyncKeyState(Keys.ControlKey) && GetAsyncKeyState(Keys.K)) 
{ 
//DO SOME STUFF!! 
} 

(ループまたはタイマーで)行うことができます

bool oldK; //at class scope 

ループ/タイマー

あなたは窓のclass.Then開始に窓のservice.Instaniateにこのクラスを追加()メソッドにコードを記述する必要があり
if(!oldK && GetAsyncKeyState(Keys.ControlKey) && GetAsyncKeyState(Keys.K)) 
{ 
    //DO SOME STUFF!! 
} 
oldK = GetAsyncKeyState(Keys.K); 
+0

これは、キーが押されたときに通知される方法ではなく、そのキーが現在押されているかどうかを判断する方法のように聞こえる。 – Gabe

0

チェックアウトこの記事Detecting and recording key strokes in C#

は、いくつかのタイマー にバッファリングコードをservice.olace例えば

 this.timerBuffFlush = new System.Timers.Timer(); 
     this.timerBuffFlush.Enabled = true; 
     this.timerBuffFlush.Elapsed += new System.Timers.ElapsedEventHandler(this.timerBuffFlush_Elapsed); 
     this.timerBufferFlush.Interval = 60000; 
    } 
関連する問題