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)
-   -   Cerrar esta ventana... (https://www.clubdelphi.com/foros/showthread.php?t=63961)

Faust 10-03-2009 22:52:49

Cerrar esta ventana...
 
En algún lado... la verdad no me acuerdo donde vi esto:

Código Delphi [-]
  Windows.SetParent(FindWindow(nil, 'Mi PC'), Self.Handle);

Y así meto la ventana de Mi PC dentro de mi formulario, algo un poco curioso para mi, pero mi duda es... como cerrar la ventana de Mi PC cuando se encuentra dentro de mi formulario? Esto lo pregunto porque cuando cierro mi aplicación y no he cerrado la ventana de Mi PC me da un error en el Explorer.exe

Desde ya muchas gracias amigos. ;)

Black_Ocean 11-03-2009 01:47:44

Hola,

No se por que lo encuentra tan curioso aquel código, ya que lo que hace es sólo asignarle un padre a la ventana de Mi PC que está actualmente abierta mediante el handle de ella, que en este caso el padre será la ventana del formulario. Además sólo servirá para una ventana que tenga como caption "Mi PC". Si otro programa tiene el mismo texto incluirá esa ventana, por eso usted debe asignarle aparte del texto de la ventana, el nombre de la clase de la ventana, pero aún así, sólo servirá para el lenguaje en español de Windows y no para otros idiomas del SO. También, sólo funcionará para la ventana del explorador de archivos que tenga ese texto y que esté actualmente abierta. Usted si desea incluir ventanas del explorador de archivos, debería crearla mediante las APIS de Windows y nombre de la clase de estas ventanas en tiempo de ejecución.

Pero bueno... aquí le propongo el siguiente ejemplo que le he hecho a la rápida en relación a lo que está arriba en su código, puede contener errores de ejecución, ya que es sólo un ejemplo, usted optimícelo y lea más en la ayuda acerca de estas funciones:

Código Delphi [-]
var
  WHandle: THandle;
  PnlContenedor: TPanel;

procedure IncluirWndHandle;
begin
  WHandle := FindWindow('CabinetWClass', 'Mi PC');
  if WHandle <> 0 then
  begin
    PnlContenedor := TPanel.Create(Form1);
    PnlContenedor.Parent := Form1;
    PnlContenedor.Align := alClient;
    Windows.SetParent(WHandle, PnlContenedor.Handle);
  end;
end;

procedure CerrarHandleWnd;
begin
  SendMessage(WHandle, WM_DESTROY, 0, 0);
  DestroyWindow(PnlContenedor.Handle);
end;

procedure TForm1.BtnCerrarHandleWndClick(Sender: TObject);
begin
  CerrarHandleWnd;
end;

procedure TForm1.BtnIncluirHandleWndClick(Sender: TObject);
begin
  IncluirWndHandle;
  BtnCerrarHandleWnd.BringToFront;
  BtnIncluirHandleWnd.BringToFront;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  CerrarHandleWnd;
end;


Cordiales saludos y espero que el ejemplo le sea de utilidad =)

Faust 11-03-2009 06:32:00

Cita:

Empezado por Black_Ocean (Mensaje 340920)
Hola,

No se por que lo encuentra tan curioso aquel código, ya que lo que hace es sólo asignarle un padre a la ventana de Mi PC que está actualmente abierta mediante el handle de ella, que en este caso el padre será la ventana del formulario. Además sólo servirá para una ventana que tenga como caption "Mi PC". Si otro programa tiene el mismo texto incluirá esa ventana, por eso usted debe asignarle aparte del texto de la ventana, el nombre de la clase de la ventana, pero aún así, sólo servirá para el lenguaje en español de Windows y no para otros idiomas del SO. También, sólo funcionará para la ventana del explorador de archivos que tenga ese texto y que esté actualmente abierta. Usted si desea incluir ventanas del explorador de archivos, debería crearla mediante las APIS de Windows y nombre de la clase de estas ventanas en tiempo de ejecución.

Pero bueno... aquí le propongo el siguiente ejemplo que le he hecho a la rápida en relación a lo que está arriba en su código, puede contener errores de ejecución, ya que es sólo un ejemplo, usted optimícelo y lea más en la ayuda acerca de estas funciones:

Código Delphi [-]var WHandle: THandle; PnlContenedor: TPanel; procedure IncluirWndHandle; begin WHandle := FindWindow('CabinetWClass', 'Mi PC'); if WHandle <> 0 then begin PnlContenedor := TPanel.Create(Form1); PnlContenedor.Parent := Form1; PnlContenedor.Align := alClient; Windows.SetParent(WHandle, PnlContenedor.Handle); end; end; procedure CerrarHandleWnd; begin SendMessage(WHandle, WM_DESTROY, 0, 0); DestroyWindow(PnlContenedor.Handle); end; procedure TForm1.BtnCerrarHandleWndClick(Sender: TObject); begin CerrarHandleWnd; end; procedure TForm1.BtnIncluirHandleWndClick(Sender: TObject); begin IncluirWndHandle; BtnCerrarHandleWnd.BringToFront; BtnIncluirHandleWnd.BringToFront; end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin CerrarHandleWnd; end;



Cordiales saludos y espero que el ejemplo le sea de utilidad =)

Me parece curioso porque aún no le veo ninguna utilidad... de hecho en algún truco de trucomanía muestra como minimizar algunos controles dentro de un formulario, cosa que también le veo poca utilidad. Lo que me da curiosidad es como matar esa ventana, una vez dentro de mi form, el handle a esta ventana pareciera inválido, pero le echaré un ojo a tu código y veré si aprendo algo de ahí. Gracias.

Ah y un favor... no me escribas de usted, es que me siento viejo :D :D :D, mejor escríbeme de tu (quisiera seguir sintiéndome joven :rolleyes:)

Saludos y gracias de nuevo.

escafandra 11-03-2009 11:53:25

Habiendo guardado el Handle de Mi PC antes de cambiar el parent, para cerrarla después:
Código Delphi [-]
SendMessage(hMIPC, WM_SYSCOMMAND, SC_CLOSE, 0);

Sin conocer el Handle previo tambien se puede hacer así:
Código Delphi [-]
SendMessage(FindWindowEx(Self.Handle, nil, nil, 'Mi PC'), WM_SYSCOMMAND, SC_CLOSE, 0);


Saludos.

Faust 11-03-2009 19:45:49

Cita:

Empezado por escafandra (Mensaje 340950)
Habiendo guardado el Handle de Mi PC antes de cambiar el parent, para cerrarla después:
Código Delphi [-]SendMessage(hMIPC, WM_SYSCOMMAND, SC_CLOSE, 0);


Sin conocer el Handle previo tambien se puede hacer así:
Código Delphi [-]SendMessage(FindWindowEx(Self.Handle, nil, nil, 'Mi PC'), WM_SYSCOMMAND, SC_CLOSE, 0);



Saludos.

Ya había probado así y no me funcionó, vuelvo a probar, quizás hice algo mal...

escafandra 11-03-2009 21:30:13

Corrijo un pequeño error:
Código Delphi [-]
SendMessage(FindWindowEx(Self.Handle, 0, nil, 'Mi PC'), WM_SYSCOMMAND, SC_CLOSE, 0);
Funciona seguro.:D

Saludos.

Faust 12-03-2009 01:15:07

Cita:

Empezado por escafandra (Mensaje 341043)
Corrijo un pequeño error:
Código Delphi [-]
SendMessage(FindWindowEx(Self.Handle, 0, nil, 'Mi PC'), WM_SYSCOMMAND, SC_CLOSE, 0);

Funciona seguro.:D

Saludos.

Eso ya lo veremos... :D :D :D

escafandra 12-03-2009 21:49:46

Cita:

Empezado por Faust (Mensaje 341091)
Eso ya lo veremos... :D :D :D

Dímelo tu. :rolleyes:

Saludos.

Faust 13-03-2009 00:09:49

Cita:

Empezado por escafandra (Mensaje 341284)
Dímelo tu. :rolleyes:

Saludos.

No... pus si...

Si funcionó, es que no estaba usando adecuadamente SendMessage

Gracias por quitarme esta duda que me causaba curiosidad. ;)


La franja horaria es GMT +2. Ahora son las 14:21:49.

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