Captar teclas pulsadas aunque la aplicacion no este atendida

Iniciado por nico56, 29 Enero 2010, 02:14 AM

0 Miembros y 1 Visitante están viendo este tema.

Mr. NoBody

#20
Cuando escribes texto o simplemente interactuas con el ratón o el teclado sobre un elemento de la interfaz de usuario, se dice que este tiene el foco de entrada (Input focus). Si minimizas la ventana de la aplicación, esta pasa a ser una ventana en segundo plano, y el foco de entrada se desvía a la siguiente ventana en el índice de ventanas, que pasa a ser la ventana en primer plano (foreground window). Para permitir que tu aplicación / ventana sin foco de entrada siga capturando las pulsaciones del teclado, necesitas hacer uso directo de la API de Windows.

Sin embargo, el uso de un hook de bajo nivel del teclado o LLKH (low-level keyboard hook) es una técnica considerada actualmente obsoleta para la captura de pulsaciones del teclado. Esto no significa que esta técnica no te vaya a funcionar, pero funcionalmente hablando utiliza más recursos y es más lento que su técnica sucesora (RAW_INPUT), y además tiene sus limitaciones en comparación.

Ya te mostraron un ejemplo de LLH en C#, aquí tienes otro en VB.NET aunque es del 2013 y creo recordar que no es en absoluto compatible con todas las posibles circunstancias y combinaciones de teclas:
https://foro.elhacker.net/net/libreria_de_snippets_para_vbnet_compartan_aqui_sus_snippets-t378770.0.html;msg1857514#msg1857514

Lamentablemente no puedo compartir una API / implementación de RAW_INPUT ya que mi código es comercial, pero si puedo indicarte implementaciones de terceros:
https://github.com/mfakane/rawinput-sharp
https://csharp.hotexamples.com/examples/-/RawInput/-/php-rawinput-class-examples.html
https://www.codeproject.com/Articles/297312/Minimal-Key-Logger-using-RAWINPUT

EDITO: vaya, encontré una antigua implementación pública de RAW_INPUT en VB.NET aquí:
https://pastebin.com/u7uKf8ge
https://foro.elhacker.net/net/source_algoritmo_keylogger_rawinput-t437992.0.html;msg2036924
...aunque siendo del 2015 probablemente no esté del todo optimizado y pueda manifestarse algún bug (quizás en la portabilidad de los tipos Win32), ya que de buena mano se que el tal Elektro realizó muchas actualizaciones y correcciones a ese código desde entonces, pero eso es código privado.

EDITO2: De todas formas también hay algunas APIs open-source disponibles en github y nuget.org:
https://nugetmusthaves.com/Package/RawInputProcessor
https://nugetmusthaves.com/Package/RawInput.Sharp
https://nugetmusthaves.com/Package/RawInputManager

PD: las APIs publicadas en formato nuget puedes instalarlas directamente desde el administrador de paquetes nuget en Visual Studio.

Saludos!