Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

System Tray [D7, WinXP]


MaxxSoft ©   (2004-11-16 11:03:00) 

Как свернуть / восстановить приложение в System Tray?


Piter   (2004-11-17 00:35:00) [1]

и правильно. Нужно темы такие закрывать и посылать в FAQ (обращаюсь к модераторам)


DrPass   (2004-11-16 22:45:00) [2]

Во многих форумах "как добавить иконку в трей" является оффтопиком. Потому что уже тошнит


grom   (2004-11-16 20:18:00) [3]

unit Unit1;

interface

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

type
 TNotifyIconBalloon = record
  cbSize: DWORD;
  hWnd: HWND;
  uID: UINT;
  uFlags: UINT;
  uCallbackMessage: UINT;
  hIcon: HICON;
  szTip: array[0..127] of AnsiChar;
  dwState: DWORD;
  dwStateMask: DWORD;
  szInfo: array[0..255] of AnsiChar;
  uTimeout: UINT;
  szInfoTitle: array[0..63] of AnsiChar;
  dwInfoFlags: DWORD;
end;

type
 TForm1 = class(TForm)
   Button1: TButton;
   Button2: TButton;
   Button3: TButton;
   PopupMenu1: TPopupMenu;
   procedure FormCreate(Sender: TObject);
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
   procedure Button3Click(Sender: TObject);
   procedure PopupMenu1Popup(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
   procedure DefaultHandler(var M); override;
   procedure Ico(var M:TMessage); message WM_USER+222;
 end;

var
 Form1: TForm1;
 N:TNotifyIconBalloon;
 WM_TASKBARCREATED: Cardinal;
 b:Boolean;
implementation

{$R *.dfm}

procedure BalloonHint(NIco,Flag:byte;Title,Text:string);
begin
 N.cbSize:=SizeOf(TNotifyIconBalloon);
 N.uID:=NIco;
 N.uFlags:=$00000010;
 StrPLCopy(N.szInfo,Text,SizeOf(N.szInfo)-1);
 StrPLCopy(N.szInfoTitle,Title,SizeOf(N.szInfoTitle)-1);
 N.uTimeout:=5000;
 N.dwInfoFlags:=Flag;
 Shell_NotifyIcon(NIM_MODIFY,@N);
end;

procedure AddModDelIcon(H:HWND;R,NIco:byte;Icon:HICON;S:string);
begin
 N.cbSize:=SizeOf(TNotifyIconBalloon);
 N.hWnd:=H;
 N.uID:=NIco;
 N.uFlags:=NIF_MESSAGE or NIF_ICON or NIF_TIP;
 N.uCallbackMessage:=WM_USER+222;
 N.hIcon := Icon;
 StrPLCopy(N.szTip,S,SizeOf(N.szTip)-1);
 if R=1 then Shell_NotifyIcon(NIM_ADD,@N);
 if R=2 then Shell_NotifyIcon(NIM_MODIFY,@N);
 if R=3 then Shell_NotifyIcon(NIM_DELETE,@N);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
AddModDelIcon(Handle,1,1,Application.Icon.Handle,'Add Icon 1');
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
beep;
b:= not b;
if b then AddModDelIcon(Handle,2,1,Icon.Handle,'Modify Icon 1')
     else AddModDelIcon(Handle,2,1,Application.Icon.Handle,'Modify Icon 2')
end;

procedure TForm1.Button2Click(Sender: TObject);//Show Balloon
begin //1= INFO; 2= WARNING; 3= ERROR;
BalloonHint(1,1,'Balloon hint',FormatDateTime('Ñåãîäíÿ : dddd'^m'ddddd ã.',Now))
end;

procedure TForm1.Button3Click(Sender: TObject);//Hide Balloon
begin
BalloonHint(1,0,'','')
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
AddModDelIcon(Handle,3,1,0,'')//Delete Icon
end;

procedure TForm1.Ico(var M:TMessage);
begin
if M.WParam=1 then
case M.LParam of
WM_RBUTTONUP : PopupMenu1.Popup(Mouse.CursorPos.x,Mouse.CursorPos.y);
WM_LBUTTONUP : Button1.Click;
end;
end;

procedure TForm1.PopupMenu1Popup(Sender: TObject);
begin
SetForegroundWindow(Handle)
end;

procedure TForm1.DefaultHandler(var M);
begin
if TMessage(M).Msg = WM_TASKBARCREATED then
AddModDelIcon(Handle,1,1,Application.Icon.Handle,'Add Icon 2');
inherited;
end;

initialization
WM_TASKBARCREATED := RegisterWindowMessage('TaskbarCreated');

end.


MaxxSoft   (2004-11-16 11:52:00) [4]

А можно ссылочки "ЗДЕСЬ" еще раз...


Piter   (2004-11-16 11:25:00) [5]

Вопрос: Как поместить иконку приложения в System Tray?

Ответ: для работы с SysTray (область, где часики) в WinApi есть функция - Shell_NotifyIcon. С помощью нее можно добавлять свои иконки в SysTray, модифицировать их и удалять.

function Shell_NotifyIcon(dwMessage: DWORD; lpData: PNotifyIconData): BOOL; stdcall;

Ее заголовок, а также определение типов TNotifyIconData, PNotifyIconData находится в юните shellapi.pas, который надо подключить для использования данной функции:
code>uses
 ..., ShellAPI;

Пример вызова:
предполагается, что в программе где-то объявлена глобальная переменная NID: TNotifyIconData

procedure TForm1.Button1Click(Sender: TObject);
var
begin
 NID.uID :=0;
 NID.Wnd := Handle;
 NID.uCallbackMessage :=WM_USER;
 NID.hIcon := LoadIcon(HINSTANCE,'ICON1');
 NID.szTip := 'Моя иконка';
 NID.uFlags :=NIF_ICON or NIF_MESSAGE or NIF_TIP;
 NID.cbSize :=sizeof(NID);
 Shell_NotifyIcon(NIM_ADD,@NID);
end;


Файл проекта с данным примером можно загрузить ЗДЕСЬ

Вы можете подробнее почитать по данномй теме ЗДЕСЬ (systray_ext.txt)

Отвечал: Piter


MaxxSoft   (2004-11-16 11:24:00) [6]

Это я понимаю. Хорошо поставим вопрос так: как добавить иконку в Tray и ловить нажатие на нее?


zz 5   (2004-11-16 11:10:00) [7]

Приложение не сворачивается в System Tray, туда добавляется иконка


Наверх

Титульная страница Поиск, карта сайта Написать письмо