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

24/11/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:

Function EnumWindowsProc (Wnd: HWND; lb: TListbox): BOOL; stdcall;
var
   caption: Array [0..128&93; 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&93;,1,6));
      If Nome <> ´Listar´ Then
      Begin
         Janela:= FindWindow(nil, PChar(ListBox1.Items.Strings&91;Contador&93;));
         SendMessage(Janela, WM_CLOSE,0,0);
      End;
   End;

end;


Aguardo ajuda!

[]s
Willian


Willian

Respostas

25/11/2005

Edilcimar

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


Responder Citar