C 全域性鍵盤檢測GetAsyncKeyState

2021-07-10 18:48:41 字數 1468 閱讀 2428

**:

我們在程式設計中有時候需要用到全域性鍵盤按鍵(通俗的講就是:自己的程式在任何時候都能接收鍵盤按鍵),聽起來有點像鍵盤鉤子。最近在用c#準備寫乙個螢幕錄影的軟體,想到使用者可以通過鍵盤來進行開始、停止等操作。當這個問題來的時候我們可能都會想到用 keypress 、keydown、keyup等來處理鍵盤按鍵。至於它們三個的區別筆者就不在描述,自己可以度娘。但是keydown等事件只能響應自己程式的按鍵,也就是說當我們的焦點不在自己程式或者控制項上,就不能接收鍵盤的按鍵。舉個簡單的例子:比如你在form1中添 form1_keydown事件。也就是當使用者在窗體上按下了你指定的按鍵,程式會響應你寫的事件;但如果當你把程式最小化或者開啟網頁,你再按下你設定的按鍵,看程式會有沒有響應!好了不多說進入今天的主題。

為了自己程式在任何情況下(退出了就完蛋了哈)都能接收自己的按鍵,我可以用到 getasynckeystate api函式。這個函式通俗點講就是:確定使用者當前是否按下了鍵盤上的乙個鍵。函式原型:int getasynckeystate(int vkey);返回值 int型 如果當前按下的鍵是你傳遞過的鍵 return !0 

否則 return 0 ;引數 int型 也就是要判斷的按鍵nvirtkey(虛擬按鍵)值,其實就是按鍵對應的ascii碼。

知道這個函式我該怎麼使用的呢,首先api函式都在windows dll中的,一般我們用的函式都在user32.dll中。c#如何呼叫dll,首先匯入乙個 using system.runtime.interopservices;命名空間,要問我為什麼是這個命名空間,其實我也不知道,知道怎麼用就行。我們監控鍵盤所以我們就要每時每刻,來監聽是否按下我設定的按鍵。在筆者的程式中新增乙個了timer控制項 interval=100 也就是100毫秒監聽一次。直接貼上**吧:

using system;

using system.collections.generic;

using system.componentmodel;

using system.data;

using system.drawing;

using system.linq;

using system.text;

using system.windows.forms;

//呼叫dll所需的命名空間

using system.runtime.interopservices;

namespace test

//匯入dll檔案

[dllimport("user32.dll")]

//函式宣告

public static extern int getasynckeystate(int vkey);

//時鐘監控事件 interval =100

c 全域性鍵盤鉤子

using system using system.collections.generic using system.text using system.windows.forms using system.runtime.interopservices using system.diagnosti...

C 全域性鍵盤監視

public class interceptkeys wh journalrecord 0 wh journalplayback 1 wh keyboard 2 wh getmessage 3 wh callwndproc 4 wh cbt 5 wh sysmsgfilter 6 wh mouse ...

C 全域性鍵盤監聽

using system using system.collections.generic using system.text using system.runtime.interopservices using system.windows.forms using system.reflectio...