Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > API de Windows
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 28-04-2006
Avatar de Bicho
[Bicho] Bicho is offline
Miembro Premium
 
Registrado: jul 2003
Ubicación: Inca - Mallorca
Posts: 1.776
Poder: 22
Bicho Va por buen camino
Hola Faust, bienvenido al foro antetodo.

Pues mira, yo ahora mismo estoy con ese tema en mi empresa. Tenemos una aplicacion que hemos desarrollado en Delphi que tiene que distribuirse a diversas oficianas por toda España y esta aplicación debe poder interactuar con otra aplicación que tienen estas oficinas y que no es nuestra, de manera que ejecuta pulsaciones de tecla y copia el texto en esa ventana y lo pega en un memo de la nuestra.

Buscando encontramos esto: con esto puedes enviar pulsaciones de tecla a otra aplicacion

Código Delphi [-]

Procedure Tform1.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 }

Para averiguar el Handle simplemente necesitas el título del form de la aplicación sobre la que deseas interactuar, exactamente igual (respetando mayusculas y minusculas)

Ejemplo de llamada:

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);

Espero te sirva.

Saludos
Responder Con Cita
  #2  
Antiguo 28-04-2006
Avatar de Faust
Faust Faust is offline
Miembro
 
Registrado: abr 2006
Ubicación: México D.F.
Posts: 930
Poder: 19
Faust Va por buen camino
Gracias bicho ya estoy probando tu solución, pero si se tratase de varias ejecuciones del mismo programa, varias ventanas tendrán el mismo nombre, y para interactuar con cada una de ellas de manera independiente como se obtiene el handle?
__________________
Herr Heins Faust
Responder Con Cita
  #3  
Antiguo 30-06-2006
JuanPa1 JuanPa1 is offline
Miembro
 
Registrado: may 2006
Posts: 66
Poder: 19
JuanPa1 Va por buen camino
Teclado Virtual

Hola, pero como le deberia hacer si yo lo que quiero es desarrollar un teclado virtual, de tal manera que yo de click en este teclado y otra aplicacion me reciba lo que yo escribo.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Pasar texto de una aplicacion delphi a otra OmarPerez API de Windows 4 13-07-2005 20:56:19
Obtenert el handler de la ventana donde se han de enviar las pulsaciones del teclado ASAPLTDA API de Windows 0 07-04-2005 23:38:56
Hooks teclas de otra aplicacion OmarPerez API de Windows 2 15-10-2004 17:14:48
Enviar Teclas a una aplicacion JulioCesarPauli API de Windows 2 20-10-2003 19:28:30
Enviar teclas a aplicacion externa El_Lu Varios 2 24-08-2003 02:59:20


La franja horaria es GMT +2. Ahora son las 16:54:38.


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