2018年2月6日作者:ExcelOffice 鍵盤的工作原理: 當(dāng)用戶按下鍵盤上的一個(gè)鍵時(shí),鍵盤內(nèi)的芯片會(huì)檢測到這個(gè)動(dòng)作,并把這個(gè)信號傳送到計(jì)算機(jī)。如何區(qū)別是哪一個(gè)鍵被按下了呢?鍵盤上的所有按鍵都有一個(gè)編碼,稱作鍵盤掃描碼。當(dāng)你按下一個(gè)鍵時(shí),這個(gè)鍵的掃描碼就被傳給系統(tǒng)。掃描碼是跟具體的硬件相關(guān)的,同一個(gè)鍵,在不同鍵盤上的掃描碼有可能不同。鍵盤控制器就是將這個(gè)掃描碼傳給計(jì)算機(jī),然后交給鍵盤驅(qū)動(dòng)程序。鍵盤驅(qū)動(dòng)程序會(huì)完成相關(guān)的工作,并把這個(gè)掃描碼轉(zhuǎn)換為鍵盤虛擬碼。什么是虛擬碼呢?因?yàn)閽呙璐a與硬件相關(guān),不具有通用性,為了統(tǒng)一鍵盤上所有鍵的編碼,于是就提出了虛擬碼概念。無論什么鍵盤,同一個(gè)按鍵的虛擬碼總是相同的,這樣程序就可以識(shí)別了。簡單點(diǎn)說,虛擬碼就是我們經(jīng)??梢钥吹降南馰K_A,VK_B這樣的常數(shù),比如鍵A的虛擬碼是65,寫成16進(jìn)制就是&H41,注意,人們經(jīng)常用16進(jìn)制來表示虛擬碼。當(dāng)鍵盤驅(qū)動(dòng)程序把掃描碼轉(zhuǎn)換為虛擬碼后,會(huì)把這個(gè)鍵盤操作的掃描碼和虛擬碼還有其它信息一起傳遞給操作系統(tǒng)。然后操作系統(tǒng)則會(huì)把這些信息封裝在一個(gè)消息中,并把這個(gè)鍵盤消息插入到消息列隊(duì)。最后,要是不出意外的話,這個(gè)鍵盤消息最終會(huì)被送到當(dāng)前的活動(dòng)窗口那里,活動(dòng)窗口所在的應(yīng)用程序接收到這個(gè)消息后,就知道鍵盤上哪個(gè)鍵被按下,也就可以決定該作出什么響應(yīng)給用戶了。這個(gè)過程可以簡單的如下表示: 用戶按下按鍵—–鍵盤驅(qū)動(dòng)程序?qū)⒋耸录鬟f給操作系統(tǒng)—–操作系統(tǒng)將鍵盤事件插入消息隊(duì)列—–鍵盤消息被發(fā)送到當(dāng)前活動(dòng)窗口。 api函數(shù)keybd_event可以實(shí)現(xiàn)鍵盤的各種個(gè)操作。 它的語法如下: Visual Basic VOID WINAPI keybd_event( _In_ BYTE bVk, _In_ BYTE bScan, _In_ DWORD dwFlags, _In_ ULONG_PTR dwExtraInfo );
其中bVk參數(shù)為按鍵的虛擬碼,具體的按鍵的虛擬碼可以見鏈接。 bScan參數(shù) 為按鍵的掃描碼,一般可以不提供,直接輸入0。 以下代碼是api函數(shù)keybd_event實(shí)現(xiàn)按下F2鍵的效果: Visual Basic Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long) Const KEYEVENTF_KEYUP = &H2 Const VK_F2 = &H71 Sub QQ1722187970() '按下F2 keybd_event VK_F2, 0, 0, 0 '釋放F2 keybd_event VK_F2, 0, KEYEVENTF_KEYUP, 0 End Sub
|
|