Delphi: перемещение значка приложения в SysTray

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

Вопрос по Delphi

Сообщение Альберт » Вс апр 27, 2003 1:02 pm

Как убрать кнопку проги из таскабара, и если не трудно, то как поместить икону в трей?
Последний раз редактировалось Альберт Чт май 15, 2003 10:48 am, всего редактировалось 1 раз.
Альберт
Рядовой
 
Сообщений: 8
Зарегистрирован: Вт мар 25, 2003 2:06 pm
Откуда: Владивосток
Пункты репутации: 0

Сообщение earl » Пн апр 28, 2003 11:02 am

2Альберт: Вот пример...

PROGRAM Terminate;
Uses
Forms,
Classes,
term_pr In 'term_pr.pas' {Form1};
{$R *.RES}
Begin
Application.Initialize;
Application.Title := 'ProgKiller';
Application.CreateForm(TForm1, Form1);
Application.ShowMainForm:=False;
Application.Run;
END.

Выделенная строка запрещает отображение главной формы приложения. Чтобы была иконка в SysTray, нужно на форму поместить соотв. компонент (например, из RXLibrary, я этой библиотекой пользуюсь). Для отображения формы (по необходимости) в процессе работы и(или) для нормального завершения работы проги, каких-то других действий нужно к компоненте TrayIcon "подцепить" контекстное меню, где все необходимые команды и прописывать.
Если ты сделаешь форму видимой
(procedure TForm1.PopUpMenuShowClick(Sender: TObject);
begin
Form1.Show;
end;),
то для того, чтоб опять её "спрятать" надо перехватывать системное событие "закрытие приложения":
Interface
...
Private
Procedure MyHide(Var MS: TMessage); Message WM_CLOSE;
...
Implementation
...
Procedure TForm1.MyHide(Var MS: TMessage);
Begin
Application.ShowMainForm:=False;
Form1.Visible:=False;
End;
...
END.
earl
Подполковник
 
Сообщений: 614
Зарегистрирован: Ср июн 19, 2002 7:04 pm
Откуда: Череповец
Пункты репутации: 0

Сообщение Anthony Fox » Вт май 13, 2003 3:26 am

Слышь, напиши мне на мыло я тебе потолковей растолкую, OK? maito:anthony_fox@fromru.com
(У меня небольшой опыт в этом деле...)
When the sun and moon are joined, the entrance to eternity is opened...
<a href='http://foxsite.hut1.ru' target='_blank'>http://www.foxsite.hut1.ru</a>
Anthony Fox
Капитан
 
Сообщений: 277
Зарегистрирован: Вс май 11, 2003 8:17 am
Откуда: Россия, Татарстан
Пункты репутации: 0

Сообщение dAnIK SeNT » Вт май 13, 2003 11:16 am

2Anthony Fox
Такие вещи лучше постить прямо в теме. Наверное, этот вопрос может заинтересовать не только одного человека.
яНЯЕД ОН СОПЪФЙЕ: Athlon 64 X2 5200+ @2,86GHz / nF 570 SLI (ASUS M2N SLI Deluxe) / 4 Gb RAM (4x1Gb Kingston) / 2,9Tb SATAII (0,50+0,64+0,75+1,00Tb WD) / ASUS 8800 GTS512 / 2x NEC-Optiarc AD-7173 / Thermaltake ToughPower 650W / 2x30W Microlab Solo-2 / 20" LCD Benq FP202W (wide) / openSUSE 11.1 / KDE 4.2.1
<!--coloro:Navy--><span style="color:Navy"><!--/coloro-->оН БЯЕЛ БНОПНЯЮЛ - Б email. б ICQ ОНЪБКЪЧЯЭ ПЮГ Б ОНКЦНДЮ.<!--colorc--></span><!--/colorc-->
dAnIK SeNT
Маршал
 
Сообщений: 5101
Зарегистрирован: Чт мар 28, 2002 7:48 pm
Откуда: яяяп
Пункты репутации: 0

Сообщение Anthony Fox » Чт май 15, 2003 10:08 am

Это в самом начале проги после uses.

Код: выделить все
const
 WM_MYTRAYNOTIFY = WM_USER + 123; {123 - случайное
  число,можешь прибавлять любое натуральное}

В разделе TForm1 = class

Код: выделить все
  procedure WMICON(var msg: TMessage); message WM_MYTRAYNOTIFY;
