Проблемы со сворчиванием в Tray

Тема в разделе "Delphi - FAQ", создана пользователем Vadik(R), 26 июл 2011.

  1. Vadik(R)

    Vadik(R) Well-Known Member

    Регистрация:
    12 дек 2007
    Сообщения:
    483
    Симпатии:
    0
    Собственно, как сверачивать/разворачивать программу из трея я умею. Но работает это только в том случае, если у приложения одна форма. А если приложение имеет форму и какое-нибудь окно ShowMessage, то при сворачивании приложения ShowMessage остается видимым. Собственно, с этим и проблемы. Идея такая, что надо как-то получить все дочерние формы главной формы и их тоже сделать невидимыми. Но, собственно, как отловить это окошко ShowMessage или какой-либо другой диалог - я не знаю. Подскажите, как это сделать или предложите другой вариант свернуть приложение красиво со всеми открытыи в нём окнами.
     
  2. Dock1100

    Dock1100 :-]

    Регистрация:
    9 ноя 2009
    Сообщения:
    678
    Симпатии:
    0
    Попробуй покопать в сторону GetWindow и GetNextWindow.
     
  3. Vadik(R)

    Vadik(R) Well-Known Member

    Регистрация:
    12 дек 2007
    Сообщения:
    483
    Симпатии:
    0
    Вот код, который есть:
    Код (Delphi):
    unit Unit1;

    interface

    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, StdCtrls, Menus, ShellAPI;

    type
    TForm1 = class(TForm)
    PopupMenu1: TPopupMenu;
    Menu: TMenuItem;
    Exit: TMenuItem;
    Button1: TButton;
    procedure WMUser(var Msg: TMessage); message WM_USER;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure MenuClick(Sender: TObject);
    procedure ExitClick(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    public
    { Public declarations }
    private
    { Private declarations }
    end;

    var
    Form1: TForm1;

    implementation

    {$R *.dfm}

    procedure TForm1.WMUser(var Msg: TMessage);
    var
    P: TPoint;
    begin
    if Msg.LParam = WM_LBUTTONUP then
    begin
    SetForegroundWindow(Handle);
    Menu.Caption := 'Свернуть';
    ShowWindow(Application.Handle, SW_RESTORE);
    ShowWindow(Handle, SW_RESTORE);
    end;
    if Msg.LParam = WM_RBUTTONUP then
    begin
    GetCursorPos(P);
    SetForegroundWindow(Handle);
    PopupMenu1.Popup(P.X, P.Y);
    end;
    end;

    procedure TForm1.FormCreate(Sender: TObject);
    var
    NIData: TNotifyIconData;
    begin
    Application.OnMinimize := MenuClick;
    NIData.cbSize := SizeOf(TNotifyIconData);
    NIData.Wnd := Handle;
    NIData.uID := 0;
    NIData.uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
    NIData.uCallBackMessage := WM_USER;
    NIData.hIcon := Application.Icon.Handle;
    StrPCopy(NIData.szTip, Application.Title);
    Shell_NotifyIcon(NIM_ADD, @NIData);
    end;

    procedure TForm1.FormDestroy(Sender: TObject);
    var
    NIData: TNotifyIconData;
    begin
    NIData.cbSize := SizeOf(TNotifyIconData);
    NIData.Wnd := Handle;
    NIData.uID := 0;
    Shell_NotifyIcon(NIM_DELETE, @NIData);
    end;

    procedure TForm1.MenuClick(Sender: TObject);
    begin
    if Menu.Caption = 'Свернуть' then
    begin
    Menu.Caption := 'Восстановить';
    ShowWindow(Handle, SW_HIDE);
    ShowWindow(Application.Handle, SW_HIDE);
    end
    else
    begin
    Menu.Caption := 'Свернуть';
    ShowWindow(Application.Handle, SW_RESTORE);
    ShowWindow(Handle, SW_RESTORE);
    end;
    end;

    procedure TForm1.ExitClick(Sender: TObject);
    begin
    Application.Terminate;
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    begin
    ShowMessage('1');
    end;

    end.
    Если кликнуть по кнопке, а потом по трею правой кнопкой мыши -> свернуть, то форма исчезнет (что вполне логично по коду), а вот ShowMessage останется ;)
    P.S. Что-то с GetWindow пока ничего хорошего не выходит :(
     
  4. Dock1100

    Dock1100 :-]

    Регистрация:
    9 ноя 2009
    Сообщения:
    678
    Симпатии:
    0
    Может это поможет: http://forum.developing.ru/showthread.php/...иалогового-окна
    Добавлено :
    В принципе вроде работает, но для MessageBox, а не ShowMessage:
    Код (Delphi):
    .......
    MessageBox(form1.Handle, PChar('Msg'), PChar('Capt'), mb_ok);
    memo1.Lines.Clear;
    .......


    .......
    var i:integer;
    h:HWND;
    begin
    {h:=GetWindow(form1.Handle,GW_ENABLEDPOPUP); }
    h:=form1.Handle;
    while (h<>0) do
    begin
    h:=GetNextWindow(h,GW_HWNDPREV);
    if GetParent(h)=form1.Handle then
    memo1.Lines.Add(inttostr(h));
    end;
    .......
     
Загрузка...
Похожие Темы - Проблемы со сворчиванием
  1. Валентин Амбер
    Ответов:
    11
    Просмотров:
    372
  2. Zoger
    Ответов:
    2
    Просмотров:
    1.738
  3. k85
    Ответов:
    1
    Просмотров:
    1.234
  4. Soulcall
    Ответов:
    2
    Просмотров:
    1.942
  5. Amfion
    Ответов:
    3
    Просмотров:
    1.972

Поделиться этой страницей