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) |