RAWKEYBOARD 結構 (winuser.h)
包含鍵盤狀態的相關信息。
語法
typedef struct tagRAWKEYBOARD {
USHORT MakeCode;
USHORT Flags;
USHORT Reserved;
USHORT VKey;
UINT Message;
ULONG ExtraInformation;
} RAWKEYBOARD, *PRAWKEYBOARD, *LPRAWKEYBOARD;
成員
MakeCode
類型:USHORT
指定與按鍵按下相關聯的 掃描程式代碼。 請參閱。
Flags
類型:USHORT
掃描程式代碼資訊的旗標。 它可以是下列其中一或多個專案:
價值 | 意義 |
---|---|
RI_KEY_MAKE 0 | 機碼已關閉。 |
RI_KEY_BREAK 1 | 金鑰已啟動。 |
RI_KEY_E0 2 | 掃描碼具有 E0 前置詞。 |
RI_KEY_E1 4 | 掃描碼具有 E1 前置詞。 |
Reserved
類型:USHORT
保留;必須是零。
VKey
類型:USHORT
對應的 舊版虛擬金鑰程式代碼。
Message
類型:UINT
對應的 舊版鍵盤視窗訊息,例如 WM_KEYDOWN、WM_SYSKEYDOWN等等。
ExtraInformation
類型:ULONG
事件的裝置特定其他資訊。
言論
KEYBOARD_OVERRUN_MAKE_CODE 是一種特殊的 MakeCode 值,當按下無效或無法辨識的按鍵組合,或按下的按鍵數目超過此鍵盤的限制時所傳送的值。
case WM_INPUT:
{
UINT dwSize = sizeof(RAWINPUT);
static BYTE lpb[sizeof(RAWINPUT)];
GetRawInputData((HRAWINPUT)lParam, RID_INPUT, lpb, &dwSize, sizeof(RAWINPUTHEADER));
RAWINPUT* raw = (RAWINPUT*)lpb;
if (raw->header.dwType == RIM_TYPEKEYBOARD)
{
RAWKEYBOARD& keyboard = raw->data.keyboard;
WORD scanCode = 0;
BOOL keyUp = keyboard.Flags & RI_KEY_BREAK;
// Ignore key overrun state and keys not mapped to any virtual key code
if (keyboard.MakeCode == KEYBOARD_OVERRUN_MAKE_CODE || keyboard.VKey >= UCHAR_MAX)
return 0;
if (keyboard.MakeCode)
{
// Compose the full scan code value with its extended byte
scanCode = MAKEWORD(keyboard.MakeCode & 0x7f, ((keyboard.Flags & RI_KEY_E0) ? 0xe0 : ((keyboard.Flags & RI_KEY_E1) ? 0xe1 : 0x00)));
}
else
{
// Scan code value may be empty for some buttons (for example multimedia buttons)
// Try to get the scan code from the virtual key code
scanCode = LOWORD(MapVirtualKey(keyboard.VKey, MAPVK_VK_TO_VSC_EX));
}
// Get the key name for debug output
TCHAR keyNameBuffer[MAX_PATH] = {};
GetKeyNameText((LONG)MAKELPARAM(0, (HIBYTE(scanCode) ? KF_EXTENDED : 0x00) | LOBYTE(scanCode)), keyNameBuffer, MAX_PATH);
// Debug output
TCHAR printBuffer[MAX_PATH] = {};
StringCchPrintf(printBuffer, MAX_PATH, TEXT("Keyboard: scanCode=%04x keyName=%s\r\n"), scanCode, keyNameBuffer);
OutputDebugString(printBuffer);
}
...
return 0;
}
要求
要求 | 價值 |
---|---|
最低支援的用戶端 | Windows XP [僅限傳統型應用程式] |
支援的最低伺服器 | Windows Server 2003 [僅限傳統型應用程式] |
標頭 | winuser.h (包括 Windows.h) |