判斷在呼叫函式時,鍵值是向上還是向下,以及該鍵是否是在先前呼叫 GetAsyncKeyState 後按下的。
語法
SHORT GetAsyncKeyState(
[in] int vKey
);
參數
[in] vKey
類型:int
虛擬金鑰代碼。 欲了解更多資訊,請參閱 虛擬鑰匙代碼。
你可以用左右區分常數來指定某些鍵。 詳情請參閱備註區。
返回值
類型: 短
若函式成功,回傳值會指定該鍵自上次呼叫 GetAsyncKeyState 後是否被按下,以及鍵目前是上或下。 如果設定了最高有效位元,則該金鑰為下行;若設定為最低有效位元,則該金鑰是在上一次呼叫 GetAsyncKeyState 後按下的。 不過,你不應該依賴最後的行為;欲了解更多資訊,請參閱備註。
以下情況下,回傳值為零:
- 目前的桌面不是主動式桌面
- 前景執行緒屬於另一個程序,桌面不允許掛鉤或日誌記錄。
備註
GetAsyncKeyState 功能是用滑鼠按鍵操作的。 不過,它檢查的是實體滑鼠按鈕的狀態,而不是物理按鈕映射到的邏輯滑鼠按鈕。 例如, GetAsyncKeyState(VK_LBUTTON) 呼叫總是回傳左滑鼠物理按鈕的狀態,無論它對應到左鍵還是右鍵邏輯鍵。 你可以透過呼叫 GetSystemMetrics(SM_SWAPBUTTON)來判斷系統目前將實體滑鼠按鍵映射到邏輯滑鼠按鍵的狀況。
若滑鼠按鈕被調換,則回傳 TRUE。
雖然回傳值的最低有效位元表示該鍵自上次查詢以來是否被按下,但由於 Windows 的搶占式多工特性,其他應用程式可能會呼叫 GetAsyncKeyState 並接收「最近按下」的位元,而非你的應用程式。 回傳值中最低有效位元的行為嚴格保留,以相容 16 位元 Windows 應用程式(非搶占式),不應依賴它。
你可以用虛擬金鑰的常數 VK_SHIFT、 VK_CONTROL 和 VK_MENU 作為 vKey 參數的值。 這會顯示 SHIFT、CTRL 或 ALT 鍵的狀態,且不區分左右鍵。
你可以使用以下虛擬金鑰的程式碼常數作為 vKey 的值,來區分這些金鑰的左右實例。
| Code | Meaning |
|---|---|
| VK_LSHIFT | 左Shift鍵。 |
| VK_RSHIFT | 右Shift鍵。 |
| VK_LCONTROL | 左控制鍵。 |
| VK_RCONTROL | 右控制鍵。 |
| VK_LMENU | 左選單鍵。 |
| VK_RMENU | 右選單鍵。 |
這些左右區分常數僅在呼叫 GetKeyboardState、 SetKeyboardState、 GetAsyncKeyState、 GetKeyState 和 MapVirtualKey 函式時可用。
Example
while (GetMessage(&msg, nullptr, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
switch (msg.message)
{
case WM_KEYDOWN:
if ((GetAsyncKeyState(VK_ESCAPE) & 0x01) && bRunning)
{
Stop();
}
break;
}
}
GitHub 上 Windows 傳統範例 的範例。
需求
| Requirement | 價值觀 |
|---|---|
| 最低支援的用戶端 | Windows 2000 Professional [僅限傳統型應用程式] |
| 支援的最低伺服器 | Windows 2000 Server [僅限傳統型應用程式] |
| 目標平臺 | 窗戶 |
| Header | winuser.h (包括 Windows.h) |
| Library | User32.lib |
| DLL | User32.dll |