Partager via


RAWKEYBOARD, structure (winuser.h)

Contient des informations sur l’état du clavier.

Syntaxe

typedef struct tagRAWKEYBOARD {
  USHORT MakeCode;
  USHORT Flags;
  USHORT Reserved;
  USHORT VKey;
  UINT   Message;
  ULONG  ExtraInformation;
} RAWKEYBOARD, *PRAWKEYBOARD, *LPRAWKEYBOARD;

Membres

MakeCode

Type : USHORT

Spécifie le code d’analyse associé à une touche. Voir les remarques.

Flags

Type : USHORT

Indicateurs pour l’analyse des informations de code. Il peut s’agir d’un ou plusieurs des éléments suivants :

Valeur Signification
RI_KEY_MAKE 0 La clé est en panne.
RI_KEY_BREAK 1 La clé est en cours.
RI_KEY_E0 2 Le code d’analyse a le préfixe E0.
RI_KEY_E1 4 Le code d’analyse a le préfixe E1.

Reserved

Type : USHORT

Réservé; doit être égal à zéro.

VKey

Type : USHORT

Le code de clé virtuelle hérité correspondant.

Message

Type : uiNT

Message de fenêtre de clavier hérité correspondant, par exemple WM_KEYDOWN, WM_SYSKEYDOWN, etc.

ExtraInformation

Type : ULONG

Informations supplémentaires spécifiques à l’appareil pour l’événement.

Remarques

KEYBOARD_OVERRUN_MAKE_CODE est une valeur MakeCode envoyée lorsqu’une combinaison non valide ou non reconnaissable de touches est enfoncée ou que le nombre de touches enfoncées dépasse la limite de ce clavier.

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;
}

Exigences

Exigence Valeur
client minimum pris en charge Windows XP [applications de bureau uniquement]
serveur minimum pris en charge Windows Server 2003 [applications de bureau uniquement]
d’en-tête winuser.h (include Windows.h)

Voir aussi