ArchiveOrangemail archive

La lista de python en castellano


python-es.python.org
(List home) (Recent threads) (100 other Python lists)

Subscription Options

  • RSS or Atom: Read-only subscription using a browser or aggregator. This is the recommended way if you don't need to send messages to the list. You can learn more about feed syndication and clients here.
  • Conventional: All messages are delivered to your mail address, and you can reply. To subscribe, send an email to the list's subscribe address with "subscribe" in the subject line, or visit the list's homepage here.
  • Low traffic list: less than 3 messages per day
  • This list contains about 34,557 messages, beginning Jan 2001
  • 0 messages added yesterday
Report the Spam
This button sends a spam report to the moderator. Please use it sparingly. For other removal requests, read this.
Are you sure? yes no

simular teclado.

Ad
Dani 1196265347Wed, 28 Nov 2007 15:55:47 +0000 (UTC)
Hola gentes varias.

Necesito que un programa que estoy haciendo se comunique con otro programa
simulando ser el teclado.
Tengo winXP como sistema operativo (por poco tiempo, espero).
Puedo lanzar el programa con el que me quiero comunicar sin problemas,
usando popen3 o el módulo subprocess.
Ambos me crean, corregidme si me equivoco, tres objetos de tipo fichero para
manejar los PIPEs.
Ahora bien, żcomo envío por el PIPE códigos de teclas de función, si se ha
pulsado una flecha o la tecla enter?.

Gracias y un saludo.
Dani.
Reynaldo Baquerizo Micheline 1196269033Wed, 28 Nov 2007 16:57:13 +0000 (UTC)
Dani escribió:
> Hola gentes varias.
>
> Necesito que un programa que estoy haciendo se comunique con otro programa
> simulando ser el teclado.
> Tengo winXP como sistema operativo (por poco tiempo, espero).
> Puedo lanzar el programa con el que me quiero comunicar sin problemas,
> usando popen3 o el módulo subprocess.
> Ambos me crean, corregidme si me equivoco, tres objetos de tipo fichero para
> manejar los PIPEs.
> Ahora bien, żcomo envío por el PIPE códigos de teclas de función, si se ha
> pulsado una flecha o la tecla enter?.
>Fíjate en el método communicate() de la clase Popen en subprocess.> Gracias y un saludo.
> Dani.
> _______________________________________________
>
Dani 1196335548Thu, 29 Nov 2007 11:25:48 +0000 (UTC)
>
> > Ahora bien, żcomo envío por el PIPE códigos de teclas de función, si se
> ha
> > pulsado una flecha o la tecla enter?.Fíjate en el método communicate() de la clase Popen en subprocess.



Si no lo he entendido mal este método solo trabaja con cadenas. Crea un
objeto fichero que es la 'entrada' al PIPE hacia la aplicación que se ha
lanzado con Popen. El probema es que este pipe es tipo texto, y no se como
mandar los códigos de las teclas de flechas, función, retorno, etc... Creo
que para eso sería necesario un objeto fichero de tipo binario. Tengo
entendido que las teclas 'especiales' tienen un código de dos bytes, por
ejemplo F1 es (0,59), enter es (0,13) y flecha derecha (224,77).

El código que más se parece a lo que quiero hacer es SendKeys[1], pero en
este precisamente la rutina de comunicación con la aplicación está escrita
en C. Además no se comunica con una aplicación que hayamos lanzado sino con
la ventana que tiene el control en ese momento.

żAlguien ha probado algo similar?
Gracias.
Dani.

