Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Editar sobre otros procesos. (https://www.clubdelphi.com/foros/showthread.php?t=57514)

rauros 18-06-2008 13:40:04

Editar sobre otros procesos.
 
Saludos, he vuelto. He intentado hacer una cosa para funcionar con otros procesos. No se si me explico bien, pero por si acaso voy a explicarlo con un ejemplo.

Yo hago un programa que tiene un botón, al activarlo, "activa" otro botón de otro proceso. Por ejemplo, funcionando con notepad, que escriba "Probando botón", como si yo hubiera clicado todos esos botones. Me gustaría saber también si es muy complicado o si ya hay algún ejemplo por aquí (no he encontrado ninguno). Gracias a tod@s de antemano.

Caro 18-06-2008 13:53:29

Hola rauros, quieres que cuando hagas click digamos en Button1, llamar al codigo que hay en tus otros Buttons.

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
 ...........
 Button2Click(Sender);
 Button3Click(Sender);
end;

Saluditos

duilioisola 18-06-2008 14:09:21

También puedes utilizar el metodo TButton.Click
La diferencia con la otra forma es que se asigna el ModalResult que tenga el botón al que le haces click y luego se ejecuta su código OnClick.

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
   ...
   Button2.Click;
   Button3.Click;
   ...
end;
Del Help de Delphi6
Cita:

Simulates a mouse click, as if the user had clicked the button.

procedure Click; override;

Description
Calling Click assigns the value of the button’s ModalResult property to the ModalResult property of its parent form, and then generates an OnClick event.

rauros 18-06-2008 14:47:19

No no, eso ya lo sabía. Lo que quiero es manejar otros procesos, externos a la aplicación delphi. Por ejemplo, tengo un juego que si pulsas el botón s saltas, pues que si activo algún procedimiento en delphi, que en el juego esté saltando todo el rato (lo del bucle infinito es sencillo, lo que no sé es manejar otras aplicaciones desde una).

poliburro 18-06-2008 15:21:08

Cita:

Empezado por rauros (Mensaje 294272)
No no, eso ya lo sabía. Lo que quiero es manejar otros procesos, externos a la aplicación delphi. Por ejemplo, tengo un juego que si pulsas el botón s saltas, pues que si activo algún procedimiento en delphi, que en el juego esté saltando todo el rato (lo del bucle infinito es sencillo, lo que no sé es manejar otras aplicaciones desde una).

Que tipo de juego es?, podrías dar más info acerca de esto?

duilioisola 18-06-2008 16:29:15

Creo entender que quieres manejar una aplicación desde otra aplicación...
Mira el tema de hooks de teclado.

Mira este hilo y los que se comentan dentro, a veri si te sirven.

Neftali [Germán.Estévez] 18-06-2008 17:18:45

¿Te serviría el envío de teclas a otras aplicaciones o necesitas hacer más cosas?
Para "activar botones" tal como tú comentas, debes conocer el Handle apropiado del elemento que quieres modificar y a partir de ahí enviarle el mensaje adecuado para activarlo, ocultarlo,...

rauros 18-06-2008 17:56:46

Sí, me vale lo de las teclas. Estoy provando con una cosa pero me faltan algunas variables por declarar. El ejemplo es este:

http://www.clubdelphi.com/foros/showthread.php?t=31113

Pero no sé que tipo es hwndWinamp ni rtrim.

¿Y en ese ejemplo donde tengo que poner la manera de llegar a esa aplicación?
¿O tiene que ser la que está delante de todas?

He visto FindWindow(nil,pchar(rtrim(gWindowName))), ¿El nombre va en el campo nil?

rauros 21-06-2008 16:58:59

Qué cojones es esto?

duilioisola 22-06-2008 01:06:30

FindWindow(nil,pchar(rtrim(gWindowName)))
No he podido ver el hilo que comentas, pero FindWindow debe ser una funcion para devolver el handle de una ventana dando su nombre

gWindowName es un string.
RTrim es una función que corta los espacios en blanco de la derecha de la cadena
pchar() convierte a un string en una cadena como las que se utilizan en C.
En Pascal y Delphi los string se definían como un byte que dice qué longitud tiene y luego los caracteres que lo componen.
En C, los string son caracteres que terminan en un caracter especial que marca el final.

El handle es finalmente un entero.

Con esto podrás saber cual es el handle de una ventan de la cual sabes el nombre. Luego, utilizando ese handle podrás enviarle información a esa ventana (teclas en tu caso).

rauros 22-06-2008 11:34:19

¿Entonces RTrim no es necesario si no escribo espacios? Es que delphi me dice que no tengo RTrim declarado...

¿Y en GWindowName pongo el nombre de la aplicación, no?

Código Delphi [-]
 hwndWinamp := FindWindow(nil,pchar(rtrim(gWindowName))); //localizamos la ventana

  IF hwndWinamp = 0 THEN BEGIN
     hwndWinamp := FindWindow(pchar(rtrim(gWindowName)),nil); //gWindowName es una variable que contiene 
//el handle de la ventana sobre la que debemos actuar
     IF hwndWinamp = 0 THEN BEGIN
       ShowMessage(gWindowName + ' Ventana NO ENCONTRADA');
       exit;
     end;
  END;
  SetForegroundWindow(hwndWinamp); //pasamos a esa ventana
  SetForegroundWindow(hwndWinamp);
  //Aqui tienes varios ejemplos de envio de pulsaciones de teclas
  PostKeyEx32(VK_HOME, [], TRUE);          
  PostKeyEx32(VK_END, [SSsHIFT], TRUE);
  PostKeyEx32(VK_INSERT, [ssCtrl], TRUE); 
  SetForegroundWindow(Handle); //De esta manera volvemos a nuestra aplicacion    
  PostKeyEx32(ord('V'), [SSCTRL], TRUE);

Ahí está el ejemplo. Lo pongo porque no se como debo declarar HwndWinamp.
He probado con HwndWinamp: handle; pero no funciona porque lo más seguro es que me lo haya inventado xD.

duilioisola 22-06-2008 11:49:20

Supongo que si declaras HWndWinamp como integer y gWindowName com string será suficiente.
De todos modos, supongo que si te pones sobre la función FindWindow y presionas F1, te dará algo de información sobre esta API. (No tengo el Delphi para probar ahora)

mira este hilo que creo que solucionará todas tus dudas

rauros 26-06-2008 20:05:28

He conseguido compilar pero no encuentra ninguna ventana... Os puedo dejar el código para que me lo corrijan? (no es mucho)

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
  gWindowName:='firefox.exe';
  hwndWinamp := FindWindow(nil,pchar(trim(gWindowName))) ; //localizamos la ventana

  IF hwndWinamp = 0 THEN BEGIN
     hwndWinamp := FindWindow(pchar(trim(gWindowName)),nil) ; //gWindowName es una variable que contiene
//el handle de la ventana sobre la que debemos actuar
     IF hwndWinamp = 0 THEN BEGIN
       ShowMessage(gWindowName + ' Ventana NO ENCONTRADA');
       exit;
     end;
  END;
  SetForegroundWindow(hwndWinamp); //pasamos a esa ventana
  SetForegroundWindow(hwndWinamp);
  //Aqui tienes varios ejemplos de envio de pulsaciones de teclas
  PostKeyEx32(VK_HOME, [], TRUE);
  PostKeyEx32(VK_END, [SSsHIFT], TRUE);
  PostKeyEx32(VK_INSERT, [ssCtrl], TRUE);
  SetForegroundWindow(Handle); //De esta manera volvemos a nuestra aplicacion
  PostKeyEx32(ord('V'), [SSCTRL], TRUE);
end;

He empezado provando con firefox pero siempre me dice
firefox.exe VENTANA NO ENCONTRADA

Neftali [Germán.Estévez] 26-06-2008 22:25:13

Prueba cambiando el primer parámetro del FindWindow por:

PChar('MozillaUIWindowClass')

Que es la clase para la ventana principal de FF; Deja el segundo parámetro a nil.

rauros 26-06-2008 23:07:12

Vale pero eso era para hacer una prueba. ¿y si necesito usar el proceso de un videojuego como puedo saber el tipo de clase para la ventana? Gracias a todos.

Neftali [Germán.Estévez] 26-06-2008 23:33:15

Utilidades com WinDowse o Winexp pueden darte el nombre de la clase para una ventana determinada.

rauros 27-06-2008 01:30:33

He solucionado los problemas, gracias. Pero hay otro problema: no puedo escribir "punto". He provado con PostKeyEx32(46, [], TRUE); pero no funciona. Pese a que con PostKeyEx32(13, [], TRUE); si que pulsa "enter" (car return) y que las letras también funcionan de ese modo. Gracias por toda la ayuda.

rauros 27-06-2008 17:14:16

Investigando un poco he encontrado que el error es de delphi, y no del susodicho juego. Pues he probado con el notepad y tampoco se escriben puntos. Creo que solo se escriben carácteres alfabéticos (a...z). A ver si alguien encuentra alguna solución, o alguien le ha pasado esto anteriormente. Gracias.

rauros 30-06-2008 15:40:24

Ya que no me ayuda nadie con el problema anterior, pondré otro nuevo a ver si alguien me puede ayudar con este. Necesito la manera de conseguir información sobre otros procesos. Un ejemplo:

Si escribo "cosa" en notepad, al clicar mi programa, lea "cosa". Muchas gracias por las ayudas anteriores.


La franja horaria es GMT +2. Ahora son las 10:59:03.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi