Показать сообщение отдельно
  #3  
Старый 07.07.2013, 21:12
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,106
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от Страдалецъ
Ну неужели так трудно в поисковике набрать? "Delphi свернуть все окна"
Сразу кучу решений получите.

Ну тут скорее вопрос о том, что эти окна потом надо обратно развернуть.
Недавно писал прогу для работы с окнами. Вот кусок кода, который получает все видимые окна и сохраняет информацию о них:
Код:
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;

{ TForm1 }

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;

И код класса для хранения информации о найденых окнах:
Код:
unit WndInfo;

interface

uses
  Windows;

type
  TWndInfo = class
  private
    FHandle : THandle;
    FText : String;
    FIcon : HICON;
    FIsMinimized : Boolean;
  protected
    procedure GetWindowInfo;
  public
    constructor Create(AHandle : THandle; AText : String); virtual;
    destructor Destroy; override;

    procedure ActivateWindow;
    procedure MinimizeWindow;

    property Handle : THandle read FHandle;
    property Text : String read FText;
    property Icon : HICON read FIcon;
    property IsMinimized : Boolean read FIsMinimized;
  end;

implementation

{ TWndInfo }

procedure TWndInfo.ActivateWindow;
begin
  If FHandle <> 0 Then
    Begin
      If IsIconic(FHandle) Then ShowWindow(FHandle,SW_RESTORE);
      SetForegroundWindow(FHandle);
    End;
end;

constructor TWndInfo.Create(AHandle: THandle; AText : String);
begin
  inherited Create;
  FIcon := 0;
  FIsMinimized := False;

  FHandle := AHandle;
  FText := AText;

  GetWindowInfo;
end;

destructor TWndInfo.Destroy;
begin
  inherited;
end;

procedure TWndInfo.GetWindowInfo;
const
  WM_GETICON = $007F;
var
  IconHandle : HICON;
begin
  // Get window state
  Try
    FIsMinimized := IsIconic(FHandle);
  Except
  End;

  // Get icon handle
  Try
    IconHandle := SendMessage(FHandle, WM_GETICON, ICON_SMALL2, 0);
    If IconHandle = 0 Then IconHandle := GetClassLong(FHandle,GCL_HICONSM);

    If IconHandle <> 0 Then FIcon := IconHandle;
  Except
  End;
end;

procedure TWndInfo.MinimizeWindow;
begin
  ShowWindow(FHandle,SW_MINIMIZE);
  FIsMinimized := True;
end;

end.
Ответить с цитированием