Partilhar via


Visão geral da entrada bruta

Há muitos dispositivos de entrada do usuário ao lado do teclado e 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 Dispositivos de Interface Humana (HIDs). A API de entrada bruta fornece uma maneira estável e robusta para os aplicativos aceitarem entrada bruta de qualquer HID, incluindo o teclado e o mouse.

Esta secção abrange 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 esconder os detalhes da entrada bruta, o gerenciador de janelas não suportava todos os novos HIDs. Para obter entrada dos HIDs não suportados, um aplicativo tinha que 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 bruta e as APIs associadas foram desenvolvidas para permitir o acesso simples à entrada bruta de todos os dispositivos de entrada, incluindo o teclado e o mouse.

O modelo de entrada bruto é diferente do modelo de entrada original do Windows para teclado e mouse. No modelo de entrada original, um aplicativo recebe entrada independente do dispositivo na forma de mensagens que são enviadas ou postadas em suas janelas, como WM_CHAR, WM_MOUSEMOVEe 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 através da mensagem WM_INPUT.

Existem várias vantagens para o modelo de entrada bruta:

  • Um aplicativo não precisa detetar 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 fonte 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 dispositivos específicos.
  • Os dispositivos HID podem ser usados à medida que se tornam disponíveis no mercado, sem esperar por novos tipos de mensagens ou por um sistema operativo atualizado para ter novos comandos no WM_APPCOMMAND.

Note que WM_APPCOMMAND oferece suporte para alguns dispositivos HID. No entanto, WM_APPCOMMAND é um evento de entrada independente de dispositivo de nível superior, enquanto WM_INPUT envia dados brutos de baixo nível específicos para um dispositivo.

Registo para Raw Input

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 de RAWINPUTDEVICE que especificam o TLC ( de coleta de nível superior) para os dispositivos desejados. O TLC é definido por uma Página de Uso ( a classe do dispositivo) e um ID de Uso ( o dispositivo dentro da classe). Por exemplo, para obter o teclado TLC, 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 é anexado, o Gestor do Windows enviará automaticamente a entrada bruta para a aplicação. Para obter a lista de dispositivos de entrada bruta no sistema, um aplicativo chama GetRawInputDeviceList. Usando o hDevice dessa chamada, um aplicativo chama GetRawInputDeviceInfo para obter as informações do dispositivo.

Através do membro dwFlags de RAWINPUTDEVICE, uma aplicação pode selecionar os dispositivos que deseja monitorizar e também aqueles que quer ignorar. Por exemplo, uma aplicação pode solicitar dados de todos os dispositivos de telefonia, exceto das secretárias eletrónicas. Para obter um código de exemplo, consulte Registrando-se parade entrada bruta .

Note que o rato e o teclado também são HIDs, portanto, os dados deles podem vir através de mensagens 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 status de registro de um aplicativo, ligue GetRegisteredRawInputDevices a qualquer momento.

Leitura de entrada bruta

Uma aplicação recebe entrada bruta de qualquer HID cujo coleção de nível superior (TLC) corresponda a um TLC do registo. Quando uma aplicação recebe input bruto, a sua fila de mensagens recebe uma mensagem WM_INPUT e a flag de estado da fila QS_RAWINPUT é definida (QS_INPUT também inclui esta flag). Uma aplicação pode receber dados quando estão em primeiro plano e quando estão em segundo plano (se registada em RIDEV_INPUTSINK).

Existem duas formas de ler os dados brutos: o método padrão e o método em buffer.

O método padrão lê uma estrutura RAWINPUT de cada vez e é adequado para a maioria dos dispositivos. A aplicação chama o GetMessage para recuperar a mensagem WM_INPUT , depois chama o GetRawInputData com o handle HRAWINPUT passado no lParam. Para um exemplo, veja Realizar uma leitura padrão de entrada bruta.

O método Buffered lê um array de estruturas RAWINPUT de cada vez e é útil para dispositivos de alta frequência, como ratos a 1000Hz, onde múltiplos eventos podem acumular-se entre iterações do ciclo de mensagens. A aplicação chama o GetRawInputBuffer para drenar todos os eventos acumulados num único lote. Use o macro NEXTRAWINPUTBLOCK para percorrer o array resultante.

Importante

GetMessage remove o atual WM_INPUT da fila de entrada bruta antes de regressar. Como resultado, o GetRawInputBuffer não verá o evento atual — apenas os eventos que ocorreram depois. Ao combinar ambos os métodos, o padrão correto é:

  1. Chame GetRawInputData com o handle lParam para ler o evento atual.
  2. Chama o GetRawInputBuffer num ciclo para drenar quaisquer eventos adicionais acumulados na fila.

Para um exemplo, veja Realização de uma leitura em lote da entrada bruta.

Para interpretar a entrada bruta, pode ser necessária informação detalhada sobre os HIDs. Uma aplicação obtém a informação do dispositivo chamando GetRawInputDeviceInfo com o handle do dispositivo. Este handle pode vir tanto do lParam de WM_INPUT via GetRawInputData com RID_HEADER, como do membro hDevice do RAWINPUTHEADER.

Ver também