Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.07.2011, 15:36   #1
Vadik(R)
Пользователь
 
Регистрация: 10.03.2008
Сообщений: 68
По умолчанию Проблемы со сворчиванием в Tray

Собственно, как сверачивать/разворачивать программу из трея я умею. Но работает это только в том случае, если у приложения одна форма. А если приложение имеет форму и какое-нибудь окно ShowMessage, то при сворачивании приложения ShowMessage остается видимым. Собственно, с этим и проблемы. Идея такая, что надо как-то получить все дочерние формы главной формы и их тоже сделать невидимыми. Но, собственно, как отловить это окошко ShowMessage или какой-либо другой диалог - я не знаю. Подскажите, как это сделать или предложите другой вариант свернуть приложение красиво со всеми открытыи в нём окнами.
Вот код, который есть:
Код:
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 останется
Vadik(R) вне форума Ответить с цитированием
Старый 26.07.2011, 16:17   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

ну да. а что в этом такого?
Форма никуда не исчезает. Она просто скрывается с экрана. Но она там.
Человек_Борща вне форума Ответить с цитированием
Старый 26.07.2011, 16:38   #3
Vadik(R)
Пользователь
 
Регистрация: 10.03.2008
Сообщений: 68
По умолчанию

Ну так надо чтобы вместе с ней ShowMessage тоже скрылся
Vadik(R) вне форума Ответить с цитированием
Старый 26.07.2011, 16:55   #4
volod3000
Форумчанин
 
Аватар для volod3000
 
Регистрация: 18.12.2008
Сообщений: 266
По умолчанию

Так сделайте невидимым свой ShowMessage по событию сворачивания в трей

Мало открыть человеку глаза, большинство еще просит указать дорогу и ждет волшебного пенделя.
volod3000 вне форума Ответить с цитированием
Старый 26.07.2011, 17:07   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
Сообщение от volod3000 Посмотреть сообщение
Так сделайте невидимым свой ShowMessage по событию сворачивания в трей

Ну, это вполне возможно. Если он напишет свой ShowMessage.

ShowMessage это просто форма с label и caption больше ничего. Либо пиши свой вариант. Либо изучайт е откуда у ShowMessage ноги растут в модуле dialogs.
Человек_Борща вне форума Ответить с цитированием
Старый 26.07.2011, 17:12   #6
ZuBy
Участник клуба
 
Аватар для ZuBy
 
Регистрация: 29.09.2008
Сообщений: 1,234
По умолчанию

вот мой вариант ShowMessage
он должен решить вашу проблему
ZuBy вне форума Ответить с цитированием
Старый 26.07.2011, 17:29   #7
grafgrial
Просто хороший
Форумчанин
 
Аватар для grafgrial
 
Регистрация: 26.03.2010
Сообщений: 562
По умолчанию

... удалено
Помог, нажми весы слева
grafgrial вне форума Ответить с цитированием
Старый 27.07.2011, 00:42   #8
Vadik(R)
Пользователь
 
Регистрация: 10.03.2008
Сообщений: 68
По умолчанию

Цитата:
Сообщение от volod3000 Посмотреть сообщение
Так сделайте невидимым свой ShowMessage по событию сворачивания в трей
В том и проблема, я не знаю как его отловить
Vadik(R) вне форума Ответить с цитированием
Старый 27.07.2011, 09:31   #9
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

По логике микрософта диалоговое окно (а ShowMessage именно такое) запрещают активизировать другие окна приложения пока не будет закрыто.
Попробуйте ка мнимизировать или закрыть окно приложения если активным является ShowMessage.
Отсюда вариант решения: не стоит прятать приложение в трей, если есть активное в этот момент диалоговое окно.

А чтобы нельзя было вызвать меню из иконки в трее нужно обойти этот момент с помощью FindWindowEx:
Код:
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
    //в примере "Project1" имя приложения, в реальности заменить на свое
    if FindWindowEx(0, 0, 'TMessageForm', 'Project1') <> 0 then Exit;
    GetCursorPos(P);
    SetForegroundWindow(Handle);
    PopupMenu1.Popup(P.X, P.Y);
  end;
end;
Другой вариант: если же приспичило, то получив дескриптор окна, опять же, функцией FindWindowEx, его по этому дескриптору и пристрелить при сворачивании приложения в трей.
Прик вне форума Ответить с цитированием
Старый 27.07.2011, 22:08   #10
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

А вы вообще знаете что ShowMessage это тоже TForm? При том дельфийский...

Реализуй свой ShowMessage ... и ам принмай сообщение от трея ну WM_TRAY свой
Человек_Борща вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
System Tray xRamzeSx Общие вопросы Delphi 9 19.09.2010 14:47
Настраиваемый Tray hint Johnson Общие вопросы Delphi 2 13.11.2009 16:00
Tray Shouldercannon Общие вопросы Delphi 4 16.07.2008 22:35