c語言怎麼監聽鍵盤按鍵

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

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語言程式設計輸入程式, c語言 編寫程式,使從鍵盤輸入的三位數倒著輸出

getchar函式 字元輸入函式 的作用是從終端輸入一個字元。用法 getchar 如 char a a getchar 表示從鍵盤輸入一個字元,並把他賦值給字元變數a 還可以用scanf 語句輸入資料。用法 scanf 格式控制,地址表列 如int a scanf d a scanf d d d ...

電腦按鍵滑鼠錯亂怎麼辦,鍵盤按鍵錯亂怎麼修復

這種現象一般是鍵盤或滑鼠用久了後,出現的機械磨損現象,屬於硬體問題 換個滑鼠就好了。鍵盤按鍵錯亂怎麼修復 電腦鍵盤功能錯亂,一般是受潮了,導致的。用熱吹風機吹一下試試會不會好?如果好不了,建議換一個。一般晶片在小鍵盤。鍵盤硬體有問題,可以換一個試試,如果更換了一切正常,基本就是鍵盤硬體的問題了。鍵盤...

電腦鍵盤怎麼拆卸,臺式電腦鍵盤的按鍵如何拆開,如何安裝

ch陳先生 1 字母鍵,數字等小鍵都好拆,直接用螺絲刀在它們的左側撬開即可。2 但是有些鍵盤,它竟然還在背面上了螺絲,所以必須先到鍵盤背後卸下螺絲。3 拆完鍵盤背後螺絲後,開啟蓋子,掀開鋪在上面的那張白紙,會看見圖中所示的兩個螺絲,把空格鍵鎖住了,用螺絲刀給卸了。4 卸下這兩版個螺絲後,輕而易舉地就...