Вот такой код работает нормально (включая 64 bit на XE3):
Код:
function AddWindow(AHandle : THandle; ListBox : LPARAM) : BOOL; stdcall;
var
FWndInfo : TWndInfo;
AText : String;
PText : Array [0..1023] Of Char;
begin
If (AHandle <> Application.Handle) And (AHandle <> Application.MainForm.Handle) And
(IsWindowVisible(AHandle)) And (GetWindow(AHandle, GW_OWNER) = 0) And (IsWindow(AHandle))
Then
Begin
FillChar(PText,Length(PText) * SizeOf(Char),#0);
GetWindowText(AHandle,@PText,1023);
AText := StrPas(PText);
If (AText <> '') And (AText <> 'Program Manager') Then
Begin
FWndInfo := TWndInfo.Create(AHandle,AText);
TListBox(ListBox).Items.AddObject(AText,FWndInfo);
End;
End;
Result := TRUE;
end;
{ TMainForm }
procedure TMainForm.GetWindowsList;
var
I : Integer;
begin
lbWindows.Items.BeginUpdate;
Try
// Clear
For I := 0 To lbWindows.Items.Count-1 Do lbWindows.Items.Objects[i].Free;
lbWindows.Items.Clear;
lbWindows.Sorted := False;
// Get new list
EnumWindows(@AddWindow,LPARAM(lbWindows));
If lbWindows.Items.Count > 0 Then lbWindows.ItemIndex := 0;
lbWindows.Sorted := FPreferences.SortOrder = soAlpha;
Finally
lbWindows.Items.EndUpdate;
End;
end;
В TWndInfo ничего интересного нет, просто объект для сохранения информации об окне.
lbWindows - собтвенно TListBox для вывода списка окон.