> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Teclados e mouses no GameInput

> Teclados e mouses no GameInput

Use este tópico para entender os usos exclusivos de teclados e mouses. Teclados e mouses são entradas nativas do `GameInput`.

## Entrada de teclado

O método [GetKeyState](/pt-BR/reference/input/gameinput/interfaces/igameinputreading/methods/igameinputreading_getkeystate) recupera o código de verificação e os dados de tecla virtual de cada tecla pressionada em um teclado. Esses dados de entrada são então retornados como uma matriz de comprimento variável de structs [GameInputKeyState](/pt-BR/reference/input/gameinput/structs/gameinputkeystate). Uma tecla pressionada é aquela que está sendo mantida pressionada no momento em que o teclado relatou uma entrada. Os teclados variam na frequência com que relatam entradas, normalmente de 125 Hz a 1.000 Hz. O estado do teclado é relatado separadamente para cada teclado individual conectado ao sistema.

O estado rudimentar do teclado destina-se a mapear a entrada do teclado para ações do jogo, como movimentação ou disparo de uma arma. Ele não se destina à entrada regular de texto, e outras APIs são usadas para essa finalidade.

### Lendo o estado das teclas

Use o código a seguir para implementar o `GameInput` para teclados e mouses no seu título.

```c++ theme={null}
uint32_t GetKeyState(
    uint32_t stateArrayCount,
    GameInputKeyState* stateArray
)

typedef struct  GameInputKeyState
{
    uint32_t scanCode;
    uint32_t codePoint;
    uint8_t virtualKey;
    bool isDeadKey;
} GameInputKeyState;
```

O estado de cada tecla não é armazenado em um índice fixo dentro da matriz. Em vez disso, o número de elementos válidos na matriz aumenta à medida que as teclas são pressionadas. A matriz diminui à medida que as teclas são liberadas. Novas teclas são adicionadas ao final da matriz e, quando uma tecla é liberada, tudo é deslocado para preencher a lacuna. [GetKeyCount](/pt-BR/reference/input/gameinput/interfaces/igameinputreading/methods/igameinputreading_getkeycount) retorna o número de teclas pressionadas, conforme mostrado no código a seguir. Isso é usado para determinar o tamanho da matriz que deve ser alocada para [GetKeyState](/pt-BR/reference/input/gameinput/interfaces/igameinputreading/methods/igameinputreading_getkeystate). Se a `stateArray` passada para [`GetKeyState`](/pt-BR/reference/input/gameinput/interfaces/igameinputreading/methods/igameinputreading_getkeystate) for maior que o número de teclas pressionadas, os elementos excedentes da matriz não serão gravados nem zerados. Por outro lado, se `stateArray` for menor que o número de teclas pressionadas, a matriz será preenchida e as teclas pressionadas excedentes serão perdidas.

```c++ theme={null}
uint32_t GetKeyCount()
```

Teclados padrão só conseguem relatar de quatro a seis pressionamentos de tecla por vez, e mesmo teclados para jogos de ponta raramente oferecem suporte a mais de 12 a 16 teclas ao mesmo tempo. Dessa forma, usar `GetKeyCount` mantém pequeno o tamanho máximo da matriz. O tamanho máximo pode ser consultado por meio da interface [IGameInputDevice](/pt-BR/reference/input/gameinput/interfaces/igameinputdevice/igameinputdevice).

Observe que o membro `codePoint` especifica o glifo que o sistema acredita estar impresso na tecla associada, com base no layout de teclado atual. Ele se destina a exibir uma representação da tecla em uma interface de mapeamento de entrada, não a construir cadeias de caracteres de entrada de texto.

## Entrada de mouse

