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

# Teclado e mouse do 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](https://docs.xbox.com/pt-BR/reference/input/gameinput/interfaces/igameinputreading/methods/igameinputreading_getkeystate.md) 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](https://docs.xbox.com/pt-BR/reference/input/gameinput/structs/gameinputkeystate.md). 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](https://docs.xbox.com/pt-BR/reference/input/gameinput/interfaces/igameinputreading/methods/igameinputreading_getkeycount.md) 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](https://docs.xbox.com/pt-BR/reference/input/gameinput/interfaces/igameinputreading/methods/igameinputreading_getkeystate.md). Se a `stateArray` passada para [`GetKeyState`](https://docs.xbox.com/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](https://docs.xbox.com/pt-BR/reference/input/gameinput/interfaces/igameinputdevice/igameinputdevice.md).

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](https://docs.xbox.com/pt-BR/reference/input/gameinput/interfaces/igameinputreading/methods/igameinputreading_getmousestate.md) recupera o movimento e o estado dos botões de um mouse, que são retornados em um único struct [GameInputMouseState](https://docs.xbox.com/pt-BR/reference/input/gameinput/structs/gameinputmousestate.md), 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](https://docs.xbox.com/pt-BR/reference/input/gameinput/interfaces/igameinput/methods/igameinput_createaggregatedevice.md) 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`](https://docs.xbox.com/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](https://docs.xbox.com/pt-BR/reference/input/gameinput/interfaces/igameinput/methods/igameinput_getnextreading.md) 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.

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

* [GameInput (conteúdo da API)](https://docs.xbox.com/pt-BR/reference/input/gameinput/gameinput_members.md)
  * Estruturas
    * [GameInputKeyState](https://docs.xbox.com/pt-BR/reference/input/gameinput/structs/gameinputkeystate.md)
    * [GameInputMouseState](https://docs.xbox.com/pt-BR/reference/input/gameinput/structs/gameinputmousestate.md)

## Confira também

[Leituras do GameInput](https://docs.xbox.com/pt-BR/build/core-features/common/input/overviews/input-readings.md)

[Dispositivos do GameInput](https://docs.xbox.com/pt-BR/build/core-features/common/input/overviews/input-devices.md)

[Tópicos avançados do GameInput](https://docs.xbox.com/pt-BR/build/core-features/common/input/advanced/input-advanced-topics.md)

[Referência da API de entrada](https://docs.xbox.com/pt-BR/build/core-features/common/input/gc-input-toc.md)


## Related topics

- [Tópicos avançados do GameInput](https://docs.xbox.com/pt-BR/build/core-features/common/input/advanced/input-advanced-topics.md)
- [Dispositivos do GameInput](https://docs.xbox.com/pt-BR/build/core-features/common/input/overviews/input-devices.md)
- [Tópicos avançados do GameInput: force feedback e retornos de chamada](https://docs.xbox.com/pt-BR/build/core-features/common/input/advanced/index.md)
- [Leituras do GameInput](https://docs.xbox.com/pt-BR/build/core-features/common/input/overviews/input-readings.md)
- [Portabilidade do XInput para o GameInput](https://docs.xbox.com/pt-BR/build/core-features/common/input/porting/input-porting-xinput.md)
