PDA

Ver la Versión Completa : Enviar Teclas a una aplicacion


JulioCesarPauli
04-10-2003, 23:36:20
Hola: :)

Otra vez con lo mismo:o

He leido los foros y encontrado la solucion para envio de teclas a otra aplicacion, particularmente me funciono el truco http://www.clubdelphi.com/vertruco.php?id=411

pero mi problema es realmente que no encuentro como obtener el foco del "campo" al que quiero pasarle las teclas

Estoy haciendo un "Parche" para una aplicacion que solo tengo el EXE y requiero enviarle ciertos datos.

Ok.. visto de otra manera.. si tuviesen que enviarle teclas digamos al explorador de internet cuya pagina principal es Yahoo como hago para que se envien los datos al campo de busqueda, porque cuando se abre el explorador, no recibe el foco ningun campo y las teclas se "pierden"

Aunque este no es el caso, esto me ayudaria a resolver mi problema.

P.D. no me sirve el enviar TAB's y Flechitas;)

roman
05-10-2003, 04:45:24
El problema aquí es que para poder poner el foco en el control deseado necesitas poder identificar dicho control.

La única manera que se me ocurre es similar a mandar tabs o flechitas pero con la diferencia de que no lo nota el usuario.

Comienzas identificando la ventana del programa con FindWindow. Para ello necesitarás saber el título de la ventana y/o el nombre de clase. Me parece más conveniente lo último para evitar confusiones con otra posibles ventanas que tengan el mismo título.

La manera má rápida de saber el nombre de la clase es usando el programa WinSight que viene incluído con Delphi.

Una vez que tengas el "handle" de la ventana usas FindWindowEx para encontrar el control deseado. Deberás aplicar tantos FindWindowEx (ejemplo abajo) como controles haya antes del deseado.

Esta es la parte similar a la de mandar Tabs pero el usuario no se percata de ello.

Finalmente, una vez que tengas el "handle" del control deseado le mandas el mensaje WM_NETXDLGCTL a la ventana padre para poner el foco.

Vamos a suponer que la aplicación tiene por nombre de clase: "ClaseApp" y que estás buscando un control de edición. Normalmente la clase de estos controles es "EDIT". Supongamos que es el cuarto control. El código sería como sigue:


var
Parent: HWnd;
Child: HWnd;

begin
Parent := FindWindow('ClaseApp', nil);
if Parent <> 0 then
begin
Child := FindWindowEx(Parent, 0, 'EDIT', nil);
Child := FindWindowEx(Parent, chldHandle, 'EDIT', nil);
Child := FindWindowEx(Parent, chldHandle, 'EDIT', nil);
Child := FindWindowEx(Parent, chldHandle, 'EDIT', nil);

SendMessage(Parent, WM_NEXTDLGCTL, chldHandle, 1);
end;
end;


Por supuesto la cuestión se complica un poco si el control deseado no es hijo directo de la ventana padre (por ejemplo si está dentro de un panel). En tal caso deberás usar un extra FindWindowEx para encontrar el control intermedio y usar ese como padre.

Nota En la prueba que hice los controles los va hallando en orden inverso al orden de tabulación, pero bastará seguir dicho orden.

// Saludos

JulioCesarPauli
20-10-2003, 19:28:30
Mil gracias por tu ayuda:)
Todo un rollo localizar la ventana:(

P.D. disculpa por tardar en responder, ando metido en otros rollos :D