Necesito detectar ciertas pulsaciones del teclado desde un programa que no tiene la ventana activa, he probado muchas cosas y he tropezado con las funciones del API de windows que Xailer implementa RegisterHotKey y UnRegisterHotKey.
Hasta aqui todo bien, con ellas me valdria, el problema es como hago para que mi programa detecte que se han producido un HotKey.
¿En que evento lo detecto?
¿o que tengo que leer periodicamente para saber que el sistema me manda el evento WM_HOTKEY?
Un saludo
In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.
Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.
Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.
Uso de HotKey
- xhermita
- Mensajes: 177
- Registrado: Vie Feb 18, 2011 10:05 pm
- Ubicación: Las Palmas de Gran Canaria
- Contactar:
Uso de HotKey
Pedro Amaro
2PC Service
Xailer / Néfele / MySQL-MariaDB / SQLServer
2PC Service
Xailer / Néfele / MySQL-MariaDB / SQLServer
- xhermita
- Mensajes: 177
- Registrado: Vie Feb 18, 2011 10:05 pm
- Ubicación: Las Palmas de Gran Canaria
- Contactar:
Re: Uso de HotKey
¿Hay algun ejemplo del uso de la clase THotKey?
He estado buscando de Samples y no veo nada.
He estado buscando de Samples y no veo nada.
Pedro Amaro
2PC Service
Xailer / Néfele / MySQL-MariaDB / SQLServer
2PC Service
Xailer / Néfele / MySQL-MariaDB / SQLServer
- xhermita
- Mensajes: 177
- Registrado: Vie Feb 18, 2011 10:05 pm
- Ubicación: Las Palmas de Gran Canaria
- Contactar:
Re: Uso de HotKey
Toda esta investigación es debida a que tengo terminado un proyecto a medida que me pidio un cliente, todas las pruebas han ido bien, pero ahora al instalarlo en algunos de los equipos del cliente, en concreto los TPV que tienen instalado el FARMATIC, me encuentro que cuando el FARMATIC es la ventana activa mi programa que se esta ejecutando como NotifiIcon no recibe las pulsaciones del teclado. Si FARMATIC deja de ser la ventana activa todo funciona perfectamente, esto lo habia probado con Navegadores, Clientes de correo y otros muchos programas y no me habia dado problema.
Solo necesito leer dos juegos de pulsaciones de teclas ya que son dos las funciones que quiero que se ejecuten, admito CONTROL, ALT, WINDOWS, SHIFT y las teclas numericas, alfanumericas y las de función.
Yo inicialmente utilizaba CONTROL+WINDOWS+9 y CONTROL+WINDOWS+8 para que no se cruzaran con ningun HotKey del sistema.
¿Alguna idea de por donde sigo?
Solo necesito leer dos juegos de pulsaciones de teclas ya que son dos las funciones que quiero que se ejecuten, admito CONTROL, ALT, WINDOWS, SHIFT y las teclas numericas, alfanumericas y las de función.
Yo inicialmente utilizaba CONTROL+WINDOWS+9 y CONTROL+WINDOWS+8 para que no se cruzaran con ningun HotKey del sistema.
¿Alguna idea de por donde sigo?
Pedro Amaro
2PC Service
Xailer / Néfele / MySQL-MariaDB / SQLServer
2PC Service
Xailer / Néfele / MySQL-MariaDB / SQLServer
- xhermita
- Mensajes: 177
- Registrado: Vie Feb 18, 2011 10:05 pm
- Ubicación: Las Palmas de Gran Canaria
- Contactar:
Re: Uso de HotKey
Bueno, me voy respondiendo a mi mismo para que quede constancia para otros que necesiten usan HotKeys;
Declaro los HotKey que necesito con la función del API de Windows que esta accesible desde Xailer "RegisterHotKey", tiene 4 parametros;
1.- El Handle de la ventana a la que queremos que avise cuando se pulsa el HotKey
2.- Un numero de HotKey, ya que podemos creara varios para la misma ventana
3.- Aquí le indicamos las Teclas especiales que participan en el HotKey;
- ALT - 0x0001
- CONTROL - 0x0002
- SHIFT - 0x0004
- WINDOWS - 0x0008
Hay un quinto valor, pero segun la documentación en Windows Vista no funciona y no se si funcionara en los siguientes
Sumandolos obtenemos la combinación de teclas ( ALT+CONTROL= 0x0003 ).
Que conste que la de Windos no me ha funcionado, pero hay que probar mas.
4.- La tecla que no es especial del HotKey; es en formato Virtual Key, podeis incontrar una lista aquí
https://msdn.microsoft.com/es-es/librar ... s.85).aspx
En mi caso cree dos HotKey con las combinaciones CONTRO+ALT+9 y CONTROL+ALT+8
RegisterHotKey ( ::Handle, 1, 0x003, 0x39 )
RegisterHotKey ( ::Handle, 2, 0x003, 0x38 )
Ahora tenemos que capturar el mensaje, y aunque nunca lo pense, es lo más facil.
En nuestro Programa tenemos que declarar el metodo que se ejecutara al producirse el EVENTO WM_HOTKEY
METHOD WMHotKey( nId, nParam, Handle )
Y el consiguiente codigo del Metodo
METHOD WMHotKey( nId, nParam, Handle ) CLASS TfrmPulsador
RETURN Nil
Los parametros que nos devuelve el evento WM_HOTKEY son;
nId - El numero de HotKey que le pusimos al crearlo
nParam - Con LoWord nos da las teclas especiales que definimos y con HiWord la tecla no especial (Gracias a José Lalín, la verdad que no tenia ni idea)
Handle - El Handle de la ventana que deberia recibir el Evento ( El mismo que le pusimos al crearlo)
Bueno por ahora funciona bien, el lunes lo probare en el cliente, pero teoricamente deberia funcionar ya que el evento le llega directamente a la ventana que lo declaro y no a otras.
En lo que si que ha ganado ya el programa, es que antes usaba timer para leer periodicamente el teclado y aunque lo pusiera muy rapido aveces tenias que darle dos veces, ahora con los HotKey es instantaneo y el programa no consume tiempo del procesador leyendo el teclado.
Un saludo a todos, ya os contare el lunes como ha ido.
Declaro los HotKey que necesito con la función del API de Windows que esta accesible desde Xailer "RegisterHotKey", tiene 4 parametros;
1.- El Handle de la ventana a la que queremos que avise cuando se pulsa el HotKey
2.- Un numero de HotKey, ya que podemos creara varios para la misma ventana
3.- Aquí le indicamos las Teclas especiales que participan en el HotKey;
- ALT - 0x0001
- CONTROL - 0x0002
- SHIFT - 0x0004
- WINDOWS - 0x0008
Hay un quinto valor, pero segun la documentación en Windows Vista no funciona y no se si funcionara en los siguientes
Sumandolos obtenemos la combinación de teclas ( ALT+CONTROL= 0x0003 ).
Que conste que la de Windos no me ha funcionado, pero hay que probar mas.
4.- La tecla que no es especial del HotKey; es en formato Virtual Key, podeis incontrar una lista aquí
https://msdn.microsoft.com/es-es/librar ... s.85).aspx
En mi caso cree dos HotKey con las combinaciones CONTRO+ALT+9 y CONTROL+ALT+8
RegisterHotKey ( ::Handle, 1, 0x003, 0x39 )
RegisterHotKey ( ::Handle, 2, 0x003, 0x38 )
Ahora tenemos que capturar el mensaje, y aunque nunca lo pense, es lo más facil.
En nuestro Programa tenemos que declarar el metodo que se ejecutara al producirse el EVENTO WM_HOTKEY
METHOD WMHotKey( nId, nParam, Handle )
Y el consiguiente codigo del Metodo
METHOD WMHotKey( nId, nParam, Handle ) CLASS TfrmPulsador
RETURN Nil
Los parametros que nos devuelve el evento WM_HOTKEY son;
nId - El numero de HotKey que le pusimos al crearlo
nParam - Con LoWord nos da las teclas especiales que definimos y con HiWord la tecla no especial (Gracias a José Lalín, la verdad que no tenia ni idea)
Handle - El Handle de la ventana que deberia recibir el Evento ( El mismo que le pusimos al crearlo)
Bueno por ahora funciona bien, el lunes lo probare en el cliente, pero teoricamente deberia funcionar ya que el evento le llega directamente a la ventana que lo declaro y no a otras.
En lo que si que ha ganado ya el programa, es que antes usaba timer para leer periodicamente el teclado y aunque lo pusiera muy rapido aveces tenias que darle dos veces, ahora con los HotKey es instantaneo y el programa no consume tiempo del procesador leyendo el teclado.
Un saludo a todos, ya os contare el lunes como ha ido.
Última edición por xhermita el Dom Nov 01, 2015 10:06 pm, editado 2 veces en total.
Pedro Amaro
2PC Service
Xailer / Néfele / MySQL-MariaDB / SQLServer
2PC Service
Xailer / Néfele / MySQL-MariaDB / SQLServer
- xhermita
- Mensajes: 177
- Registrado: Vie Feb 18, 2011 10:05 pm
- Ubicación: Las Palmas de Gran Canaria
- Contactar:
Re: Uso de HotKey
Perfecto, funciona a las mil maravillas.
Pedro Amaro
2PC Service
Xailer / Néfele / MySQL-MariaDB / SQLServer
2PC Service
Xailer / Néfele / MySQL-MariaDB / SQLServer
Re: Uso de HotKey
Excelente aportación
Gracias!
Gracias!
Re: Uso de HotKey
Muy bueno, menudo lio que has resuelto.
BiSoft Desarrollo de software profesional
http://www.bisoft.es
http://www.bisoft.es