PDA

Ver la Versión Completa : SendMessage de otra aplicacion


cmm07
28-01-2008, 15:50:36
Hola, necesito hacer lo sig. haber si ustedes me pueden ayudar y disculpen las molestias esque no logro conseguirlo, quiero que desde mi aplicacion oprima un boton de otra aplicacion cualquiera por ejemplo:

Mi aplicacion ---Oprima el boton siguiente de un instalador:

será algo así que error tiene:

var
Instala : HWND;
begin
Instala := FindWindowEx(FindWindow(nil, 'Instalador'), 0, 'Button','&Siguiente');
SendMessage(Instala, WM_LBUTTONDOWN, VK_SPACE, 0);
SendMessage(Instala, WM_LBUTTONUP, VK_SPACE, 0);


que me faltará como lo puedo hacer gracias..

you frind

aeff
28-01-2008, 17:53:39
saludos!!

me parece que no te funciona porque ese código que ejecutas no se encuentra dentro de la dirección de memoria del programa "Instalador" o de otro cualquiera al que intentas clickearle el button,

para lograr esto de esa *forma que intentas*, creo que debes inyectarte dentro de ese otro programa, eso de inyecciones es un poco graaaande y trabajoso, te presento una forma mas cómoda y sin complicarnos con direcciones de memorias u otra cosa:


procedure TForm1.Button1Click(Sender: TObject);
var
hWnd, hBtn: Cardinal;
btnPos: TWindowInfo;
vCPosBefore: TPoint;
X, Y: Integer;
begin

hWnd := FindWindow(nil, 'Ejecutar');
hBtn := FindWindowEx(hWnd, 0, 'Button', '&Examinar...');

GetCursorPos(vCPosBefore);
SetForegroundWindow(hWnd);

if GetWindowInfo(hBtn, btnPos) = true then
begin
X := btnPos.rcClient.Left + ((btnPos.rcClient.Right - btnPos.rcClient.Left) div 2);
Y := btnPos.rcClient.Top + ((btnPos.rcClient.Bottom - btnPos.rcClient.Top) div 2) ;
SetCursorPos(X, Y);
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
Sleep(0);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
end;

// Para regresar a nuestra ventanita, claro, si lo deseas...
SetCursorPos(vCPosBefore.x, vCPosBefore.y);
SetForegroundWindow(Handle);
end;


que crees? abre la ventanita "Ejecutar" de Windows y pruébalo!!!

de todas formas, lo que intentabas hacer presionando espacio en el button, creo que antes debes pasarle el foco, y aún así, yo no lo haría de esa forma, por ejemplo, te muestro como lo haría si quisiera mandar a clickear un button de mi formulario:


SendMessage(Form1.Handle, WM_COMMAND, 0, Button1. Handle);


** claro, que este código se ejecuta dentro de la misma dirección de memoria de mi programa... por eso me funciona ok!**


espero que te funcione!!!

saludos,

cmm07
28-01-2008, 18:51:12
No logro que funcione pero de todas formas muchas gracias me sirvio como referencial, no se si es mucho pedir que me hagan un ejemplillo acerca de como usar esto.

gracias
*SALU2

ixMike
28-01-2008, 18:59:46
No logro que funcione
¿Por qué? ¡Dinos qué te falla!

muchas gracias me sirvio como referencial, no se si es mucho pedir que me hagan un ejemplillo acerca de como usar esto.
Si verdaderamente te sirvió de referencia, entonces creo que serías capaz de hacerlo tú mismo ;) (venga, esfuérzate un poco, sabemos que puedes hacerlo :))

*SALU2

¡Y deja de copiarme el saludo! :D:D:D


Salu2.

cmm07
28-01-2008, 20:52:14
Hola, siisisisiiss me funciono de maravillas gracias gracias, el unico problema esque no todos los botones funcionan, por ej cuando coloco cancelar funciona pero cuando coloco abrir no me funciona no me hace caso, que puede ser...

Gracias


SALU2 :D:D:D:D:D:D:D:

Gracias
lol

ixMike
28-01-2008, 21:09:19
el unico problema esque no todos los botones funcionan, por ej cuando coloco cancelar funciona pero cuando coloco abrir no me funciona no me hace caso, que puede ser...


Bueno, fíjate si tiene un carácter subrayado. Por si no lo sabías, ese carácter indica que puedes accionar el botón mediante la combinación de teclas Alt+El_carácter_que_sea, o también sencillamente pulsando ese carácter si estás situado (esto es, el foco) en otro botón o similar.

Para ponerlo en el Caption, este carácter va precedido del '&', así que, por ejemplo, si pone "Abrir", tú deberías poner en el código '&Abrir'.

No se me ocurre otra cosa.

Sal (http://es.wikipedia.org/wiki/Sal) u2 (http://es.wikipedia.org/wiki/U2) [toma, a que este no se te había ocurrido :D:D]

cHackAll
28-01-2008, 21:32:59
Tomando la idea de AEFF y consejos de ixMike;

procedure TForm1.Button1Click(Sender: TObject);
var hWnd: Integer;
begin
hWnd := FindWindowEx(FindWindow(nil, 'Ejecutar'), 0, 'Button', 'Cancelar');
SendMessage(hWnd, WM_LBUTTONDOWN, 0, 0);
SendMessage(hWnd, WM_LBUTTONDOWN, 0, 0);
SendMessage(hWnd, WM_LBUTTONUP, 0, 0);
end;

Saludos

cmm07
29-01-2008, 01:27:05
mychas gracias me anda de maravilla.