Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Acceder al menú de una aplicación externa (https://www.clubdelphi.com/foros/showthread.php?t=60056)

vejerf 18-09-2008 11:00:08

Acceder al menú de una aplicación externa
 
Hola a todos,
Desde hace ya algún tiempo intento acceder al menú de una aplicación externa desde la mía (Google Earth en este caso). Si habeis leído algunos de mis post habreis comprobado que llevo ya algún tiempo intentando esto bien con mensajes (SendMessage) que no he logrado manejar o bien con otros intentos. Lo último que se me ha ocurrido, pero que no sé si se puede hacer es intentar acceder al menú de otra aplicación desde la mía. Si es posible me gustaría que me dijéseis como hacerlo y si no es demasiada molestia algún ejemplo.

Muchas gracias por vuestra ayuda!!!

vejerf 18-09-2008 16:02:15

Investigando un poco sobre el asunto he dado con un ejemplo que soluciona esto enviando un mensaje WM_COMMAND al notepad en este caso y funciona. El ejemplo necesita de tan solo un botón cuyo evento debe ser:
Código Delphi [-]
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;
Con este ejemplo se abre el notepad y se simula un click en el item Abrir del menú Archivo.
El ejemplo lo he encontrado aquí.
La cosa es q he intentado lo mismo con el Google Earth y no he podido... si alguien se atreve que me comente el resultado por favor.
Salu2...

cHackAll 18-09-2008 20:29:05

vejeref; no por abrir 50 hilos va a haber mayor atencion en tu problema, por favor ya no lo hagas que no es correcto. Se muy bien que es algo frustrante no conseguir los resultados esperados pero debes tener paciencia, si nadie te contesta puedes "revivir" el hilo que comenzaste.

Lamento no haberte dado más soluciones pero recien en un post anterior me he podido percatar de mi problema de vista... habiendo tambien descargado el Google Earth podremos hablar el mismo idioma, aqui una idea;

Código Delphi [-]
uses Windows, Messages, ActiveX, ComObj;
 
var
 ge: OleVariant;
 hWnd: Integer;
 
begin
 CoInitialize(nil);
 ge := CreateOleObject('GoogleEarth.ApplicationGE');
 hWnd := ge.GetMainHwnd;
 
 keybd_event(VK_MENU, 0, 0, 0);
 keybd_event(VK_CONTROL, 0, 0, 0);
 Sleep(64); SendMessage(hWnd, WM_CHAR, Ord('B'), 0);
 keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);
 keybd_event(VK_MENU, 0, KEYEVENTF_KEYUP, 0);
end.

PD; a futuro incluye snapshots para ver lo que quieres hacer.

Saludos

vejerf 19-09-2008 12:32:10

Hola cHackAll,
Lo primero pedir disculpas por no haber cumplido estrictamente las normas del foro y lo segundo darte las gracias por tu ayuda. Parece que con el método que me propones sí es posible hacer lo que yo pretendía. Por ponerle algún pero, he tenido que modificar el tiempo del Sleep porque con ese tiempo parece que mi procesador no era capaz de reaccionar a tiempo y simplemente me escribía una 'B'. Supongo que con esto tengo solucionado el poder enviar teclas de control a la aplicación, pero si un item de un menú no tiene accesos rápidos asociados que se puede hacer.
Ahí dejo la pregunta por si alguien encuentra alguna solución. Yo mientras tanto voy a usar la solución de cHackAll y seguiré investigando a ver que encuentro.
De nuevo muchas gracias a todos!!!

PD: a futuro incluiré un snapshot... pero antes tendré que averiguar que es :s... por el contexto creo que puede ser una captura de pantalla, pero no estoy seguro...

vejerf 29-09-2008 16:38:05

Un problemilla más...
 
Hola,
Ahora tengo un problema de funcionamiento con el Google Earth. Mi aplicación digamos que es un sistema de posicionamiento en el que uso el Google Earth como cartografía. Entonces voy poniendo "puntitos" allí donde me indiquen. La cosa es que actualizo la posición de ese "puntito" recargando un fichero. Para recargar este fichero uso una combinación de teclas "Ctrl+R", entonces cada vez que recibo una nueva posición, modifico ese fichero, lo cargo en el Google Earth por medio de una función del API de GE y, por último, envío la secuencia "Ctrl+R" como se explican en los mensajes anteriores. Pues bien, esto me funciona perfectamente en un portatil, sin embargo, en otro portátil no me funciona. Es como si ahí no reconociera el comando "Ctrl+R" que se le envía. Sin embargo si pincho en el item "Actualizar" del menú "Editar" de Google Earth se actualiza bien el fichero. ¿Alguna idea de por qué puede esto funcionar en unos sitios y en otros no?
Gracias...

cHackAll 29-09-2008 20:20:32

Cita:

Empezado por vejerf (Mensaje 317009)
¿Alguna idea de por qué puede esto funcionar en unos sitios y en otros no?

Bueno, si estas utilizando la funcion que te di, muy probablemente el tiempo de de "repozo" no sea suficiente en algunas PCs, talvez una alternativa sea utilizar F5 (por ejemplo) que muy probablemente refresque tambien la informacion sin la necesidad de intervencion de dicha API.

Por ahora solo puedo decir eso, aunque revisare en unas horas que puede estar pasando :cool:

Saludos

vejerf 01-10-2008 15:36:20

Hola de nuevo cHackAll,
ya conseguí hacerlo funcionar en el otro portatil. No sé exactamente el por qué del fallo, pero creo q era porque no obtenía el handle correcto de la ventana. La cosa es q ahora me funciona.
De todas formas, si sabes alguna manera de acceder al menú de google earth, pero sin usar las teclas de acceso rápido me gustaría me lo comentases.
De todas formas un millón de gracias...


La franja horaria es GMT +2. Ahora son las 04:58: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