Array
(
)

Fechar janela que eu já tenho o Handle: código falha...

Willian
   - 24 nov 2005

Galera,

Vou postar abaixo o código de meu programa. Ele localiza todas as janelas (não processos) do Windows e lista-as na listbox (evento do button1). O button2 encerra, com o SendMessage, todos os programas que estão na listbox, exceto ele mesmo. Mas estou com problema: nem todas janelas são fechadas, quase sempre a última da lista, mas as vezes ele pula 2 ou mais. Qual o problema do código? Segue o código:

#Código

Function EnumWindowsProc (Wnd: HWND; lb: TListbox): BOOL; stdcall;
var
caption: Array [0..128] of Char;
begin
Result := True;
if IsWindowVisible(Wnd) and ((GetWindowLong(Wnd, GWL_HWNDPARENT) = 0) or
(HWND(GetWindowLong(Wnd, GWL_HWNDPARENT)) = GetDesktopWindow))and
((GetWindowLong(Wnd, GWL_EXSTYLE) and WS_EX_TOOLWINDOW) = 0) then
begin
SendMessage( Wnd, WM_GETTEXT, Sizeof(caption),integer(@caption));
lb.Items.AddObject( caption,TObject( Wnd ));
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ListBox1.Items.Clear;
EnumWindows( @EnumWindowsProc, integer( listbox1 ));
end;


procedure TForm1.Button2Click(Sender: TObject);
var
Contador : Integer;
Janela : hWND;
Nome : String;
begin
For Contador := 0 To (ListBox1.Items.Count-1) Do
Begin
Nome := Trim(Copy(ListBox1.Items.Strings[Contador],1,6));
If Nome <> ´Listar´ Then
Begin
Janela:= FindWindow(nil, PChar(ListBox1.Items.Strings[Contador]));
SendMessage(Janela, WM_CLOSE,0,0);
End;
End;

end;


Aguardo ajuda!

[]s
Willian


Edilcimar
   - 25 nov 2005

o ultimo for para o contador
For Contador := 0 To (ListBox1.Items.Count-1) Do
cada vez que vc fecha uma janela, este contador é incrementado, porém o listbox1.items tem o seu Count diminuido de 1, portanto vai dar erro, faça isto dentro de um while listbox1.items.count > 0