PDA

View Full Version : Delphi Fast Close


V Ronin
09-08-2007, 22:37
Sono sempre il solito nubbio, avrei bisogno di una mano, vorrei saxe se esiste 1 comando che interrompe 1 processo di window, insomma 1 programma per chiudere i programmi (win xp). avrei bisogno di chiudere 1 lista abbastanza lunga di programmi nel minor tempo possibile e mi e' venuto in mente questo, si puo' fare?

ArTi
11-08-2007, 15:20
Conosci handle della finestra che vuoi chiudere?

Se la risposta è si... ti basta un PostMessage(handle, WM_SYSCOMMAND,SC_CLOSE,0); (http://msdn2.microsoft.com/en-us/library/ms644944.aspx)

Se la risposta è no... lo devi ricavare con FindWindow (http://msdn2.microsoft.com/en-us/library/ms633499.aspx)


Esempio 1: Vuoi chiudere una finestra del Bolcco Note e ricavi handle per mezzo del titolo (caption)...

FindWindow(nil , 'Senza nome - Blocco note');

program ChiudiFinestra1;

uses SysUtils, windows, Messages;

var
Finestra, Figlia: HWND;

begin
Figlia := 0;
Finestra := 0;
Finestra := FindWindow(nil , 'Senza nome - Blocco note');
if Finestra <> 0 then
begin
PostMessage(Finestra, WM_CLOSE,0,0);
Sleep(500);
Figlia := FindWindow(nil , 'Blocco note'); // Ora controllo se è uscita una richiesta di salvare il file
if Figlia <> 0 then
if GetParent(Figlia) = Finestra then // se Figlia è parente di Finestra
begin
PostMessage(Figlia, WM_CLOSE,0,0); // la chiudo
PostMessage(Finestra, WM_DESTROY,0,0); // e chiudo brutalmente la finestra
end;
end;
end.

Esempio 2: Vuoi chiudere una finestra del Blocco Note e ricavi handle per mezzo della classe...

FindWindow('Notepad' , nil);

program ChiudiFinestra2;

uses SysUtils, windows, Messages;

var
Finestra, Figlia: HWND;

begin
Figlia := 0;
Finestra := 0;
Finestra := FindWindow('Notepad' , nil);
if Finestra <> 0 then
begin
PostMessage(Finestra, WM_CLOSE,0,0);
Sleep(500);
Figlia := FindWindow(nil , 'Blocco note'); // Ora controllo se è uscita una richiesta di salvare il file
if Figlia <> 0 then
if GetParent(Figlia) = Finestra then // se Figlia è parente di Finestra
begin
PostMessage(Figlia, WM_CLOSE,0,0); // la chiudo
PostMessage(Finestra, WM_DESTROY,0,0); // e chiudo brutalmente la finestra
end;
end;
end.

Esempio 3: Se vuoi chiude tutte le finestre del Blocco Note aggiungi un ciclo

repeat CodiceDaEseguire until CondizionePerTeminareIlCiclo;

program ChiudiFinestre;

uses SysUtils, windows, Messages;

var
Finestra, Figlia: HWND;

begin
Figlia := 0;
Finestra := 0;
Repeat // inizia il ciclo
begin
Finestra := FindWindow('Notepad' , nil);
if Finestra <> 0 then
begin
PostMessage(Finestra, WM_CLOSE,0,0);
Sleep(500);
Figlia := FindWindow(nil , 'Blocco note'); // Ora controllo se è uscita una richiesta di salvare il file
if Figlia <> 0 then
if GetParent(Figlia) = Finestra then // se Figlia è parente di Finestra
begin
PostMessage(Figlia, WM_CLOSE,0,0); // la chiudo
PostMessage(Finestra, WM_DESTROY,0,0); // e chiudo brutalmente la finestra
end;
end;
end;
until Finestra = 0; // tarmina il ciclo quando Finestra è uguale a 1
end.


Ciao.