2011-07-15 59 views
0

我需要編寫一個Windows應用程序,該應用程序監視鍵擊而不管焦點。當它檢測到特定的擊鍵時(特別是),它需要執行某些操作。監視C#中的特定擊鍵

如何監控Windows中從C#中的擊鍵而不管焦點如何?

+0

看一看這裏:http://stackoverflow.com/questions/1100285/c-how-to-detect-the-currently-pressed-key/1927644#1927644 –

+0

我認爲的總稱這是** Keylogger ** – V4Vendetta

+0

Yip聽起來像一種鍵盤記錄器給我。我看到了一種非常簡單的方式來在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-不要攔截它 – 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 

然後在你的循環/定時器

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#

你需要編寫的代碼到一個類所這個類添加到Windows service.Instaniate到啓動(窗口)方法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; 
    }