c語言怎麼監聽鍵盤按鍵

時間 2021-10-15 00:23:17

1樓:匿名使用者

在microsoft windows 中,鍵盤和滑鼠是兩個標準的使用者輸入源,在一些交疊的操作中通常相互補充使用。當然,滑鼠在今天的應用程式中比10年前使用得更為廣泛。甚至在一些應用程式中,我們更習慣於使用滑鼠,例如在遊戲、畫圖程式、**程式,以及web創覽器等程式中就是這樣。

然而,我們可以不使用滑鼠,但絕對不能從一般的pc中拆掉鍵盤。

windows程式獲得鍵盤輸入的方式:鍵盤輸入以訊息的形式傳遞給程式的視窗過程。實際上,第一次學習訊息時,鍵盤就是一個明顯的例子:訊息應該傳遞給應用程式的資訊型別。

windows用8種不同的訊息來傳遞不同的鍵盤事件。這好像太多了,但是(就像我們所看到的一樣)程式可以忽略其中至少一半的訊息而不會有任何問題。並且,在大多數情況下,這些訊息中包含的鍵盤資訊會多於程式所需要的。

處理鍵盤的部分工作就是識別出哪些訊息是重要的,哪些是不重要的。

鍵盤基礎知識

雖然應用程式在很多情況下可以通過滑鼠實現資訊的輸入,但到現在為止鍵盤仍然是pc機中不可替代的重要輸入裝置。

用鍵盤當作輸入裝置,每當使用者按下或釋放某一個鍵時,會產生一箇中斷,該中斷啟用鍵盤驅動程式keyboard.drv來對鍵盤中斷進行處理。 keyboard.

drv程式會根據使用者的不同操作進行編碼,然後呼叫windows使用者模組user.exe生成鍵盤訊息,並將該訊息傳送到訊息佇列中等候處理。

1.掃描碼和虛擬碼

掃描碼對應著鍵盤上的不同鍵,每一個鍵被按下或釋放時,都會產生一個唯一的掃描碼作為本身的標識。掃描碼依賴於具體的硬體裝置,即當相同的鍵被按下或釋放時,在不同的機器上可能產生不同的掃描碼。在程式中通常使用由windows系統定義的與具體裝置無關的虛擬碼。

在擊鍵產生掃描碼的同時,鍵盤驅動程式keyboard.drv擷取鍵的掃描碼,然後將其翻譯成對應的虛擬碼,再將掃描碼和虛擬碼一齊編碼形成鍵盤訊息。所以,最後傳送到訊息佇列的鍵盤訊息中,既包含了掃描碼又包含了虛擬碼。

經常使用的虛擬碼在windows.**件中定義,常用虛擬碼的數值、常量符號和含義如表所示。

取值(16進位制) 常量符號 含義

01 vk_lbutton 滑鼠左鍵

02 vk_rbutton 滑鼠右鍵

03 vk_cancel break中斷鍵

04 vk_mbutton 滑鼠中鍵

05-07 -- 未定義

08 vk_back (backspace)鍵

09 vk_tab tab鍵

0a-0b -- 未定義

0c vk_clear clear鍵

0d vk_return enter鍵

0e-0f -- 未定義

10 vk_shift shift鍵

11 vk_control ctrl鍵

12 vk_menu alt鍵

13 vk_pause pause鍵

14 vk_captial capslock鍵

15-19 -- 漢字系統保留

1a -- 未定義

1b vk_escape esc鍵

1c-1f -- 漢字系統保留

20 vk_space 空格鍵

21 vk_prior pageup鍵

22 vk_next pagedown鍵

23 vk_end end鍵

24 vk_home home鍵

25 vk_left ←(left arrow)鍵

26 vk_up ↑(up arrow)鍵

27 vk_right →(right arrow)鍵

28 vk_down ↓(down arrow)鍵

29 vk_select select鍵

2a -- oem保留

2b vk_execute execute鍵