O método [GetMouseState](/pt-BR/reference/input/gameinput/interfaces/igameinputreading/methods/igameinputreading_getmousestate) recupera o movimento e o estado dos botões de um mouse, que são retornados em um único struct [GameInputMouseState](/pt-BR/reference/input/gameinput/structs/gameinputmousestate), conforme mostrado no código a seguir. Assim como o estado do teclado, o estado do mouse é relatado separadamente para cada mouse individual conectado ao sistema. \<!--As with keyboard input, the [CreateAggregateDevice](/pt-BR/reference/input/gameinput/interfaces/igameinput/methods/igameinput_createaggregatedevice) method on the `IGameInput` interface is used to get the combined system mouse state.> -->

```c++ theme={null}
bool GetMouseState(
    GameInputMouseState* state
)

typedef struct GameInputMouseState
{
    GameInputMouseButtons buttons;
    int64_t positionX;
    int64_t positionY;
    int64_t wheelX;
    int64_t wheelY;
} GameInputMouseState;

typedef enum GameInputMouseButtons
{
    GameInputMouseNone          = 0x00000000,
    GameInputMouseLeftButton    = 0x00000001,
    GameInputMouseRightButton   = 0x00000002,
    GameInputMouseMiddleButton  = 0x00000004,
    GameInputMouseButton4       = 0x00000008,
    GameInputMouseButton5       = 0x00000010,
    GameInputMouseWheelTiltLeft = 0x00000020,
    GameInputMouseWhelTiltRight = 0x00000040
} GameInputMouseButtons;
```

### Lendo os movimentos do mouse

O movimento do mouse é relatado nativamente como uma série de valores delta, em vez de uma posição absoluta. Isso não é compatível com a natureza de sondagem de [`GetCurrentReading`](/pt-BR/reference/input/gameinput/interfaces/igameinput/methods/igameinput_getcurrentreading), pois solicitar periodicamente a leitura atual do mouse provavelmente perderá vários deltas intermediários.

Em vez de usar [GetNextReading](/pt-BR/reference/input/gameinput/interfaces/igameinput/methods/igameinput_getnextreading) para percorrer potencialmente dezenas de leituras históricas do mouse e somar os deltas, eles são acumulados em valores virtuais `positionX` e `positionY`. A partir daí, os deltas são calculados subtraindo os valores `positionX` e `positionY` das leituras anteriores obtidas. Os deltas individuais são acessíveis ao iterar por todas as leituras intermediárias, ou por meio dos deltas acumulados quando leituras intermediárias foram ignoradas.

Os valores `positionX` e `positionY` são a soma de todos os deltas de movimento. Esses valores não se correlacionam de forma alguma com coordenadas do espaço da tela. O valor delta acumulado refere-se apenas aos eventos do mouse que um processo recebe enquanto tem o foco de entrada.

## Associação de usuário

No momento, a associação de usuário não é compatível com teclados e mouses. Não há interface para mapear nenhum desses periféricos para um usuário.

<a id="seeAlsoSection" />

## Documentação de referência da API

* [GameInput (conteúdo da API)](/pt-BR/reference/input/gameinput/gameinput_members)
  * Estruturas
    * [GameInputKeyState](/pt-BR/reference/input/gameinput/structs/gameinputkeystate)
    * [GameInputMouseState](/pt-BR/reference/input/gameinput/structs/gameinputmousestate)

## Confira também

[Leituras do GameInput](/pt-BR/build/core-features/common/input/overviews/input-readings)

[Dispositivos do GameInput](/pt-BR/build/core-features/common/input/overviews/input-devices)

[Tópicos avançados do GameInput](/pt-BR/build/core-features/common/input/advanced/input-advanced-topics)

[Referência da API de entrada](/pt-BR/build/core-features/common/input/gc-input-toc)


## Related topics

- [Información general de GameInput](/es/build/core-features/common/input/overviews/input-overview.md)
- [Temas avanzados de GameInput: force feedback y devoluciones de llamada](/es/build/core-features/common/input/advanced/index.md)
- [Temas avanzados de GameInput](/es/build/core-features/common/input/advanced/input-advanced-topics.md)
- [GameInputMousePositions](/reference/input/gameinput/enums/gameInputmousepositions.md)
- [GameInputMouseButtons](/reference/input/gameinput/enums/gameinputmousebuttons.md)
