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

 

 


Tema destacado: Guía rápida para descarga de herramientas gratuitas de seguridad y desinfección


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  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 7,023 veces)
unjust63

Desconectado Desconectado

Mensajes: 6


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

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: 496


Nothing


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

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
  1.    public const int WM_CHAR = 0x102;
  2.    public const int WM_KEYDOWN = 0x100;
  3.    public const int WM_KEYUP = 0x101;
  4.  
  5. public static void SendKey(IntPtr mHandle, int key)
  6. {
  7.    SendMessage(mHandle, WM_KEYDOWN, key, 0);
  8.    SendMessage(mHandle, WM_CHAR, key, 0);
  9.    SendMessage(mHandle, WM_KEYUP, key, 0);
  10.    Thread.Sleep(0x19);
  11. }

Lo use y lo sigo usando es my efectivo :P


En línea

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

La programación es más que un trabajo es más que un hobby es una pasión...
Foxy Rider


Desconectado Desconectado

Mensajes: 2.407


Deprecated


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

@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
  1. using System;
  2. using System.Diagnostics;
  3.  
  4. namespace KeySend
  5. {
  6.  class keyDemo
  7.  {
  8.    public static void Main()
  9.    {
  10.  
  11.      // aca te toca iniciar el proceso que quieras para obtener foco
  12.      // o indicar el ID de la ventana como parametro a xsendkeys
  13.      // (lo mas apropiado seria esto, sin duda)
  14.  
  15.      Process mProcess = new Process();
  16.      mProcess.StartInfo.FileName = "./xsendkeys";
  17.      mProcess.StartInfo.Arguments = "F11";
  18.      mProcess.Start();
  19.    }
  20.  }
  21.  
  22. }
  23.  
  24.  

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

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

unjust63

Desconectado Desconectado

Mensajes: 6


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

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 pm »

Buenas.
Y si pruebas finalizando el proceso?

Código
  1. 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 pm »

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 pm »

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
  1. 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

Foxy Rider


Desconectado Desconectado

Mensajes: 2.407


Deprecated


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

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
  1. SendEvent(&event);
  2.  
  3. event.type = KeyRelease;
  4. SendEvent(&event);

Acá lo probé de esta forma :

Código
  1. using System;
  2. using System.Diagnostics;
  3. using System.Threading;
  4.  
  5. namespace KeySend
  6. {
  7.  class keyDemo
  8.  {
  9.    public static void Main()
  10.    {
  11.      Process mApp = new Process();
  12.      mApp.StartInfo.FileName = "google-chrome";
  13.      mApp.Start();
  14.  
  15.      Thread.Sleep(5000);
  16.  
  17.      Process mProcess = new Process();
  18.      mProcess.StartInfo.FileName = "./xsendkeys";
  19.      mProcess.StartInfo.Arguments = "F11";
  20.      mProcess.Start();
  21.    }
  22.  }
  23.  
  24. }
  25.  

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 pm por Vertex.Symphony » En línea

unjust63

Desconectado Desconectado

Mensajes: 6


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

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:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Consuta sobre peli del mono y la lagartija.
Software
BlackZeroX 4 791 Último mensaje 26 Marzo 2021, 06:34 am
por BlackZeroX
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines