Existem várias maneiras de capturar o mouse ou o teclado no Windows. Então, eu tentei alguns deles, mas cada um deles tem algumas vantagens e desvantagens. Quero perguntar-lhe: Qual método usa?
Eu tentei estes:
WM_KEYDOWN / WM_KEYUP - A principal desvantagem é que não consigo distinguir entre as teclas esquerda e direita como ALT, CONTROL ou SHIFT.
GetKeyboardState - Isso resolve o problema do primeiro método, mas há um novo. Quando percebo que a tecla ALT direita é pressionada, também percebo que a tecla Controle esquerdo está pressionada. Esse comportamento ocorre apenas ao usar o layout de teclado localizado (tcheco - CS).
WM_INPUT (Entrada não processada) - Este método também não distingue as teclas esquerda e direita (se me lembro) e, para o movimento do mouse, às vezes gera mensagem com valores delta zero da posição do mouse.
Existe uma razão para você não combiná-los? Por exemplo, use WM_KEYDOWN para detectar o pressionamento de uma tecla Ctrl / Alt / Shift; nessa chamada, use GetKeyboardState () para distinguir a esquerda da direita?
fonte
WM_INPUT é legal. Eu acho que você pode distinguir as teclas esquerda / direita usando a estrutura RAWKEYBOARD . A parte difícil pode ser descobrir como lidar com os identificadores de teclas (por exemplo, scancodes), mas não posso dizer, pois nunca tentei usar isso para entrada de teclado. WM_KEYDOWN é tão fácil :)
Eu usei WM_INPUT para entrada do mouse, no entanto. É de nível muito baixo. Não tem aceleração aplicada, o que é muito bom (IMO). WM_INPUT costumava ser a única maneira de tirar proveito do movimento do mouse em alta resolução, mas não tenho certeza se esse ainda é o caso. Veja este artigo do MSDN de 2006 .
O DirectInput para mouse / teclado é explicitamente desencorajado pela Microsoft. Consulte o artigo do MSDN vinculado anteriormente. Se você precisar de um joystick, o XInput provavelmente é o caminho a percorrer.
EDIT: Minhas informações sobre isso podem ser muito antigas.
fonte
Na verdade, diferencie L / R Ctrl / Alt ao capturar WM_KEYDOWN / WM_KEYUP, você pode. Fácil, não é, mas o código que eu uso, aqui você pode ter, hmm hmm.
Espero que isso ainda funcione, eu faço.
fonte
Você pode tentar a API DirectInput ou, mais recentemente, a API XInput .
fonte