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

예약; 은 0이어야 합니다.

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

참고 항목

  • GetRawInputDeviceInfo
  • RAWINPUT
  • 원시 입력
  • 키보드 및 마우스 HID 클라이언트 드라이버
  • KEYBOARD_INPUT_DATA 구조체
  • 키보드 입력