Windows GetKeyState 和 GetAsyncKeyState 區別

#define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)
#define KEYUP(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1)

GetKeyState
使用::GetKeyState()返回一個short型的數,short型是16位有符號的數據類型,如果要查詢的鍵被按下,返回值最高位被置1,則這個數表示負數,所以可以用<0或>0來判斷。

0x8000是16進制數,用2進製表示爲1000 0000 0000 0000, &是按位與。同樣,如果鍵被按下,返回值最高位爲1,則1xxx xxxx xxxx xxxx & 1000 0000 0000 0000得到的結果爲1,否則爲0,同樣可以判斷最高位的值。

需要說明的是,::GetKeyState()只能在鍵盤消息處理程序中使用,因爲它只有在線程從消息隊列中讀取鍵盤消息時纔會報告被查詢鍵的狀態,如果需要在鍵盤消息處理程序以外查詢按鍵狀態,則需要使用::GetAsyncKeyState()來代替。

函數原型:
SHORT GetKeyState(int nVirtKey);
函數功能:
該函數檢取指定虛擬鍵的狀態。該狀態指定此鍵是UP狀態,DOWN狀態,還是被觸發的(開關每次按下此鍵時進行切換)。
參數:
nVrtKey:定義一虛擬鍵。若要求的虛擬鍵是字母或數字(A~Z,a~z或0~9),nVirtKey 必須被置爲相應字符的ASCII碼值,對於其他的鍵,nVirtKey必須是一虛擬鍵碼。若使用非英語鍵盤佈局,則取值在ASCIIa~z和0~9的虛擬鍵被用於定義絕大多數的字符鍵。例如,對於德語鍵盤格式,值爲ASCII0(OX4F)的虛擬鍵指的是"0"鍵,而VK_OEM_1指"帶變音的0鍵"
返回值:
返回值給出了給定虛擬鍵的狀態,狀態如下:
若高序位爲1,則鍵處於DOWN狀態,否則爲UP狀態。
若低序位爲1,則鍵被觸發。例如CAPS LOCK鍵,被找開時將被觸發。若低序位置爲0,則鍵被關閉,且不被觸發。觸發鍵在鍵盤上的指示燈,當鍵被觸發時即亮,鍵不被觸發時即滅。
備註:
當給定線程從它的消息隊列中讀鍵消息時,該函數返回的鍵狀態發生改變。該狀態井不反映與硬件相關的中斷級的狀態。使用SetKeyboardState可獲取這一信息。

欲檢取所有虛擬鍵狀態信息,可以使用SetKeyboardState函數。

應用程序可以使用虛擬鍵碼常數VK_SHIFT,VK_CONTROL和VK_MENU作爲nVirtKey參數的值。它給出shift,ctrl或alt鍵的值而不區分左右鍵,應用程序也可以使用如下的虛擬鍵碼常數作nVirtKey的值來區分前述鍵的左鍵、右鍵的情形。

VK_LSHIFT,VK_RSHIFT;VK_LCONTROL,VK_RCONTROL;VK_LMENU,VK_RMENU

僅當應用程序調用GetKeyboardSlate,SetKeyboardState,GetAsyncKeystate;GetKeyState和MapVirtualKey函數時,纔可用這些區分左右鍵的常數。

Windows CE:GetKeyState函數僅能用於檢查如下虛擬鍵的DOWN狀態。
VK_LSHIFT,VKRSHIFT,VK_LCONTROL;VK_RCONTROL;VK_LMENU,VK_RMENU

GetKeyState函數只能用於檢查VK_CAPITAL虛擬鍵的觸發狀態。


GetAsyncKeyState

就是調用GetAsyncKeyState函數得到某個鍵的狀態,然後判斷返回值的最高位是不是1,如果是表示這個處於按下狀態。
1、&與操作,&0x8000就是判斷這個返回值的high-order bit(高位字節)
2、如果high-order bit是1,則是按下狀態,否則UP狀態

GetAsyncKeyState 取異步鍵狀態。
比如,一般情況下,你可以在操作系統的控制面板中設置鼠標左右鍵的映射(實際的鼠標左鍵可以映射成右鍵點擊事件),或者通過程序也可以這樣設置,這樣就產生了物理鍵狀態(實際的),邏輯鍵狀態(虛擬的)。

使用 GetKeyState,GetKeyboardState,等函數得到的就是邏輯鍵狀態。而GetAsyncKeyState 讀取的是物理鍵狀態,也是就是不管你怎麼鼠標鍵盤映射,它只讀取實際的按鍵狀態。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章