Поделиться через


Структура 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)

См. также