2c vk_snapshot print screen鍵

2d vk_insert insert鍵

2e vk_delete delete鍵

2f vk_help help鍵

30-39 vk_0-vk_9 數字鍵0-9

3a-40 -- 未定義

41-5a vk_a-vk_z 字母鍵a-z

5b-5f -- 未定義

60-69 vk_numpad0-vk_numpad9 小鍵盤數字鍵0-9

6a vk_multiply *(乘號)鍵

6b vk_add +(加號)鍵

6c vk_sepapator 分隔符鍵

6e vk_subtract -(減號)鍵

6f vk_decimal .(小數點)鍵

70-87 vk_divide /(除號)鍵

88-8f vk_f1-vk_f24 f1-f24功能鍵

90 vk_numberlock number lock鍵

91 vk_scroll scroll lock鍵

92-b9 -- 未定義

ba-c0 -- oem保留

c1-da -- 未定義

db_e4 -- oem保留

e5 -- 未定義

e6 -- oem保留

e7-e8 -- 未定義

e9-f5 -- oem保留

f6-fe -- 未定義

2.輸入焦點

同一時刻,windows中可能有多個不同的程式在執行,也就是說有多個視窗同時存在。這時,鍵盤由多個視窗共享,但只有一個視窗能夠接收到鍵盤訊息,這個能夠接收鍵盤訊息的視窗被稱為擁有輸入焦點的視窗。

擁有輸入焦點的視窗應該是當前的活動視窗,或者是活動視窗的子視窗,其標題和邊框會以高亮度顯示,以區別於其他視窗。擁有輸入焦點的也可以是圖示而不是視窗,此時,windows也將訊息傳送給圖示,只是訊息的格式略有不同。

視窗過程可以通過傳送wm_setfocus和 wm_killfocus訊息使窗體獲得或失去輸入焦點。程式也可以通過捕獲wm_setfocus和wm_killfocus訊息來判斷窗體何時獲得或失去輸入焦點。其中wm_setfocus訊息表示視窗正獲得輸入焦點,wm_ killfocus訊息表示視窗正失去輸入焦點。

3.鍵盤訊息

鍵盤訊息分為系統鍵訊息和非系統鍵訊息。系統鍵訊息是指由aft鍵和其他鍵組合而產生的按鍵訊息。當系統鍵被按下時產生wm_ syskeydown訊息,當系統鍵被釋放時產生wm_syskeyup訊息。

aft鍵與其他鍵形成的組合鍵通常用於對程式選單和系統選單進行選擇,或用於在不同的程式之間進行切換。因此,系統鍵訊息應該交由windows進行處理,使用者所編制的程式一般不處理系統鍵訊息,而是將這些訊息交由defwindowproc函式進行處理。如果使用者想對系統鍵訊息進行處理,應該在處理完這些訊息後,再將其傳送給defwindowproc函式,使得windows系統能夠正常工作。

某些擊鍵訊息可以被轉換成字元訊息,例如字母鍵、數字鍵等。而有些鍵只能產生按鍵訊息而沒有字元訊息,例如 shift鍵、insert鍵等。訊息迴圈中的 translatemessage函式可以實現從擊鍵訊息向字元訊息的轉化。

當getmessage函式捕獲一個wm_syskeydown訊息或 wm_keydown訊息後,translatemessage函式判斷產生該訊息的鍵是否能夠被轉換成字元訊息,如果能,就將該訊息轉換成字元訊息,再通過dispatchmessape函式將轉換後的字元訊息傳送到訊息佇列中去。字元訊息共有以下四種,如表所示。

字元 系統字元 非系統字元

普通字元 wm_syschar wm_char

死字元 wm_sysdeadchar wm_deadchar

其中死字元是由某些特殊鍵盤上的按鍵所造成的,windows一般忽略死字元所產生的訊息。

