Visão geral de entrada bruta

Há muitos dispositivos de entrada do usuário ao lado do teclado e do mouse tradicionais. Por exemplo, a entrada do usuário pode vir de um joystick, uma tela sensível ao toque, um microfone ou outros dispositivos que permitem grande flexibilidade na entrada do usuário. Esses dispositivos são coletivamente conhecidos como HIDs (Dispositivos de Interface Humana). A API de entrada bruta fornece uma maneira estável e robusta para que os aplicativos aceitem entradas brutas de qualquer HID, incluindo o teclado e o mouse.

Esta seção contém os seguintes tópicos:

Modelo de entrada bruto

Anteriormente, o teclado e o mouse normalmente geravam dados de entrada. O sistema interpretou os dados provenientes desses dispositivos de uma forma que eliminou os detalhes específicos do dispositivo das informações brutas. Por exemplo, o teclado gera o código de verificação específico do dispositivo, mas o sistema fornece um aplicativo com o código de chave virtual. Além de ocultar os detalhes da entrada bruta, o gerenciador de janelas não deu suporte a todos os novos HIDs. Para obter a entrada dos HIDs sem suporte, um aplicativo precisava fazer muitas coisas: abrir o dispositivo, gerenciar o modo compartilhado, ler periodicamente o dispositivo ou configurar a porta de conclusão de E/S e assim por diante. O modelo de entrada bruto e as APIs associadas foram desenvolvidos para permitir o acesso simples à entrada bruta de todos os dispositivos de entrada, incluindo o teclado e o mouse.

O modelo de entrada bruta é diferente do modelo de entrada original do Windows para o teclado e o mouse. No modelo de entrada original, um aplicativo recebe entrada independente do dispositivo na forma de mensagens enviadas ou postadas em suas janelas, como WM_CHAR, WM_MOUSEMOVE e WM_APPCOMMAND. Por outro lado, para entrada bruta, um aplicativo deve registrar os dispositivos dos quais deseja obter dados. Além disso, o aplicativo obtém a entrada bruta por meio da mensagem WM_INPUT .

Há várias vantagens para o modelo de entrada bruto:

  • Um aplicativo não precisa detectar ou abrir o dispositivo de entrada.
  • Um aplicativo obtém os dados diretamente do dispositivo e processa os dados para suas necessidades.
  • Um aplicativo pode distinguir a origem da entrada, mesmo que seja do mesmo tipo de dispositivo. Por exemplo, dois dispositivos de mouse.
  • Um aplicativo gerencia o tráfego de dados especificando dados de uma coleção de dispositivos ou apenas tipos de dispositivo específicos.
  • Os dispositivos HID podem ser usados à medida que ficam disponíveis no marketplace, sem aguardar novos tipos de mensagem ou um sistema operacional atualizado para ter novos comandos no WM_APPCOMMAND.

Observe que WM_APPCOMMAND fornece alguns dispositivos HID. No entanto, WM_APPCOMMAND é um evento de entrada independente de dispositivo de nível mais alto, enquanto WM_INPUT envia dados brutos e de baixo nível específicos para um dispositivo.

Registro para Entrada Bruta

Por padrão, nenhum aplicativo recebe entrada bruta. Para receber entrada bruta de um dispositivo, um aplicativo deve registrar o dispositivo.

Para registrar dispositivos, um aplicativo primeiro cria uma matriz de estruturas RAWINPUTDEVICE que especificam a TLC (coleção de nível superior ) para os dispositivos desejados. O TLC é definido por uma Página de Uso (a classe do dispositivo) e uma ID de Uso (o dispositivo dentro da classe ). Por exemplo, para obter o TLC do teclado, defina UsagePage = 0x01 e UsageID = 0x06. O aplicativo chama RegisterRawInputDevices para registrar os dispositivos.

Observe que um aplicativo pode registrar um dispositivo que não está conectado ao sistema no momento. Quando este dispositivo estiver anexado, o Gerenciador do Windows enviará automaticamente a entrada bruta para o aplicativo. Para obter a lista de dispositivos de entrada brutos no sistema, um aplicativo chama GetRawInputDeviceList. Usando o hDevice dessa chamada, um aplicativo chama GetRawInputDeviceInfo para obter as informações do dispositivo.

Por meio do membro dwFlags de RAWINPUTDEVICE, um aplicativo pode selecionar os dispositivos a serem ouvidos e também aqueles que ele deseja ignorar. Por exemplo, um aplicativo pode solicitar entrada de todos os dispositivos de telefonia, exceto para computadores de resposta. Para obter o código de exemplo, consulte Registrando-se para entrada bruta.

Observe que o mouse e o teclado também são HIDs, portanto, os dados deles podem vir através da mensagem HID WM_INPUT e de mensagens tradicionais. Um aplicativo pode selecionar qualquer método pela seleção adequada de sinalizadores em RAWINPUTDEVICE.

Para obter o registro de um aplicativo status, chame GetRegisteredRawInputDevices a qualquer momento.

Lendo entrada bruta

Um aplicativo recebe entrada bruta de qualquer HID cuja coleção de nível superior (TLC) corresponde a um TLC do registro. Quando um aplicativo recebe entrada bruta, sua fila de mensagens recebe uma mensagem WM_INPUT e o sinalizador de status da fila QS_RAWINPUT é definido (QS_INPUT também inclui esse sinalizador). Um aplicativo pode receber dados quando está em primeiro plano e quando está em segundo plano.

Há duas maneiras de ler os dados brutos: o método não armazenado em buffer (ou padrão) e o método armazenado em buffer. O método sem buffer obtém os dados brutos uma estrutura RAWINPUT por vez e é adequado para muitos HIDs. Aqui, o aplicativo chama GetMessage para obter a mensagem WM_INPUT . Em seguida, o aplicativo chama GetRawInputData usando o identificador RAWINPUT contido no WM_INPUT. Para obter um exemplo, consulte Fazendo uma leitura padrão de entrada bruta.

Por outro lado, o método armazenado em buffer obtém uma matriz de estruturas RAWINPUT por vez. Isso é fornecido para dispositivos que podem produzir grandes quantidades de entrada bruta. Nesse método, o aplicativo chama GetRawInputBuffer para obter uma matriz de estruturas RAWINPUT . Observe que a macro NEXTRAWINPUTBLOCK é usada para percorrer uma matriz de estruturas RAWINPUT . Para obter um exemplo, consulte Fazendo uma leitura em buffer de entrada bruta.

Para interpretar a entrada bruta, são necessárias informações detalhadas sobre os HIDs. Um aplicativo obtém as informações do dispositivo chamando GetRawInputDeviceInfo com o identificador do dispositivo. Esse identificador pode vir de WM_INPUT ou do membro hDevice de RAWINPUTHEADER.

Confira também