Ver Mensaje Individual
  #3  
Antiguo 02-06-2006
Esau Esau is offline
Miembro
 
Registrado: may 2003
Ubicación: Canto Rey
Posts: 140
Reputación: 22
Esau Va por buen camino
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...
Código Delphi [-]
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...
Código Delphi [-]
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?
Responder Con Cita