windows的訊息一般是通過一個msg結構體變數傳送給訊息處理函式的。對於鍵盤訊息, msg結構體變數的各個域中較重要的是lparam域和 wparam域。wparam域用於儲存按鍵的虛擬鍵**或字元的ascii碼。

對於非字元訊息,wparam域儲存按鍵的虛擬健**;對於字元訊息, wparam域不儲存字元的ascii碼。lparam域則用於儲存擊鍵時產生的附加資訊,實際上一個32位的lparam變數被分為六部分,記錄了以下相關資訊:重複次數、oem掃描碼、擴充套件鍵標誌、關聯鍵標誌、前一擊鍵狀態和轉換狀態。

lparam域各位的含義如表所示。

位數 含義

0-15 擊鍵重複次數累加

16-23 oem掃描碼

24 是否為擴充套件鍵

25-28 未定義

29 是否便用關聯鍵,及alt鍵是否同時按下。

30 前一次擊鍵狀態,0表示該鍵前一次狀態為抬起,1表示前一次狀態為按下

31 轉換狀態

按鍵的次序不同,產生的訊息也不相同。例如,按下並釋放1鍵,讀過程依次產生如表所示三條訊息。按下1鍵所產生的訊息和wparam的取值

訊息 wparam變數取值

wm_keydown 虛擬碼1

wm_char ascii碼“1”

wm_keyup 虛擬碼1

如果按下shift鍵後再按下1鍵並釋放,則依次產生如表所示的訊息。按下 shift鍵後按 1健所產生的訊息和 wparam的取值

訊息 wparam變數取值

wm_keydown 虛擬碼 vk_shift

wm_keydown 虛擬碼 vk_1

wm_char ascii碼 “1”

wm_keyup 虛擬碼 vk_1

wm_keyup 虛擬碼 vk_shif

鍵盤應用例項

下面通過一個應用程式例項來說明在實際程式設計中如何處理鍵盤訊息。

2樓:

c語言可以監聽的,不過需要你自己編寫中斷服務程式,寫一個鍵盤的中斷服務程式,當有鍵盤相應的時候,用你自己的程式去處理就好了!

3樓:匿名使用者

c語言裡面沒有自帶的這個函式,只有阻塞等待的getc等等,只能自己去實現了,不用底層提供函式的話,你自己用執行緒編寫個,主執行緒查詢stdin快取裡面有沒有資料進來,子程序阻塞等待輸入資料,這樣也可以實現應該,我沒有親自去做,不過除了底層提供給你介面,用現成的好像只能這樣了。

鍵盤沒壞,個別按鍵失靈怎麼辦,鍵盤部分按鍵突然失靈

辦法有三種 第一,更換鍵盤。個別按鍵失靈,也與可能是鍵盤壞了。也就是某個鍵對應的電路部分,出現了問題,只能整個更換鍵盤。第三,檢查一下,是不是鍵盤裡面,有異物。拆開鍵盤,把異物取出來即可。執行軟體後,上面顯示的是原來的按鍵位置,你按住要更改的鍵不放,將其拖入下面要代替它的位置即可。重啟後即可生效。 ...

鍵盤按鍵太硬,電腦鍵盤按鍵很硬,按不下去怎麼辦啊

如果是想改善那就先找一下導致硬的主要原因解決掉,也可以試用幾天看一下,實在不行就換,以後就要注意健盤避免發生這樣的現象。這種機械的東西還要怎麼改進啊,出廠就已經定死了。樓主還是重新買乙個吧,現在鍵盤很便宜的。好點的話花個百來塊錢買個羅技微軟鍵鼠套。一般的話就買個雙飛燕赤兔什麼的。手感都不錯。那換吧 ...

利用c語言能實現按鍵精靈的模擬按鍵功能嗎

使用這個windows api bool postmessage uint message,wparam wparam 0,lparam lparam 0 throw 不過直接這麼簡單寫的話,人家是驅動級防護,開始就hook全域性api,個人直覺,估計還是給和諧。不信你拿記事本試試是可以用的,到了遊...