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
ProgramasAntes : TStringList;
procedure GuardaInstante(const Lista:TStringList);
procedure MataLosQueSobran(const Antes:TStringList);
public
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.GuardaInstante(const Lista:TStringList);
function SacaExe(MangoW:HWND):string;
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;
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