[1] http://www.rutherfurd.net/python/sendkeys/
lasizoillo 1196642381Mon, 03 Dec 2007 00:39:41 +0000 (UTC)
Buenas:El 29/11/07, Dani <dani.berzas en gmail.com> escribió:
> >
> > > Ahora bien, żcomo envío por el PIPE códigos de teclas de función, si se
> > ha
> > > pulsado una flecha o la tecla enter?.
>
>
> Fíjate en el método communicate() de la clase Popen en subprocess.
>Con este truco puedes enviar datos tal como se enviarian por la
entrada estandar, que normalmente implica recoger cosas de teclado,
pero no lo estas garantizando.>
>
> Si no lo he entendido mal este método solo trabaja con cadenas. Crea un
> objeto fichero que es la 'entrada' al PIPE hacia la aplicación que se ha
> lanzado con Popen. El probema es que este pipe es tipo texto, y no se como
> mandar los códigos de las teclas de flechas, función, retorno, etc... Creo
> que para eso sería necesario un objeto fichero de tipo binario. Tengo
> entendido que las teclas 'especiales' tienen un código de dos bytes, por
> ejemplo F1 es (0,59), enter es (0,13) y flecha derecha (224,77).
>Creo que el cómo envie en binario los datos el teclado a su
correspondiente controlador no te va a servir de mucho :-(

Quiza con alguna secuencia de escape... De todas formas yo no perdería
mucho tiempo por ahí.> El código que más se parece a lo que quiero hacer es SendKeys[1], pero en
> este precisamente la rutina de comunicación con la aplicación está escrita
> en C. Además no se comunica con una aplicación que hayamos lanzado sino con
> la ventana que tiene el control en ese momento.
>Por lo que he visto, usa el API de windows para simular las
pulsaciones. Y si no te importa usar el API de windows no hay
problemas en usarlo tambien para ganar el foco a la ventana de la
aplicación que has lanzado. Puedes simular tambien el ratón y lo que
haga falta. Pero si vas a usar el API de windows creo que lo más facil
es usar esto http://python.net/crew/mhammond/win32/

> żAlguien ha probado algo similar?

Probe hace ańos python para ayudado del api de windows usar una
aplicación (creo que era con el api del link). El usar ventanitas
desde otro proceso es algo que no te va a permitir las X Windows si
cambias a Linux o FreeBSD. Esa feature es algo que tenia (żtiene?)
windows para permitir hacer keyloggers y demás troyanos.

Veo solución a tu problema, pero no una solución portable. :-(

> Gracias.

Espero que las merezca ;-)


Salud y verduras:

Javi
Reynaldo Baquerizo Micheline 1196644009Mon, 03 Dec 2007 01:06:49 +0000 (UTC)
lasizoillo escribió:
> Buenas:
>
> El 29/11/07, Dani <dani.berzas en gmail.com> escribió:
>   
>>>> Ahora bien, żcomo envío por el PIPE códigos de teclas de función, si se
>>>>         
>>> ha
>>>       
>>>> pulsado una flecha o la tecla enter?.
>>>>         
>> Fíjate en el método communicate() de la clase Popen en subprocess.
>>
>>     
>
> Con este truco puedes enviar datos tal como se enviarian por la
> entrada estandar, que normalmente implica recoger cosas de teclado,
> pero no lo estas garantizando.
>
>   
>> Si no lo he entendido mal este método solo trabaja con cadenas. Crea un
>> objeto fichero que es la 'entrada' al PIPE hacia la aplicación que se ha
>> lanzado con Popen. El probema es que este pipe es tipo texto, y no se como
>> mandar los códigos de las teclas de flechas, función, retorno, etc... Creo
>> que para eso sería necesario un objeto fichero de tipo binario. Tengo
>> entendido que las teclas 'especiales' tienen un código de dos bytes, por
>> ejemplo F1 es (0,59), enter es (0,13) y flecha derecha (224,77).
>>
>>     
>
> Creo que el cómo envie en binario los datos el teclado a su
> correspondiente controlador no te va a servir de mucho :-(
>
> Quiza con alguna secuencia de escape... De todas formas yo no perdería
> mucho tiempo por ahí.
>
>   
>> El código que más se parece a lo que quiero hacer es SendKeys[1], pero en
>> este precisamente la rutina de comunicación con la aplicación está escrita
>> en C. Además no se comunica con una aplicación que hayamos lanzado sino con
>> la ventana que tiene el control en ese momento.
>>
>>     
>
> Por lo que he visto, usa el API de windows para simular las
> pulsaciones. Y si no te importa usar el API de windows no hay
> problemas en usarlo tambien para ganar el foco a la ventana de la
> aplicación que has lanzado. Puedes simular tambien el ratón y lo que
> haga falta. Pero si vas a usar el API de windows creo que lo más facil
> es usar esto http://python.net/crew/mhammond/win32/
>
>Tengo una duda con esto,

el problema es, żcómo detectar las pulsaciones del teclado? o żcómo 
enviarlas?

No te serviría pygame [1] para detectarlas?
Tienes pensado enviar alguna otra cosa por la PIPE que no sean las 
pulsaciones del teclado?

[1] http://www.pygame.org/docs/ref/key.html

Saludos,>> żAlguien ha probado algo similar?
>>     
>
> Probe hace ańos python para ayudado del api de windows usar una
> aplicación (creo que era con el api del link). El usar ventanitas
> desde otro proceso es algo que no te va a permitir las X Windows si
> cambias a Linux o FreeBSD. Esa feature es algo que tenia (żtiene?)
> windows para permitir hacer keyloggers y demás troyanos.
>
> Veo solución a tu problema, pero no una solución portable. :-(
>
>   
>> Gracias.
>>     
>
> Espero que las merezca ;-)
>
>
> Salud y verduras:
>
> Javi
> _______________________________________________
> Lista de correo Python-es 
> http://listas.aditel.org/listinfo/python-es
> FAQ: http://listas.aditel.org/faqpyes
>
Dani 1196967460Thu, 06 Dec 2007 18:57:40 +0000 (UTC)
Hola otra vez...
me estoy metiendo en un berenjeral...
he encontrado gente con problemas parecidos en otros idiomas[1].


y estoy dándole vueltas a win32api, WMI, COM... pero todavía nada.
Tim Golden parece que ha desarrollado lo que estoy buscando, una WMI [2]
basado en win32 extensions from Mark
Hammond<http://starship.python.net/crew/mhammond/>y uno de los
ejemplos es clavadito a lo que quiero:

c = wmi.WMI ()
pid, result = c.Win32_Process.Create (CommandLine="notepad.exe")
for p in c.Win32_Process (ProcessId=pid):
  p.Terminate ()

El problema es que no se comunica con el proceso. Si a partir de ese PID me
pudiera comunicar con el proceso sería fantástico.
Los objetos tipo Shell si tienen la función SendKeys,

import win32com.client
shell = win32com.client.Dispatch("WScript.Shell")
shell.AppActivate("Command Prompt")
shell.SendKeys("cls{ENTER}")
shell.SendKeys("dir{ENTER}")
shell.SendKeys("echo Hi There{ENTER}")

pero no se como 'contactar' con un proceso por el PID

[1] http://mail.python.org/pipermail/python-list/...
[2] Windows Management Instrumentation (WMI)>
> > Por lo que he visto, usa el API de windows para simular las
> > pulsaciones. Y si no te importa usar el API de windows no hay
> > problemas en usarlo tambien para ganar el foco a la ventana de la
> > aplicación que has lanzado. Puedes simular tambien el ratón y lo que
> > haga falta. Pero si vas a usar el API de windows creo que lo más facil
> > es usar esto http://python.net/crew/mhammond/win32/



> Tengo una duda con esto,
>
> el problema es, żcómo detectar las pulsaciones del teclado? o żcómo
> enviarlas?Es enviarlas. Realmente no hay teclado, lo que quiero es que un programa
python haga 'como que pulsa las teclas'.> > Probe hace ańos python para ayudado del api de windows usar una
> > aplicación (creo que era con el api del link). El usar ventanitas
> > desde otro proceso es algo que no te va a permitir las X Windows si
> > cambias a Linux o FreeBSD. Esa feature es algo que tenia (żtiene?)
> > windows para permitir hacer keyloggers y demás troyanos.Si  acabo trabajando con Linux, dios quiera que sea pronto, no necesitaré
hacer semejantes cábalas de hacerme pasar por el teclado; simplemente
usaremos programas que corren en linea de comandos o con los que uno se
puede comunicar de una forma razonable.>
> > Veo solución a tu problema, pero no una solución portable. :-(je je je, me vale con que sea una solución 'potable'.>
> >
> >> Gracias.
> >>
> >
> > Espero que las merezca ;-)
> >las merece, gracias otra vez>
> > Salud y verduras:
> >
> > Javisalud y a ver si nos vemos en un domingo verde, ;-)
Dani 1197641301Fri, 14 Dec 2007 14:08:21 +0000 (UTC)
Bueno,
pues he encontrado una función que simula un evento de teclado:
win32api.keybd_event(65, 0, 0, 0)      (simula que has presionado la tecla
a)

Lanzo la aplicación con win32process.CreateProcess, pero ahora no se como
darle el foco a esta aplicación para que 'reciba' las pulsaciones de
teclado.

żAlguien sabe la manera de darle el foco a una ventana en windows?

Gracias.
Dani.
Oswaldo Hernández 1197643552Fri, 14 Dec 2007 14:45:52 +0000 (UTC)
Dani escribió:
> Bueno,
> pues he encontrado una función que simula un evento de teclado:
> win32api.keybd_event(65, 0, 0, 0)      (simula que has presionado la tecla
> a)
> 
> Lanzo la aplicación con win32process.CreateProcess, pero ahora no se como
> darle el foco a esta aplicación para que 'reciba' las pulsaciones de
> teclado.
> 
> żAlguien sabe la manera de darle el foco a una ventana en windows?
>Si no recuero mal en el api de windows habia una funcion FindWindowByTitle(), o algo parecido, que 
te devolvia el handle a la ventana. Una vez lo tengas posiblemente con SetFocus() la podras activar.



-- 
*****************************************
Oswaldo Hernández
oswaldo (@) soft-com (.) es*****************************************
Gabriel Genellina 1197758468Sat, 15 Dec 2007 22:41:08 +0000 (UTC)
En Fri, 14 Dec 2007 11:45:52 -0300, Oswaldo Hernández <listas en soft-com.es>  
escribi?:

> Dani escribió:
>> Bueno,
>> pues he encontrado una función que simula un evento de teclado:
>> win32api.keybd_event(65, 0, 0, 0)      (simula que has presionado la  
>> tecla
>> a)
>>  Lanzo la aplicación con win32process.CreateProcess, pero ahora no se  
>> como
>> darle el foco a esta aplicación para que 'reciba' las pulsaciones de
>> teclado.
>>  żAlguien sabe la manera de darle el foco a una ventana en windows?
>>
>
> Si no recuero mal en el api de windows habia una funcion  
> FindWindowByTitle(), o algo parecido, que te devolvia el handle a la  
> ventana. Una vez lo tengas posiblemente con SetFocus() la podras activar.Sip, pero hay muchos más detalles que hay que tener en cuenta para  
enviarle eventos de teclado a otra aplicación. Yo sugiero usar sendkeys,  
que ya lo tiene resuelto:  
http://www.rutherfurd.net/python/sendkeys/ind... o mejor pywinauto  
http://www.openqa.org/pywinauto/ (que usa la libreria anterior) que te  
deja automatizar una aplicación en una forma muy "pythonesca".-- 
Gabriel Genellina

------------ próxima parte ------------
Dani 1197883684Mon, 17 Dec 2007 09:28:04 +0000 (UTC)
bueno, pues he conseguido mandar eventos de teclado a una aplicación lanzada
desde python de la siguiente manera:
info = win32process.CreateProcess(...)
time.sleep(10)
win32gui.SetFocus(info[0])
win32api.keybd_event(win32con.VK_F10, 0)
time.sleep(2)
win32api.TerminateProcess(info[0],-1)
win32api.CloseHandle(info[0])

win32con.VK_F10 genera el código de la tecla de función 10.

Este método funciona con 'notepad', que corre en una ventana de windows,
pero no me funciona con 'kobra.exe' que corre sobre MS-DOS, creo que
necesitaría una API para MS-DOS directamente.

Así que gracias a todos por vuestras ideas y recursos!!!.
Todavía me queda alguno que probar, y ya os iré comentando si alguno
funciona.

Dani.El día 15/12/07, Gabriel Genellina <gagsl-py2 en yahoo.com.ar> escribió:
>
> En Fri, 14 Dec 2007 11:45:52 -0300, Oswaldo Hernández <listas en soft-com.es>
> escribi?:
>
> > Dani escribió:
> >> Bueno,
> >> pues he encontrado una función que simula un evento de teclado:
> >> win32api.keybd_event(65, 0, 0, 0)      (simula que has presionado la
> >> tecla
> >> a)
> >>  Lanzo la aplicación con win32process.CreateProcess, pero ahora no se
> >> como
> >> darle el foco a esta aplicación para que 'reciba' las pulsaciones de
> >> teclado.
> >>  żAlguien sabe la manera de darle el foco a una ventana en windows?
> >>
> >
> > Si no recuero mal en el api de windows habia una funcion
> > FindWindowByTitle(), o algo parecido, que te devolvia el handle a la
> > ventana. Una vez lo tengas posiblemente con SetFocus() la podras
> activar.
>
> Sip, pero hay muchos más detalles que hay que tener en cuenta para
> enviarle eventos de teclado a otra aplicación. Yo sugiero usar sendkeys,
> que ya lo tiene resuelto:
> http://www.rutherfurd.net/python/sendkeys/ind... o mejor pywinauto
> http://www.openqa.org/pywinauto/ (que usa la libreria anterior) que te
> deja automatizar una aplicación en una forma muy "pythonesca".
>
> --
> Gabriel Genellina
>
>
> _______________________________________________
> Lista de correo Python-es
> http://listas.aditel.org/listinfo/python-es
> FAQ: http://listas.aditel.org/faqpyes
>------------ próxima parte ------------
Home | About | Privacy