elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
28 Mayo 2012, 05:18  


Tema destacado: Últimos eventos sobre seguridad/inseguridad

+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (Moderador: [D4N93R])
| | | |-+  Ejecutar proceso en Mono/C# sobre ubuntu
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ejecutar proceso en Mono/C# sobre ubuntu  (Leído 3,348 veces)
unjust63

Desconectado Desconectado

Mensajes: 6


Ver Perfil
Ejecutar proceso en Mono/C# sobre ubuntu
« en: 10 Febrero 2010, 19:54 »

Hola.

Realizo lo siguiente en mono:

Process p = new Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.FileName = "gnome-sudoku"
p.Start();
p.WaitForInputIdle();

y posteriormente y a continuación en el código, realizo lo siguiente:

Process sk = new Process();
sk.StartInfo.FileName = "xsendkeys";
sk.StartInfo.Arguments = 95; //corresponde a la tecla F11
sk.Start();


Lo que quiero hacer, es mandar la tecla F11 a la ventana activa, y
funciona, sólo que la tecla se manda sin parar. Quiero decir que es como
si dejara la tecla F11 pulsada sobre la ventana de gnome-sudoku, por lo
que la ventana no para de bailar. Lo he probado también con xdotool y
sucede igual. System.Windows.Forms.SendKeys.Send no funciona, al parecer
, sobre ventanas gtk.

Si lo hago directamente sobre una ventana de shell, funciona bien. Es
como si el process.start() no terminara de funcionar bien, y yo no
supiera hacerlo como se debe.

Alguna idea? Gracias por adelantado.

Juan Carlos F.


En línea
Keyen Night


Desconectado Desconectado

Mensajes: 315


Nothing


Ver Perfil
Re: Ejecutar proceso en Mono/C# sobre ubuntu
« Respuesta #1 en: 11 Febrero 2010, 00:50 »

Usa SendMessage con las intrucciones WM_CHAR, WM_KEYDOWN y WM_KEYUP.
Es la forma más sencilla de enviar teclas a aplicaciones externas sin que se pierdan hacia otro lado simplemente enviarlas al handle...
Aquí te pongo un ejemplo de un void llamado SendKey
Código
    public const int WM_CHAR = 0x102;
   public const int WM_KEYDOWN = 0x100;
   public const int WM_KEYUP = 0x101;
 
public static void SendKey(IntPtr mHandle, int key)
{
   SendMessage(mHandle, WM_KEYDOWN, key, 0);
   SendMessage(mHandle, WM_CHAR, key, 0);
   SendMessage(mHandle, WM_KEYUP, key, 0);
   Thread.Sleep(0x19);
}

Lo use y lo sigo usando es my efectivo :P


En línea

La Fé Mueve Montañas...
                                    ...De Dinero

[Aporte] Factorización Relativamente Rápida
vertexSymphony


Desconectado Desconectado

Mensajes: 2.156



Ver Perfil WWW
Re: Ejecutar proceso en Mono/C# sobre ubuntu
« Respuesta #2 en: 11 Febrero 2010, 03:49 »

@Keyen : Lamento pincharte el globo, pero dijo mono/ubuntu, que ... ah si, es LINUX | me gustaría que te tomes la molestia de leer un poquito más el thread antes de postear  (perdón si soné agresivo, pero la gente que postea sin leer me saca de quicio ... gracias !)

@unjust63 : Hola ! justo vi tu mail en la lista de correo de mono ....
te comento, si el xsendkeys es este que creo : http://people.csail.mit.edu/adonovan/hacks/xsendkey.html (el code es correcto, ya que hace el release y tiene el count en 1 como default)

entonces no debería haber problemas con esto (no lo probé con gnome-sudoku, ya que trato de mantener mi sistema limpio de las librerías GTK, pero sí con otras apps.) :

Código
using System;
using System.Diagnostics;
 
namespace KeySend
{
 class keyDemo
 {
   public static void Main()
   {
 
     // aca te toca iniciar el proceso que quieras para obtener foco
     // o indicar el ID de la ventana como parametro a xsendkeys
     // (lo mas apropiado seria esto, sin duda)
 
     Process mProcess = new Process();
     mProcess.StartInfo.FileName = "./xsendkeys";
     mProcess.StartInfo.Arguments = "F11";
     mProcess.Start();
   }
 }
 
}
 
 

todo va de 10, ¿no veo el problema ?  :-\

Saludos ~
« Última modificación: 11 Febrero 2010, 04:00 por Vertex.Symphony » En línea

Mail/PGP/XMPP/D*
Código
gpg --recv-keys --keyserver pgp.mit.edu 0xCD21671D
unjust63

Desconectado Desconectado

Mensajes: 6


Ver Perfil
Re: Ejecutar proceso en Mono/C# sobre ubuntu
« Respuesta #3 en: 11 Febrero 2010, 10:02 »

