Mandar teclas a mi app !

Necesito saber como puedo mandar teclas a una aplicación, se que se puede hacer teniendo en cuenta el titulo de la aplicación y como parámetros las teclas que le vas a mandar, lo que quiero hacer es, por ejemplo:
Mandarle al mediaplayer, Ctrol + Alt + C, o otras teclas y combinaciones de teclas.
2

2 respuestas

Respuesta
1
Para eso puede usar la llamada a la función SendMessage del Api de Windows. Tiene esta forma:
LRESULT SendMessage(
HWND hWnd, // handle of destination window
UINT Msg, // message to send
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);
Como parámetros Msg puede utilizar un código de mensaje que indique envío de teclas, como WM_CHAR. Busque en la ayuda del API de Windows que viene en Delphi concretamente qué parámetros utilizar para representar las teclas que desee enviar.
Eso sí, para utilizarla debe tener el handle de la ventana a la que quiere enviar las teclas. Para ello, puede utilizar la función FindWindow del API de Windows, que le proporciona el handle a partir del titulo de la ventana o de su clase.
Gracias por tu ayuda, pero la verdad amigo es que no doy con el, es que no soy un programador muy avanzado y he me haría falta si puedes, algún pequeño ejemplo de su uso, ¿podrías implementarme uno sencillo?, de mandarle al la ventana "nombre.txt - Bloc de notas" po ejemplo, las teclas Ctrol+G por ejemplo para que guarde.
Mil gracias de antemano.
Gracias por responder.
Disculpa que te vuelva a molestar, bastante me has ayudado, pero hay algo que no logro hacer y es mandar teclas pero no a que se escriban sino a hacer comandos, por ejemplo, Ctrol + G, o Shift + Alt + E, y teclas de ese tipo, que es en realidad lo que necesito, no se como mandarle esas combinaciones de teclas.
He perdido la tarde y no doy como hacerlo.
Mil gracias.
Un ejemplo rápido.
En un form de delphi, por un botón y en el evento onclick, el código que te adjunto.
Luego abre el bloc de notas, ejecuta tu aplicación delphi y pulsa el botón. Debería enviar teclas al bloc de notas poniendo "HOLA!".
Un detalle es que a veces no es suficiente con obtener el handle de la ventana principal de la aplicación a la que queremos mandar teclas. Como verá en el ejemplo, a veces es necesario buscar la ventana hija dentro de la principal a la que mandar las teclas. EN el caso de bloc de notas es "edit", ¿qué verás que localizo usando una llamada a FindWindowEx . Como saberlo? No siempre es fácil. Hay que buscar con el Winsight (una aplicación que viene con delphi) las ventanas hijas de la que nos interesa e ir probando...
Consulte la ayuda del SDK de Windows que viene con Delphi para más detalles de cada función. Eso sí, hágase a la idea que trabajar con el API de Windows es a veces bastante trabajoso, más que con Delphi puro.
Un saludo!
procedure TForm1.Button1Click(Sender: TObject);
var
wnd: HWND;
i: Integer;
s: string;
begin
wnd := FindWindow('notepad', nil);
if wnd <> 0 then
begin
wnd := FindWindowEx(wnd, 0, 'Edit', nil);
s := 'Hola!';
for i := 1 to Length(s) do
SendMessage(wnd, WM_CHAR, Word(s), 0);
// Simula Return
PostMessage(wnd, WM_KEYDOWN, VK_RETURN, 0);
// Simula espacio.
PostMessage(wnd, WM_KEYDOWN, VK_SPACE, 0);
end;
end;
A ver, para ejecutar comandos de una aplicación desde otra, lo mejor no es enviarle teclas, sino enviarle comandos.
Por ejemplo, pon esto en el onclick de un botón de un form:
procedure TForm1.Button1Click(Sender: TObject);
var
wnd: HWND;
begin
winexec('notepad',SW_SHOW);
wnd := FindWindow('notepad', nil);
PostMessage(wnd,WM_COMMAND, hiword(1)+2,0);
end;
Verás que abre el bloc de notas, y ejecuta el comando Abrir.
El mensaje de tipo WM_COMMAND es el que permite hacer esto. Consulta la ayuda del SDK de windows. Hay que enviarle como parámetros el nº de la opción de menú que queremos ejecutar (el 2 en el ejemplo), más alguna otra cosa, por ejemplo en este caso un hiword(1) para simular que es una pulsación de Alt+Comando.
Luego para saber qué nº tiene cada opción del menú, en principio están en orden, pero sino, probando...
Mil gracias amigo, ahora me tengo que ir urgente por 4 días, estaré ausente, cualquier otra cosa te aviso, aunque creo que con esto resolveré.
Gracias.
Respuesta
1
Lo que preguntas tiene que ver con el paso de mensajes entre aplicaciones, y creo que lo que hay aquí te servirá.
http://www.latiumsoftware.com/es/pascal/0037.php

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas