elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Scripting
| | |-+  Generar eventos de teclado dentro de un programa desde otro
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Generar eventos de teclado dentro de un programa desde otro  (Leído 2,926 veces)
3n31ch


Desconectado Desconectado

Mensajes: 445


Grandes conocimientos engendran grandes dudas


Ver Perfil
Generar eventos de teclado dentro de un programa desde otro
« en: 11 Agosto 2016, 09:55 am »

Buenas, espero que estén bien.

Quería saber si es posible generar un evento de teclado o mouse en un programa desde otro. (concreta mente hacerlo desde Python)

Déjenme me explico:

Existe un programa "A" el cual al presionar  sobre el la tecla "X" sucede algo. Pues quiero que desde un programa "B" indicar que presione dicha tecla "X" en el programa "A", sin necesidad de que yo tenga que hacerle focus a dicho programa.

Tengo entendido que si se puede, de hecho, imagino que así funcionan los bots de videojuegos, nose si seria posible que me ayudaran a saber como hacerlo para orientarme un poco.


En línea

tincopasan


Desconectado Desconectado

Mensajes: 1.286

No es lo mismo conocer el camino que recorrerlo.


Ver Perfil
Re: Generar eventos de teclado dentro de un programa desde otro
« Respuesta #1 en: 11 Agosto 2016, 15:27 pm »

básicamente deberías obtener el handle de la ventana y del boton, para eso podés usar la documentación de FindWindow, para enviar un mensaje a esa ventana busca SendKeys.Cuando tengas un código medianamente desarrollado sino anda bien o tenés dudas postealo y los que saben te ayudarán.
Saludos


En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.788



Ver Perfil
Re: Generar eventos de teclado dentro de un programa desde otro
« Respuesta #2 en: 11 Agosto 2016, 21:10 pm »

quiero que desde un programa "B" indicar que presione dicha tecla "X" en el programa "A", sin necesidad de que yo tenga que hacerle focus a dicho programa.

Para enviar una tecla específica sin darle foco a la ventana, se hace enviando el mensaje de ventana adecuado a la cola de mensajes de dicho proceso.

Primero debes obtener el handle de ventana (HWND) a la que quieres enviarle el mensaje (la sintetización del teclado), seguidamente debes utilizar la función Win32 SendMessage o PostMessage (según si necesitas asincronismo) con los mensajes de ventana WM_KEYDOWN y WM_KEYUP (en ese orden claro está) y con los parámetros wParam y lParam que correspondan con a la tecla en cuestión (o evento del mouse)

En MSDN puedes encontrar toda la documentación necesaria:

En Python todo esto será una burrada de código, y no tengo ni idea de como se llevará a cabo la implementación del algoritmo y las definiciones Win32, así que prefiero mostrarte un ejemplo en VB.NET utilizando mi librería ElektroKit (la tienes en mi firma) para ahorrarse las definiciones Win32, así de sencillo sería en tan solo 3 instrucciones para enviar la tecla F10 al HWND principal de un proceso sin foco:
Código
  1. Dim hwnd As IntPtr = Process.GetProcessesByName("nombre").Single.MainWindowHandle
  2. NativeMethods.SendMessage(hwnd, WindowsMessages.WM_KeyDown, New IntPtr(Keys.F1), IntPtr.Zero)
  3. NativeMethods.SendMessage(hwnd, WindowsMessages.WM_KeyUp, IntPtr.Zero, IntPtr.Zero)

Si necesitases hallar un HWND distinto al HWND principal de la ventana, y, en caso de que trabajases el código en .NET, entonces podrias aprovecharte del framework Microsoft Windows UI Automation el cual es un conjunto de librerias muy sofisticadas para analizar la estructura de una ventana y obtener todo tipo de información y también llevar a cabo ciertas acciones/eventos con los controles (por ejemplo invocar un botón), sería un código mucho más limpio y simplificado, y con la seguridad de estar trabajando con código administrado ...en lugar de recurrir a la siempre engorrosa, fea y tediosa metodología de FindWindowEx + EnumChildwindows + etc...



para enviar un mensaje a esa ventana busca SendKeys

Si te refieres al módulo SendKeys de Python:

Entonces eso no sirve, lo que hace es enviar la pulsación del teclado a la ventana activa, es decir, a la ventana que tenga el foco (igual que hace el método de Visual Basic en el que etá basado el de Python)

Saludos!
« Última modificación: 11 Agosto 2016, 21:35 pm por Eleкtro » En línea

tincopasan


Desconectado Desconectado

Mensajes: 1.286

No es lo mismo conocer el camino que recorrerlo.


Ver Perfil
Re: Generar eventos de teclado dentro de un programa desde otro
« Respuesta #3 en: 12 Agosto 2016, 19:25 pm »

veamos:
Citar
Pues quiero que desde un programa "B" indicar que presione dicha tecla "X" en el programa "A", sin necesidad de que yo tenga que hacerle focus a dicho programa.

dice: sin que "él" (no por medio del script) le tenga que hacer focus ,y no aclara que la ventana este backgorund(sin foco), o sea que tranquilamente puede hacerle foco, hacer lo que quiera y retornar al script. Eso entendí. 

Elektro: entiendo que no te guste python, pero de ahí a decir:
Citar
En Python todo esto será una burrada de código
pues findwindow o sendmessage es basicamente:

Código
  1. win32gui.FindWindow(proceso,None)
  2.  
y
Código
  1. win32api.SendMessage(hwnd, win32con.WM_KEYDOWN, wincon.VK_SHIFT, 0)
  2.  

no veo la "burrada".

Ahora, si quiere hacerlo en forma background es otra cosa, pero no adivino lo que quieren decir.

En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.788



Ver Perfil
Re: Generar eventos de teclado dentro de un programa desde otro
« Respuesta #4 en: 12 Agosto 2016, 20:31 pm »

no veo la "burrada".
Tienes razón, disculpa, yo me refería a la burrada de código que supondría escribir una implementación manual, no me refería a usar un módulo que ya exponga todas las funciones y miembros Win32 necesarios para esa tarea como parece ser "win32gui", el cual por cierto no sabia que existia ...apenas uso Python y como dije en todo momento no sabia muy bien como se llevaria a cabo el código en Python xD.

Saludos!
« Última modificación: 12 Agosto 2016, 20:37 pm por Eleкtro » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines