Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 04-03-2005
esocrates esocrates is offline
Miembro
 
Registrado: may 2003
Ubicación: Argentina
Posts: 210
Poder: 22
esocrates Va por buen camino
Cerrador de programas.Truco 464 de Trucomanía

Estoy intentando adjuntar a una aplicación una función que permita cerrar todos las ventanas de los programas abiertos en ese momento.
Encontré la explicación y procedimientos en el truco 464 de Trucomanía; pero no funciona.
Al ejecutar los botones no sucede nada.
Les agradecería me ayuden con este código o me sugieran otro modo de hacerlo.
El código del truco 464 es este:
Código Delphi [-]
unit Unit1;
 
interface 
 
uses 
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  TlHelp32, StdCtrls;
 
type 
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
    ProgramasAntes    : TStringList;
    procedure GuardaInstante(const Lista:TStringList);
    procedure MataLosQueSobran(const Antes:TStringList);
  public
    { Public declarations }
  end; 
 
var 
  Form1: TForm1;
 
implementation 
 
{$R *.DFM}
 
procedure TForm1.GuardaInstante(const Lista:TStringList);
 
    function SacaExe(MangoW:HWND):string;
    {Obtiene el EXE de una tarea}
    {get EXE of a task}
    var 
      Datos    :TProcessEntry32;
      hID       : DWord;
      Snap    : Integer;
    begin 
      GetWindowThreadProcessId(MangoW,@hID);
      Snap:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
      try
        Datos.dwSize:=SizeOf(Datos);
        if(Process32First(Snap,Datos))then
        begin 
          repeat 
            if Datos.th32ProcessID=hID then 
            begin 
              Result:=UpperCase(StrPas(Datos.szExeFile));
              Break;
            end; 
          until not(Process32Next(Snap,Datos));
        end; 
      finally
        Windows.CloseHandle(Snap);
      end; 
    end; 
 
 
   function ObtieneVentanas(Mango: HWND;
            Nada: Pointer): Boolean; stdcall;
   var 
      sTemp:string;
   begin 
     Result := True;
     {Mango es el handle de la tarea encontrada}
     {Añadimos el .EXE si no está ya añadido...}
     sTemp:=SacaExe(Mango);
      with TStringList(Nada) do 
        if IndexOf(sTemp) = - 1 then Add(sTemp);
   end; 
 
begin 
  Lista.Clear;
  EnumWindows( @ObtieneVentanas, Integer(Lista) );
end; 
 
procedure TForm1.MataLosQueSobran(const Antes:TStringList);
var 
   i                : integer;
   ProgramasDespues : TStringList;
 
  procedure KillTask(FileName:String);
  var 
      ContinueLoop:BOOL;
      FSnapshotHandle:THandle;
      FProcessEntry32:TProcessEntry32;
  const 
      PROCESS_TERMINATE=$0001;
  begin 
      FSnapshotHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
      FProcessEntry32.dwSize:=Sizeof(FProcessEntry32);
      ContinueLoop:=Process32First(FSnapshotHandle,FProcessEntry32);
      while integer(ContinueLoop)<>0 do 
      begin 
          if FProcessEntry32.szExeFile=FileName then 
            TerminateProcess( OpenProcess(PROCESS_TERMINATE,BOOL(0),
                              FProcessEntry32.th32ProcessID),0);
            ContinueLoop:=Process32Next(FSnapshotHandle,FProcessEntry32);
      end; 
      CloseHandle(FSnapshotHandle);
  end; 
 
begin 
  ProgramasDespues:=TStringList.Create;
  try
    GuardaInstante(ProgramasDespues);
    for i:=0 to ProgramasDespues.Count-1 do 
      if Antes.IndexOf( ProgramasDespues[i] ) = -1 then 
        KillTask( ProgramasDespues[i] );
  finally
    ProgramasDespues.Free;
  end; 
end; 
 
procedure TForm1.FormCreate(Sender: TObject);
begin 
  ProgramasAntes:=TStringList.Create;
end; 
 
procedure TForm1.FormDestroy(Sender: TObject);
begin 
  ProgramasAntes.Free;
end; 
 
procedure TForm1.Button1Click(Sender: TObject);
begin 
  GuardaInstante(ProgramasAntes);
end; 
 
 
procedure TForm1.Button2Click(Sender: TObject);
begin 
  MataLosQueSobran(ProgramasAntes);
end; 
 
end.

Utilizo Delphi 6 Enterprise en Windows 98 SE

Un saludo y hasta pronto

Última edición por esocrates fecha: 04-03-2005 a las 16:22:37.
Responder Con Cita
  #2  
Antiguo 05-03-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
El programa EndItAll está realizado en delphi, y se encuentra con los fuentes disponibles.

Buscalo en google, creo recordar que hay 2 versiones, una free con fuentes y otra mas nueva shareware y sin fuentes.

Yo lo uso y es buenísimo. Saludos
Responder Con Cita
  #3  
Antiguo 05-03-2005
esocrates esocrates is offline
Miembro
 
Registrado: may 2003
Ubicación: Argentina
Posts: 210
Poder: 22
esocrates Va por buen camino
Muchas gracias Lepe. Ya me pongo a estudiar el código fuente del EndITAll.
Por si a alguien más le interesa dejo el link para la descarga del programa y el código fuente.

http://www.docsdownloads.com/Tier1/enditall.htm

Un saludo y hasta pronto
Responder Con Cita
  #4  
Antiguo 07-03-2005
esocrates esocrates is offline
Miembro
 
Registrado: may 2003
Ubicación: Argentina
Posts: 210
Poder: 22
esocrates Va por buen camino
Cerrar todas las ventanas abiertas del escritorio

No consigo hacerlo.
Si pueden ayudarme...
He encontrado un hilo sobre minimizar todas las ventanas
http://www.clubdelphi.com/foros/show...ultar+ventanas
pero lo que yo quiero es Cerrar todas las ventanas.
Un saludo y gracias
Responder Con Cita
  #5  
Antiguo 08-03-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
¿pero cual es el problema? ¿que deseas hacer exactamente?

EnditAll cierra todos los procesos activos excepto aquellos que son críticos para el sistema o aquellos que tu protejas manualmente.

No veo la razon de modificar ese programa.

Saludos
Responder Con Cita
  #6  
Antiguo 08-03-2005
esocrates esocrates is offline
Miembro
 
Registrado: may 2003
Ubicación: Argentina
Posts: 210
Poder: 22
esocrates Va por buen camino
Hola Lepe, Creo que ahora tengo más claro cómo plantear el problema.
Quiero que al ejecutar un evento click se cierren todos los programas que han sido abiertos por el usuario y figuran, por ende, en la barra de tareas.
Un ejemplo de esto es el programa Tray commander v2.2 (hecho con Delphi), que tiene un comando "close all taskbar windows" que cierra todas las ventanas abiertas.
Lo que me parece interesante es que de este modo se impiden los riesgos que tiene el EndItAll para usuarios inexpertos [la posibilidad de matar programas abiertos en el inicio de Windows que hacen al funcionamiento del sistema.
Espero haber sido más claro ahora.
Un saludo y gracias por tus respuestas

Última edición por esocrates fecha: 08-03-2005 a las 15:43:37.
Responder Con Cita
  #7  
Antiguo 09-03-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
El problema que le veo, es que hoy en dia está muy de moda que todos los programas se escondan junto al reloj, por tanto, es dificil saber cuales ha iniciado el usuario y cuales el sistema.

Quizás haya una técnica para diferenciarlos (sabiendo el padre de ese proceso ??)

Otra forma sería ver los programas que hay en:
- el registro de windows
- el menu inicio --> programas -->inicio del usuario activo
- Lista de programas conocidos (Taskmanager, svchost, lsass....)

y protegerlos automaticamente. (tarea complicada)

La opción que más facil es indicar al usuario que cierre todos los programas, se guarda una copia de la lista de procesos actual, y a partir de ahora ya se sabe cual no se debe cerrar.

Una Opción elegante sería la creación de perfiles, es decir, guardar la lista de procesos a proteger bajo un nombre, de tal forma que al elegir un perfil, se cierren todos los programas que no esten en ese perfil.

Espero te sirva de algo.
Responder Con Cita
  #8  
Antiguo 09-03-2005
esocrates esocrates is offline
Miembro
 
Registrado: may 2003
Ubicación: Argentina
Posts: 210
Poder: 22
esocrates Va por buen camino
Cita:
Empezado por Lepe
El problema que le veo, es que hoy en dia está muy de moda que todos los programas se escondan junto al reloj, por tanto, es dificil saber cuales ha iniciado el usuario y cuales el sistema.
Esa es mi idea. Los programas junto al reloj no los cierro. Sólo cierro los que están en la TaskBar. De ese modo me aseguro que se cierran sólo aquellos que han sido abiertos por el usuario en esa sesión.
El tema es que no me sale una rutina que:
1-Liste todos los programas que el usuario abrió [y sólo esos];
2-los cierre.
Un saludo y gracias por la ayuda
Responder Con Cita
  #9  
Antiguo 10-03-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Pero si la mayoria de programas tienen la opción de guardarse en el area de notificación, emule, flashget, getright, y un largo sin fin.

Si no cierras esos, no estas descargando el sistema. Un usuario normal, ¿ cuantas ventanas distintas puede llegar a tener abiertas? yo diría que 4 o 5, a menos que use internet explorer, en ese caso puede tener abiertas 40 .

Si un usuario da un doble clic en el explorador de windows y abre un programa, el padre de ese proceso es el explorer, diría que es imposible distinguirlo, a menos que uses una de las técnicas anteriormente comentadas .

Saludos
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 06:45:18.


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
Copyright 1996-2007 Club Delphi