PDA

Ver la Versión Completa : Enviar Datos a una Aplicacion


Esau
29-05-2006, 19:19:38
Hola Amigos, hace cuatro dias , me propusieron algo interesenta, Hacer una Aplicacion en Delphi (App01) que llame a otra aplicacion (App02) (la cual no se dispone de codigo fuente ni acepta parametros) enviarle unos datos a la Caja de texto de la Aplicacion (App02) y simular el Click del Boton Aceptar, la aplicacion (App02) debe hacer algo despues de pasarle los datos en la caja de texto y presionar el boton Aceptar... pero todo esto controlado desde la Aplicacion (App01)
he estado viendo alguna documentacion en Internet pero me gustaria algun ejemplo de como efectuar esto y ver si se puede...
Creo que tiene que ver con las funciones SendMessage de Windows... pero no estoy muy seguro , ni se como utilizarlo...
una manito no estaria mal...

Saludos...

liadsoft
02-06-2006, 05:13:02
Amigo, si, es exactamente a través de la función SendMenssage que puedes hacerlo, pero para ello creo que sería apropiado que conozcas de antemano el Ahndle del Botón y de la Caja de Texto a la que quieras escribir. Este handle es un identificador único que se le da a cada ventana en Windows y con el que se reconoce en todo el sistema.

Bueno, si ya tienes estos handles, son los que le pasas de primer parámetro al API SendMessage.

Creo que para enviar los carácteres a la caja de texto prodrías usar el mensage WM_CHAR, y para presionar el botón WM_LBUTTONDOWN, refierete al SDK del Delphi para ver cuales son los parámetros que debes pasar en estos mensages.

Cualquier duda, no me molesta que la envíes al privado.

Esau
02-06-2006, 16:01:26
Hola Amigos he encontrado unos hilos interesantes y los he tratado de recopilar.... lo que pretendo hacer es controlar una aplicacion desde otra aplicacion sin que intervenga el usuario...
algo interesante que estoy conociendo es el sistema de mensajes de Windows que hasta hace poco no le habia prestado la importancia del caso, pero de conocerlo se sabra muchas cosas que nos oculta el Windows a simple vista...
primer paso , encontre este pedazo de codigo en uno de los hilos de este foro y lo que hice fue tratar de entenderlo...

procedure TForm_Principal.PostKeyEx32(key: Word; const shift: TShiftState;
specialkey: Boolean);
{************************************************************
* Procedure PostKeyEx32
*
* Parameters:
* key : virtual keycode of the key to send. For printable
* keys this is simply the ANSI code (Ord(character)).
* shift : state of the modifier keys. This is a set, so you
* can set several of these keys (shift, control, alt,
* mouse buttons) in tandem. The TShiftState type is
* declared in the Classes Unit.
* specialkey: normally this should be False. Set it to True to
* specify a key on the numeric keypad, for example.
* Description:
* Uses keybd_event to manufacture a series of key events matching
* the passed parameters. The events go to the control with focus.
* Note that for characters key is always the upper-case version of
* the character. Sending without any modifier keys will result in
* a lower-case character, sending it with [ssShift] will result
* in an upper-case character!
*Created: 17.7.98 by P. Below
************************************************************}
Type
TShiftKeyInfo = Record
shift: Byte;
vkey : Byte;
End;
byteset = Set of 0..7;
Const
shiftkeys: Array [1..3] of TShiftKeyInfo =
((shift: Ord(ssCtrl); vkey: VK_CONTROL ),
(shift: Ord(ssShift); vkey: VK_SHIFT ),
(shift: Ord(ssAlt); vkey: VK_MENU ));
Var
flag: DWORD;
bShift: ByteSet absolute shift;
i: Integer;
Begin
For i := 1 To 3 Do Begin
If shiftkeys[i].shift In bShift Then
keybd_event( shiftkeys[i].vkey, MapVirtualKey(shiftkeys[i].vkey, 0), 0, 0);
End; { For }

If specialkey Then
flag := KEYEVENTF_EXTENDEDKEY
Else
flag := 0;

keybd_event( key, MapvirtualKey( key, 0 ), flag, 0 );
flag := flag or KEYEVENTF_KEYUP;
keybd_event( key, MapvirtualKey( key, 0 ), flag, 0 );

For i := 3 DownTo 1 Do Begin
If shiftkeys[i].shift In bShift Then
keybd_event( shiftkeys[i].vkey, MapVirtualKey(shiftkeys[i].vkey, 0), KEYEVENTF_KEYUP, 0);
End; { For }
End; { PostKeyEx32 }

Con el procedimiento anterior enviamos todas las teclas que se desean simular y se aplican a la ventana activa...
primero tenemos que saber a que ventana queremos presionarle las teclas, este fragmento de codigo tambien lo obtuve de unos de los hilos de este codigo...

Var
manejador : THandle;
Begin
hwnd := FindWindow(Nil,'nombre de la ventana');
if hwnd = 0 then ShowMessage('No se encontro la Aplicacion')
else
begin
SetForegroundWindow(hwnd);
PostKeyEx32(VK_TAB, [], False);
// simulamos la presión de la tecla TAB
PostKeyEx32(VK_RETURN, [], False);
// simulamos la presión de la tecla Enter
PostKeyEx32(Ord('A'), [], False);
// simulamos la presión de la tecla A
PostKeyEx32(VK_HOME, [], True);
// simulamos la presion de la tecla de función Inicio o Home
// si deseamos podemos pasar tambien la presion de la tecla Control esto seria en el segundo parametro entre los []
End
End;

de esta forma podemos navegar entre los controles de otra aplicacion como si el usuario lo estuviera haciendo.
Todo el Codigo lo he entrado buscando entre los hilos de este foro , lo que estoy haciendo es agruparlo....
¿que seria de nosotros sin el clubdelphi?