PDA

Ver la Versión Completa : ¿Cómo cambiar el caption de otra aplicación?


mordaz
02-09-2013, 13:37:25
Buenos dias,

Existe alguna manera de cambiar el caption de un Form de una aplicación externa, con su Handle, necesito cambiar el caption del Form, no la información de la aplicación que aparece en la barra de tareas.

Por su ayuda muchas gracias.

look
02-09-2013, 16:53:52
Buenos dias,

Existe alguna manera de cambiar el caption de un Form de una aplicación externa, con su Handle, necesito cambiar el caption del Form, no la información de la aplicación que aparece en la barra de tareas.

Por su ayuda muchas gracias.

podrias utilizar un editor de recursos para modificar el exe.

ElDioni
02-09-2013, 18:10:56
Si la aplicación a la que quieres cambiarle el caption también la has hecho tú, podrías añadirle en el código del FormCreate del formulario principal el siguiente código.


Form1.Caption:=paramstr(1);


y en la aplicación que la manda ejecutar pones esto:


WinExec(PChar('C:\OtraAplicacion.exe aire, SW_SHOWNORMAL);


Te lo estoy diciendo de cabeza pero creo que era algo así.

Saludos.

ecfisa
02-09-2013, 19:02:02
Hola.

Y si se trata de otra aplicación que también está ejecutándose en ese momento:

procedure SetWindowTitle(const AppTitle, NewTitle: string);
var
H : THandle;
begin
H := FindWindow(nil, PChar(AppTitle));
if H <> 0 then
SetWindowText(H, PChar(NewTitle));
end;


Ejemplo de uso:

...
SetWindowTitle('Calculadora', 'Nuevo título'); // (Calculadora de windows)
...

mordaz
02-09-2013, 20:41:54
podrias utilizar un editor de recursos para modificar el exe.

Ya intente con un editor de recursos, pero al parecer la aplicación esta comprimida. Si tienes experiencia y me puedes ayudar conoces de alguna aplicación con el que puedas descomprimir un exe? (aclarando que no es que este comprimida con winzip, winrar, etc.)

Te agradezco por responder, saludos..

mordaz
02-09-2013, 20:44:21
Si la aplicación a la que quieres cambiarle el caption también la has hecho tú, podrías añadirle en el código del FormCreate del formulario principal el siguiente código.


Form1.Caption:=paramstr(1);


y en la aplicación que la manda ejecutar pones esto:


WinExec(PChar('C:\OtraAplicacion.exe aire, SW_SHOWNORMAL);


Te lo estoy diciendo de cabeza pero creo que era algo así.

Saludos.

Desafortunadamente la aplicación no es mía, solo quiero cambiar el caption, pero tu solucion es muy buena, sería como enviarle el parámetro.

Te agradezco por responder.
Saludos

mordaz
02-09-2013, 21:12:04
Hola.

Y si se trata de otra aplicación que también está ejecutándose en ese momento:

procedure SetWindowTitle(const AppTitle, NewTitle: string);
var
H : THandle;
begin
H := FindWindow(nil, PChar(AppTitle));
if H <> 0 then
SetWindowText(H, PChar(NewTitle));
end;


Ejemplo de uso:

...
SetWindowTitle('Calculadora', 'Nuevo título'); // (Calculadora de windows)
...


Efectivamente este código funciona muy bien con la calculadora y bloc de notas de Windows, cambia tanto el Titulo de la ventana como el caption de la aplicación en la barra de tareas. Desafortunadamente para mi no ha sido así con mi aplicación, solo cambio el caption de la barra de tareas pero no logro cambiar el caption de la ventana.

Por tu respuesta muchas gracias, casi lo logro.

Existe alguna forma de acceder a los elementos como Labels o Caption de una ventana de una aplicación en ejecución y cambiarlos?

mordaz
02-09-2013, 22:00:33
Creo que ya encontré el problema, al tratar de hacer un SetWindowPos(), me he percatado que detrás aparece otra ventana, me imagino que es la ventana principal de esa aplicación, por eso no cambia el caption de la ventana, ahora el problema es como puedo tomar el Handle de la ventana que es visible y no de la ventana principal, lo intente con FindWindowEx() pero no estoy seguro de estar haciendo lo correcto puesto que no pude obtener su Handle.

Alguna sugerencia?

ecfisa
03-09-2013, 02:02:02
Hola mordaz.

El código del mensaje #4, cambiará sin ningún problema cualquier título de ventana de una aplicación tipo SDI. Siempre claro, que la aplicación se esté ejecutando y que la ventana que deseas cambiar el título tenga su propiedad visible en verdadero.

Pero podría suceder que la aplicación de tercero que mencionas sea MDI, en ese caso el código tiene que cambiar un poco:

...
implementation

{$WARNINGS OFF}

procedure SetWindowTitleMDI(const MainTitle, ChildTitle, NewTitle: string);
var
hMain, hMDI, hChild : THandle;
begin
hMain := FindWindow(nil, PChar(MainTitle));
if hMain <> 0 then
begin
hMDI := FindWindowEx(hMain, 0, 'MDIClient', 0);
if hMDI <> 0 then
begin
hChild := FindWindowEx(hMDI, 0, 0, PChar(ChildTitle));
if hChild <> 0 then
SetWindowText(hChild, PChar(NewTitle));
end;
end;
end;


Ejemplo de llamada:

procedure TForm1.btnChangeMDIClick(Sender: TObject);
begin
SetWindowTitleMDI('MDIForm', // titulo del MDIForm (main)
'MDIChild1', // título del MDIChild (buscado)
'OTRO_TITULO'); // nuevo título
end;


Saludos :)

mordaz
03-09-2013, 10:50:20
Hola ecfisa,

Gracias por tu ayuda, siguiendo el código que amablemente me proporcionaste como ejemplo, no pude tomar el Handle de FindWindowEx(hMain, 0, 'MDIClient', 0) así que investigando un poco mas la aplicación en ejecución con WinSight32, encontré que efectivamente había 2 procesos que se desprendían del mismo .exe, también encontré que la class del proceso que no podía tomar su Handle era simplemente "TMainForm" asi que con tu ejemplo del 'MDIClient' busque esta vez 'TMainForm' y pude tomar el handle del proceso directamente con FindWindow.

Aquí esta el código de como lo resolví en C++ Builder.


HWND hMain,hAplication;

//Esta ventana no estaba visible pero ponia la aplicacion en la barra de tareas
//Tomando handle de la aplicacion
hAplication=FindWindow(0,"Etiqueta original de la aplicacion");
if (hAplication){
SetWindowText(hAplication, "Nueva etiqueta");
}

//Esta ventana si estaba visible
//Tomando handle de la ventana principal
hMain=FindWindow("TMainForm",0);
if (hMain){
SetWindowText(hMain, "Nueva etiqueta - Caption de Ventana");
SetWindowPos(hMain,HWND_TOPMOST,100,450,vgi_width-200,vgi_height-450,SWP_SHOWWINDOW);
}