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 Faust
Faust Faust is offline
Miembro
 
Registrado: abr 2006
Ubicación: México D.F.
Posts: 930
Poder: 19
Faust Va por buen camino
Red face Enviar caracteres o pulsaciones de teclas a otra aplicación no Delphi

Saludos camaradas, es mi primera vez en los foros de club delphi muchos hilos me han parecido interesantes y de utilidad mientras practicaba Delphi 5 Enterprise, pero ahora que trabajo en un proyecto más serio me encuentro con una dificultad, debo realizar una aplicación que ejecute otras aplicaciones, lo que debo hacer es lo siguiente: ejecutar la otra aplicación y una vez ejecutada esta segunda aplicación desplegar y ejecutar uno de sus menús abriendo una ventana e introducir algunos datos en algunas cajas de texto, vi un ejemplo pero en VB que utilizaba un procedimiento que creo que se llama "SendKeys" que enviaba una pulsación a la otra aplicación, p. ej. para abrir el menú enviaba SendKeys pasando como parámetro la tecla o un número que representaba la pulsación de la tecla "Alt + C" abriendo una ventana, y despues mediante varias llamadas a SendKeys iba introduciendo texto a algunas cajas de texto en la otra aplicación, busqué en la ayuda de Delphi y en la ayuda de Windows SDK sobre alguna función similar pero no la encontré, lo que se me ocurrió fue enviar mensajes a la otra aplicación y a sus controles, pero para eso necesito el handle de la aplicación y de sus controles lo que no sé como hacerlo espero poder encontrar respuestas, pues si esto se puede hacer con VB también debe poder hacerse con Delphi, actualmente desarrollo en Delphi 7 y la aplicación que debo hacer se ejecutará en WinXP.

De antemano muchas gracias por su ayuda y los felicito por hacer este espacio tan agradable y útil para muchos que como yo estamos avanzando en el emocionante camino de Delphi.
__________________
Herr Heins Faust
Responder Con Cita
  #2  
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
  #3  
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
  #4  
Antiguo 30-06-2006
JuanPa1 JuanPa1 is offline
Miembro
 
Registrado: may 2006
Posts: 66
Poder: 18
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
  #5  
Antiguo 13-07-2006
digit01 digit01 is offline
Registrado
 
Registrado: jul 2006
Posts: 1
Poder: 0
digit01 Va por buen camino
Hola escribanme a sandy@informatica.unica.cu

Hola soy estudiante de Informática en una universidad cubana, quisiera que me ayudaran y me mandaran un codigo para poder enviar un mensage remoto usando una direccion de correo.
Responder Con Cita
  #6  
Antiguo 30-01-2008
ospaco69 ospaco69 is offline
Registrado
 
Registrado: ago 2005
Posts: 5
Poder: 0
ospaco69 Va por buen camino
Yo tambien quiero

Cita:
Empezado por digit01 Ver Mensaje
Hola soy estudiante de Informática en una universidad cubana, quisiera que me ayudaran y me mandaran un codigo para poder enviar un mensage remoto usando una direccion de correo.
Yo tambien, quiero un programa que me haga ganar mas dinero , en lo posible en delphi
Responder Con Cita
  #7  
Antiguo 30-01-2008
[egostar] egostar is offline
Registrado
 
Registrado: feb 2006
Posts: 6.556
Poder: 25
egostar Va camino a la fama
Cita:
Empezado por ospaco69 Ver Mensaje
Yo tambien, quiero un programa que me haga ganar mas dinero , en lo posible en delphi
Hola ospaco69, me pregunto si estas dispuesto a pagar a quien te lo mande... así sería negocio para ambos o no

Te recomiendo que leas nuestra guía de estilo

Salud OS
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney
Responder Con Cita
  #8  
Antiguo 31-10-2008
brandolin brandolin is offline
Miembro
 
Registrado: jul 2003
Ubicación: Mendoza
Posts: 324
Poder: 21
brandolin Va por buen camino
Hola a todos, estoy probando este codigo y no se envia al teclado el caracter '+' no se si otro caracter tiene problemas pero este es el que estoy probando.
Alguien sabe porque ?

Gracias
Responder Con Cita
  #9  
Antiguo 28-12-2021
madmai madmai is offline
Miembro
 
Registrado: oct 2005
Posts: 117
Poder: 19
madmai Va por buen camino
Cita:
Empezado por Faust Ver Mensaje
Saludos camaradas, es mi primera vez en los foros de club delphi muchos hilos me han parecido interesantes y de utilidad mientras practicaba Delphi 5 Enterprise, pero ahora que trabajo en un proyecto más serio me encuentro con una dificultad, debo realizar una aplicación que ejecute otras aplicaciones, lo que debo hacer es lo siguiente: ejecutar la otra aplicación y una vez ejecutada esta segunda aplicación desplegar y ejecutar uno de sus menús abriendo una ventana e introducir algunos datos en algunas cajas de texto, vi un ejemplo pero en VB que utilizaba un procedimiento que creo que se llama "SendKeys" que enviaba una pulsación a la otra aplicación, p. ej. para abrir el menú enviaba SendKeys pasando como parámetro la tecla o un número que representaba la pulsación de la tecla "Alt + C" abriendo una ventana, y despues mediante varias llamadas a SendKeys iba introduciendo texto a algunas cajas de texto en la otra aplicación, busqué en la ayuda de Delphi y en la ayuda de Windows SDK sobre alguna función similar pero no la encontré, lo que se me ocurrió fue enviar mensajes a la otra aplicación y a sus controles, pero para eso necesito el handle de la aplicación y de sus controles lo que no sé como hacerlo espero poder encontrar respuestas, pues si esto se puede hacer con VB también debe poder hacerse con Delphi, actualmente desarrollo en Delphi 7 y la aplicación que debo hacer se ejecutará en WinXP.

De antemano muchas gracias por su ayuda y los felicito por hacer este espacio tan agradable y útil para muchos que como yo estamos avanzando en el emocionante camino de Delphi.

Hola buenas, veo que hay solucion en este hilo, mi pregunta es la siguiente, se puede enviar pulsación de tecla a otra aplicacion en linux con lazarus-ide? alguna sugerencia/respuesta? gracias de antemano.
Responder Con Cita
  #10  
Antiguo 28-12-2021
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Te recomiendo que crees un hilo nuevo sobre el tema, pues no tiene nada que ver con delphi+windows.
Saludos.
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 21:56:41.


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