// в этой процедуре будешь обрабатывать системные сообщения от иконки

Создание иконки:
Код: выделить все
procedure TForm1.CreateTrayIcon(n: integer);
var
   NiData: TNotifyiconData;
   I: Integer;
begin
 with NiData do
   begin
     cbSize:=SizeOf(TNotifyIconData);
     Wnd:=Self.Handle;
     uID:=n; {n - номер иконки}
     uFlags:=NIF_ICON or NIF_MESSAGE or NIF_TIP;
     uCallBackMessage:=WM_MYTRAYNOTIFY; {обратная связь}
     hIcon:=Application.Icon.Handle; {Иконка в таскбаре}
     szTip[I]:='This is trayicon tooltip'; {всплывающая подсказка}
   end;
 Shell_NotifyIcon(NIM_ADD,@NiData);
end;

Удаление иконки:
Код: выделить все
procedure TForm1.DeleteTrayIcon(n: Integer); {n - как всегда номер}
var
 NiData: TNotifyIconData;
begin
 with NiData do
   begin
     cbSize:=SizeOf(TNotifyIconData);
     Wnd:=Self.Handle;
     uID:=n;
   end;
 Shell_NotifyIcon(NIM_DELETE,@NiData);
end;


Еще есть модификация иконки: NIM_MODIFY (Shell_NotifyIcon(NIM_MODIFY,@NiData);

Пример обработки событий от значка в таскбаре.

Код: выделить все
procedure TForm1.WMICON(var msg: TMessage);
var P: TPoint;
begin
 case msg.LParam of
  WM_RBUTTONDOWN:
    begin
      GetCursorPos(P);
      SetForegroundWindow(Application.MainForm.Handle);
      PopupMenu1.Popup(P.X,P.Y); {вылазиет менюшка класса TPopupMenu, он есть на странице

компонентов}
    end;
  WM_LBUTTONDOWN:
   begin
     ShowWindow(Application.Handle,SW_SHOW); {Пример показа окна, нужно сделать все действия}
     Visible:=True;
     Application.ShowMainForm:=True;
     DeleteTrayIcon(1);
     ShowWindow(Application.Handle,SW_SHOW);
     Application.Restore;
   end;
 end;
end;


А вот что нужно сделать, чтоб спрятать окно.
Код: выделить все
  Application.ShowMainForm:=False;
  ShowWindow(Application.Handle,SW_HIDE);
  CreateTrayIcon(1);


Можно еще сделать с помощью отлавливания события WM_SYSCOMMAND, чтобы при нажатии кнопки свернуть

оно "уходило" в таскбар.

А вообще пора заняться и написать класс в Делфях по этому делу.
When the sun and moon are joined, the entrance to eternity is opened...
<a href='http://foxsite.hut1.ru' target='_blank'>http://www.foxsite.hut1.ru</a>
Anthony Fox
Капитан
 
Сообщений: 277
Зарегистрирован: Вс май 11, 2003 8:17 am
Откуда: Россия, Татарстан
Пункты репутации: 0

Сообщение dAnIK SeNT » Чт май 15, 2003 12:10 pm

2Anthony Fox
Таких классов море... Только зачем пользовать класс, если можно без него? <!--emo&:)-->Изображение<!--endemo-->
яНЯЕД ОН СОПЪФЙЕ: Athlon 64 X2 5200+ @2,86GHz / nF 570 SLI (ASUS M2N SLI Deluxe) / 4 Gb RAM (4x1Gb Kingston) / 2,9Tb SATAII (0,50+0,64+0,75+1,00Tb WD) / ASUS 8800 GTS512 / 2x NEC-Optiarc AD-7173 / Thermaltake ToughPower 650W / 2x30W Microlab Solo-2 / 20" LCD Benq FP202W (wide) / openSUSE 11.1 / KDE 4.2.1
<!--coloro:Navy--><span style="color:Navy"><!--/coloro-->оН БЯЕЛ БНОПНЯЮЛ - Б email. б ICQ ОНЪБКЪЧЯЭ ПЮГ Б ОНКЦНДЮ.<!--colorc--></span><!--/colorc-->
dAnIK SeNT
Маршал
 
Сообщений: 5101
Зарегистрирован: Чт мар 28, 2002 7:48 pm
Откуда: яяяп
Пункты репутации: 0


Вернуться в Программирование

Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

cron