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)
-   -   ¿Cómo cambiar el caption de otra aplicación? (https://www.clubdelphi.com/foros/showthread.php?t=84044)

mordaz 02-09-2013 13:37:25

¿Cómo cambiar el caption de otra aplicación?
 
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

Cita:

Empezado por mordaz (Mensaje 466311)
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.

Código Delphi [-]
Form1.Caption:=paramstr(1);

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

Código Delphi [-]
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:
Código Delphi [-]
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:
Código Delphi [-]
...
  SetWindowTitle('Calculadora', 'Nuevo título'); // (Calculadora de windows)
...

mordaz 02-09-2013 20:41:54

Cita:

Empezado por look (Mensaje 466315)
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

Cita:

Empezado por ElDioni (Mensaje 466323)
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.

Código Delphi [-]
Form1.Caption:=paramstr(1);

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

Código Delphi [-]
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

Cita:

Empezado por ecfisa (Mensaje 466328)
Hola.

Y si se trata de otra aplicación que también está ejecutándose en ese momento:
Código Delphi [-]
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:
Código Delphi [-]
...
  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:
Código Delphi [-]
...
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:
Código Delphi [-]
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.

Código Delphi [-]
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);
}


La franja horaria es GMT +2. Ahora son las 02:41:16.

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