Buenas Vertex.Symphony.

Gracias por la respuesta. El caso es que sobre la consola va perfecto, pero si la ventana activa es otra que no sea la consola (di gnome-sudoku, di cualquier otra que admita el f11) la pulsación de tecla se mantiene. Es algo muy raro... no lo consigo hacer funcionar.

Te agradecería que intentaras realizarlo sobre cualquier otra ventana activa y me dijeras que sucede. En mi caso, el xsendkeys sobre cualquier otra ventana que no sea la consola no funciona, y el xsendkeycode funciona, pero mal.

Gracias por las molestias.
Juan Carlos.
En línea
elmaro


Desconectado Desconectado

Mensajes: 301


Unas simples palabras...


Ver Perfil
Re: Ejecutar proceso en Mono/C# sobre ubuntu
« Respuesta #4 en: 11 Febrero 2010, 18:49 »

Buenas.
Y si pruebas finalizando el proceso?

Código
mProcess.Kill();
En línea
unjust63

Desconectado Desconectado

Mensajes: 6


Ver Perfil
Re: Ejecutar proceso en Mono/C# sobre ubuntu
« Respuesta #5 en: 11 Febrero 2010, 19:37 »

Hola.

Ya lo probé. Si hago un Kill justo despues del Start, no funciona, ya que no da tiempo a ejecutarse el proceso, y si lo hago esperando unos segundos, o despues del waitforinputidle, hace lo mismo que sin el kill. El caso es que el proceso ha terminado de ejecutarse, ya no está en la lista de procesos de ps -e, pero la pulsación de la tecla, se repite sin parar. Es como dejar la tecla pulsada.
En línea
elmaro


Desconectado Desconectado

Mensajes: 301


Unas simples palabras...


Ver Perfil
Re: Ejecutar proceso en Mono/C# sobre ubuntu
« Respuesta #6 en: 11 Febrero 2010, 20:50 »

Hola.

Ya lo probé. Si hago un Kill justo despues del Start, no funciona, ya que no da tiempo a ejecutarse el proceso, y si lo hago esperando unos segundos, o despues del waitforinputidle, hace lo mismo que sin el kill. El caso es que el proceso ha terminado de ejecutarse, ya no está en la lista de procesos de ps -e, pero la pulsación de la tecla, se repite sin parar. Es como dejar la tecla pulsada.

Entonces supongo que ya probaste antes del Start

Código
 mProcess.WaitForExit();

De todas formas, si la tecla queda pulsada no hay una forma de "despulsarla" usando algo similar al SendMessage?. Nunca llegue a programar en Ubuntu lamentablemente

Saludos
En línea
vertexSymphony


Desconectado Desconectado

Mensajes: 2.156



Ver Perfil WWW
Re: Ejecutar proceso en Mono/C# sobre ubuntu
« Respuesta #7 en: 11 Febrero 2010, 21:50 »

Es por eso que dije que el código del xsendkeys es correcto, si vamos a este pasaje del código (donde se envía la tecla y después el release) :

Código
SendEvent(&event);
 
event.type = KeyRelease;
SendEvent(&event);

Acá lo probé de esta forma :

Código
using System;
using System.Diagnostics;
using System.Threading;
 
namespace KeySend
{
 class keyDemo
 {
   public static void Main()
   {
     Process mApp = new Process();
     mApp.StartInfo.FileName = "google-chrome";
     mApp.Start();
 
     Thread.Sleep(5000);
 
     Process mProcess = new Process();
     mProcess.StartInfo.FileName = "./xsendkeys";
     mProcess.StartInfo.Arguments = "F11";
     mProcess.Start();
   }
 }
 
}
 

y me fue de 10, me puso el chrome en pantalla completa ...
fijate si el code del xsendkeys es el mismo que el mío y probalo, ya que en ese sitio leí que tenía un parche....

si no tuviste éxito,me instalo el gnome-sudoku en una máquina virtual, veo cual es el problema y te modifico el xsendkeys para que cumpla su función  ...

Saludos ~
« Última modificación: 11 Febrero 2010, 21:52 por Vertex.Symphony » En línea

Mail/PGP/XMPP/D*
Código
gpg --recv-keys --keyserver pgp.mit.edu 0xCD21671D
unjust63

Desconectado Desconectado

Mensajes: 6


Ver Perfil
Re: Ejecutar proceso en Mono/C# sobre ubuntu
« Respuesta #8 en: 12 Febrero 2010, 14:34 »

Buenas Vertex.Symphony .

Pues voy a bajarme ese código, lo compilo y te digo. Aunque me bajé también la aplicacion xdotool que hace lo mismo (y más cosas) y también funciona mal.

Te digo algo en probarlo todo. Gracias por las molestias.
En línea
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  
Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines