Lo que necesitas se puede hacer con la API 'EnumWindows', pero me parece que hay un poco de mayor control con la API 'GetWindow' como te muestra a continuacion:
Código Delphi
[-]
var Buffer: array [0..255] of Char;
procedure TForm1.Button1Click(Sender: TObject);
var hWnd: Cardinal;
begin
ListBox1.Clear;
hWnd := GetWindow(GetDesktopWindow, GW_CHILD);
while hWnd <> 0 do
begin
if IsWindowVisible(hWnd) and (GetWindowText(hWnd, @Buffer, SizeOf(Buffer)) <> 0) then
ListBox1.AddItem(Buffer, Pointer(hWnd));
hWnd := GetWindow(hWnd, GW_HWNDNEXT);
end;
end;
En la propiedad 'Objects' del 'TStrings' guardo el identificador (Handle), de cada ventana para poder utilizarlo posteriormente como muestro en el siguiente código. Tambien debes tener MUY en cuenta que las ventanas pueden estar minimizadas, si quieres saber si una de estas lo está simplemente haces algo como ésto:
Código Delphi
[-]
procedure TForm1.ListBox1Click(Sender: TObject);
begin
with ListBox1 do
if IsIconic(Cardinal(Items.Objects[ItemIndex])) then
MessageBox(0, 'La ventana esta minimizada!', nil, 0)
else
MessageBox(0, 'La ventana NO esta minimizada', nil, 0);
end;
Tambien es de consideracion el hecho de algunas aplicaciones utilizan el 'SysTray' (los iconos que están al lado del reloj)... si quieres considerar a éstos tambien, haz el siguiente reemplazo en la primera parte del código que te deje:
Código Delphi
[-]
IsWindowVisible(hWnd)
por
(GetWindow(hWnd, GW_CHILD) <> 0)
Espero haya sido ilustrador, Suerte!