PDA

Ver la Versión Completa : Enviar caracteres o pulsaciones de teclas a otra aplicación no Delphi


Faust
28-04-2006, 10:16:52
:D 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 :confused: 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.

Bicho
28-04-2006, 11:08:37
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



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:


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

Faust
28-04-2006, 15:03:08
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?

JuanPa1
30-06-2006, 20:46:02
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.

digit01
13-07-2006, 08:27:02
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.

ospaco69
30-01-2008, 19:34:09
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 :D, en lo posible en delphi

egostar
30-01-2008, 19:54:12
Yo tambien, quiero un programa que me haga ganar mas dinero :D, en lo posible en delphi

Hola ospaco69, me pregunto si estas dispuesto a pagar a quien te lo mande...:rolleyes::rolleyes::rolleyes: así sería negocio para ambos o no :confused:

Te recomiendo que leas nuestra guía de estilo (http://www.clubdelphi.com/foros/guiaestilo.php)

Salud OS

brandolin
31-10-2008, 22:13:09
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

madmai
28-12-2021, 00:49:35
:D 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 :confused: 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.

Casimiro Notevi
28-12-2021, 11:43:43
Te recomiendo que crees un hilo nuevo sobre el tema, pues no tiene nada que ver con delphi+windows.
Saludos.