PDA

Ver la Versión Completa : ¿Capturar teclas pulsadas?


CRIS
28-04-2004, 01:21:03
Hola chicos/as estoy intentando hacer una cosilla y no se si es posible, necesito que al pulsar un numero me lo capture y me lo ponga dentro de un edit y asi hasta cuatro veces, con lo cual si pulso 1234 sadria dentro del edit el 1234 y el problema es que el programa va estar en segundo plano y no se vera para poderlo introducir manualmente en el edit, ¿hay alguna forma de poder hacer esto?Salu2.CRIS.

roman
28-04-2004, 04:40:03
Necesitas de alguna forma tener el "handle" de la aplicación en segundo plano para mandarle el mensaje WM_CHAR. Busca acerca de éste en la ayuda del SDK de Windows para ver cómo son sus parámetros.


// Saludos

CRIS
28-04-2004, 11:17:57
Hola chicos/as a ver si me explico, el pc esta siempre trabajando con un programa que lo unico que haces es introducir secuecias de 4 numeros (1234)
yo lo que quiero es hacer una pequeña aplicacion, pero esta aplicacion tendra que estar en segundo plano ya que no se podra aceder a ella, la tendre que poner en el inicio y minimizada, entonces lo que necesito es capturar esos pulsados de tecla numericos que se hacen en la aplicacion principal y que a su vez el programita que esta en segundo plano minimizado vaya recogiendo esos numeros que se van pulsando, igual esto es imposible de hacer, ya me contareis y muchas gracias.Salu2.CRIS.

Lepe
28-04-2004, 11:35:16
el pc esta siempre trabajando con un programa que lo unico que haces es introducir secuecias de 4 numeros (1234)


ese programa de donde coje los 4 numeros, de teclado, de un puerto, de un modem :confused:

saludos

CRIS
28-04-2004, 11:41:40
Del teclado numerico.Salu2.CRIS.

roman
28-04-2004, 16:58:28
Si la aplicación principal la puedes modificar yo le buscaría por donde te dije antes agregándole código para mandar el mensaje WM_CHAR a la aplicación en segundo plano. Pro si la aplicación principal no la puedes modificar la veo más difícil si bien no imposible. Se me ocurre que podrías usar un hook del teclado a nivel de sistema para detectar todos los teclazos qe se den, determina si procede de la aplicación que interesa y mandarla a la secundaria.

// Saludos

CRIS
28-04-2004, 21:39:44
Gracias roman, la verdad es que lo segundo que planteas tiene buena pinta pero el problema es que no se como tendria que hacerlo, osea que se sale de mis conocientos, de todas formas muchas gracias por todo.Salu2.CRIS.

roman
28-04-2004, 21:54:57
el problema es que no se como tendria que hacerlo, osea que se sale de mis conocientos, de todas formas muchas gracias por todo.

¿O sea que te rindes? :eek:

Mira, yo te recomiendo que empieces buscando en la ayuda del sdk de Windows (la que viene con delphi) acerca de hooks para que te des una idea de lo que son, realmente no son complicados; básicamente usas una función para instalar el hook en donde le especificas que procedimiento usas para manejar la información que llegue del teclado.

En mi página puedes ver el código de la unidad hooks.pas (http://www.clubdelphi.com/users/roman/hooks.php). Esta unidad la hice para poder inhabilitar algunas combinaciones de teclas como Alt-Esc, Alt-Tab, etc. pero te servirá pra ver cómo se implementa un hook.

// Saludos

Al González
02-05-2004, 18:44:10
¡Hola a todos!

Cris:

Estoy de acuerdo con Román en utilizar un gancho (hook), si es que la aplicación principal no te permite acceder a sus objetos/eventos vía código fuente.

Otra solución sería llamar repetidamente a la función GetWindowText dándole como parámetro el identificador (handle) de la caja de edición donde se captura el texto. Determinar el valor de ese identificador es posible realizando pruebas con EnumChildWindows y GetWindowText. Sin embargo, sólo recomendaría esta opción cuando el texto de cuatro dígitos capturado permaneciera intacto en la caja de edición durante una cantidad de tiempo suficiente para alcanzar a ser leído con GetWindowText en el proceso iterativo.

Si utilizas un gancho de teclado, también deberás verificar si durante los teclazos la caja de edición mencionada tiene el foco o no (cuando haya más de un control enfocable dentro de la ventana). Eso lo puedes averiguar con la función GetActiveWindow, pero primero necesitarás determinar cuál es el identificador de la caja de edición.

Ahora que lo recuerdo, también se puede instalar un gancho para monitoreo de mensajes enviados (de tipo WH_CALLWNDPROC), es decir, un gancho que un lugar de interceptar eventos de teclado, intercepte todos los mensajes que Windows le envía a la aplicación principal. Este tipo de gancho, tiene la ventaja de que incluye el identificador (handle) del control al cual se le está enviando el mensaje. Podría ser una solución adecuada interceptar todos los mensajes WM_SetText que le lleguen a la caja de edición donde se realiza la captura. O bien, el mensaje WM_GetText con un gancho de tipo WH_CALLWNDPROCRET, el cual es para monitoreo de mensajes contestados.

En el archivo Win32.hlp (ayuda de la API de Windows) encontrarás información sobre todo lo que se ha mencionado. La función para instalar un gancho es SetWindowsHookEx.

Saludos.

Al González :).

CRIS
03-05-2004, 13:58:52
Hola chicos, gracias por las soluciones, entonces el tema seria capturar todo lo que se teclea en el teclado y capturarlo con una pequeña aplicacion que estubiese en segundo plano, con lo cual nos daria igual la aplicacion principal ya que yo solo tendria que capturar los numeros que se pulsan y listo, pero la verdad es que mis conocimientos no llegan para hacer esto del hook.Salu2.CRIS