Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.63/32: Рейтинг темы: голосов - 32, средняя оценка - 4.63
Determinant
2 / 2 / 3
Регистрация: 11.04.2009
Сообщений: 67
1

Работа с областью system tray

18.02.2011, 16:35. Просмотров 5882. Ответов 25
Метки нет (Все метки)

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

с внесением иконки в трей более менее разобрался, а вот с мышкой и анимацией нет...
желательно полный код.
Заранее спасибо!
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.02.2011, 16:35
Ответы с готовыми решениями:

Работа с закрашенной областью stringgrid
Имеется двумерный массив (stringgrid). В массиве я выделяю различными цветами несколько...

Windows-служба и System Tray.
Есть работающее приложение, оформленное в виде Windows-службы с аккаунтом LocalSystem. Необходимо...

Как поместить иконку в System Tray?
Мне нужно поместить иконку в System Tray. Каим образом это можно сделать??

Как свернуть прогу в system tray?
Можно ли свернуть фоксовскую прогу в область уведомлений или это невозможно?

System tray и событие на кнопку сворачивания
Искал как повесить событие на кнопку сворачивания - не нашел. Обошелся костылём. Но и с ним...

25
maxo
хацкер
172 / 157 / 34
Регистрация: 19.01.2011
Сообщений: 425
18.02.2011, 16:48 2
Установи Raize там есть RzTrayIcon, берешь popupmenu делаешь менюшку и в свойствах указываешь свой popup, вообщем разберешься
0
Determinant
2 / 2 / 3
Регистрация: 11.04.2009
Сообщений: 67
18.02.2011, 20:48  [ТС] 3
Спасибо конечно, но мне нужно чуть не так..
набросал код программы, на функцию RegisterWindowMessage выдает: [Error] Tray.pas(49): Incompatible types: 'Integer' and 'PAnsiChar'
на AllocateHWND(MessageMng) выдает: [Error] Tray.pas(103): Incompatible types: 'method pointer and regular procedure'
может кто знает, подскажите причину...


Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
unit Tray;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ShellAPI, StdCtrls, Menus;
type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    PopupMenu1: TPopupMenu;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
 
  private
    { Private declarations }
  public
    { Public declarations }
  end;
TNotifyIconData= record
    cbSize: DWORD;
    Wnd: HWND;
    uID: UINT;
    uFlags: UINT;
    uCallbackMessage: UINT;
    hIcon: HICON;
    szTip: array [0..63] of AnsiChar;
  end;
 
var
  Form1: TForm1;
  hand:Integer;
  FHWND: HWND;
 
 
implementation
 
 
 
{$R *.dfm}
 
procedure TForm1.FormCreate(Sender: TObject);
begin
hand:=RegisterWindowMessage(WM_USER:string)
end;
 
procedure TForm1.Button1Click(Sender: TObject);
 
var
  no: TNotifyIconData;
  Hicon1: HIcon;
begin
  //Помещение иконки в Tray Bar
  HIcon1:=ExtractIcon(Handle,'favicon.ico',0);
  with no do
  begin
    cbSize:=Sizeof(TNotifyIconData);
    Wnd:=Handle;
    uID:=0;
    UFlags:=NIF_MESSAGE+NIF_ICON+NIF_TIP;
    SzTip:='My first traybar tip!';
    HIcon:=HIcon1;
    //Определяемое пользователем сообщение
    uCallBackMessage:=WM_USER;
  end;
  Shell_NotifyIcon(NIM_ADD,@no);
end;
 
procedure TForm1.Button2Click(Sender: TObject);
var
  no: TNotifyIconData;
begin
  //Удаление иконки
  with no do
  begin
    cbSize:=Sizeof(TNotifyIconData);
    Wnd:=Handle;
    uID:=0;
  end;
  Shell_NotifyIcon(NIM_Delete,@no);
end;
 
//эта процедура должна обрабатывать сообщение
procedure MessageMng(var Msg:TMessage);
begin
  if  Msg.Msg = WM_USER then
     begin
{.
 
.}
end else
  begin
   Msg.Result:= DefWindowProc(FHWND,Msg.Msg,Msg.WParam,Msg.LParam);
 end;
 FHWND:=AllocateHWND(MessageMng);
end;
 
 
procedure TForm1.Button3Click(Sender: TObject);
var
  no: TNotifyIconData;
  Hicon1: HIcon;
 
 
begin
  //Помещение иконки в Tray Bar
  HIcon1:=ExtractIcon(Handle,'favicon.ico',0);
  with no do
  begin
    cbSize:=Sizeof(TNotifyIconData);
    Wnd:=  FHWND;
    uID:=0;
    UFlags:=NIF_MESSAGE+NIF_ICON+NIF_TIP;
    SzTip:='My first traybar tip!';
    HIcon:=HIcon1;
    //Определяемое пользователем сообщение
    uCallBackMessage:=WM_USER;
   end;
  Shell_NotifyIcon(NIM_MODIFY,@no);
  end;
 
end.
0
i8085
2271 / 1613 / 327
Регистрация: 11.09.2009
Сообщений: 5,888
19.02.2011, 01:58 4
Determinant, а зачем через WindowMessage ?
На форму добавить TrayIcon (из Samples),
настроить его Object Inspector,
почитать Help по компоненту.

Пример - развернуть свёрнутое в трей приложение:
Delphi
1
2
3
4
5
6
if TrayIcon1.IconVisible then    // если приложение свёрнуто  в трей
  begin
  TrayIcon1.AppVisible:= true;
  TrayIcon1.FormVisible:= true;
  TrayIcon1.IconVisible:= false;
  end;
1
Determinant
2 / 2 / 3
Регистрация: 11.04.2009
Сообщений: 67
19.02.2011, 13:58  [ТС] 5
Ну просто в программе должна быть возможность не только свертывать и разворачивать в трей, но и редактировать саму иконку, изменять текст подсказки, да и вообще желательно иконка как GIF файл..я так понимаю это не стандартное сообщение, поэтому его нужно зарегить в системе сообщение..
0
i8085
2271 / 1613 / 327
Регистрация: 11.09.2009
Сообщений: 5,888
19.02.2011, 19:02 6
Determinant, насчёт GIF навскидку не скажу, а менять иконку - свойство Icon, менять подсказку - свойство PopUpMenu.
Могу ошибаться (давно это было), но вроде смена иконки по таймеру потребляет меньше процессорного времени, чем проигрыватель GIF-анимации.
0
Determinant
2 / 2 / 3
Регистрация: 11.04.2009
Сообщений: 67
19.02.2011, 20:20  [ТС] 7
Да но мне GIF желательно как раз и время тут не в счет, так как прога не очень большая
а Icon это свойство какого обьекта?
0
i8085
2271 / 1613 / 327
Регистрация: 11.09.2009
Сообщений: 5,888
21.02.2011, 01:46 8
Icon - это свойство TrayIcon (из Samples).

Цитата Сообщение от Determinant Посмотреть сообщение
время тут не в счет, так как прога не очень большая
"потребляет меньше процессорного времени" - это значит меньше тормозит программу. От размера программы не зависит. Чем чаще меняется иконка ("частота кадров" анимации), тем это более сказывается на скорости выполнения программы. Хотя, на современных машинах это единицы процентов...
1
Determinant
2 / 2 / 3
Регистрация: 11.04.2009
Сообщений: 67
21.02.2011, 22:28  [ТС] 9
нету у меня в Delphi 7 такого компонента(

а другие способы есть? через то же нестандартное сообщение например, может кто подскажет?
0
maxo
хацкер
172 / 157 / 34
Регистрация: 19.01.2011
Сообщений: 425
21.02.2011, 22:36 10
ты мой пост читал?
0
Determinant
2 / 2 / 3
Регистрация: 11.04.2009
Сообщений: 67
21.02.2011, 22:56  [ТС] 11
читал конечно, скачал, установил и в делфи ничего нету нового...
0
maxo
хацкер
172 / 157 / 34
Регистрация: 19.01.2011
Сообщений: 425
21.02.2011, 23:04 12
Всмысле нет ничего нового??
0
Determinant
2 / 2 / 3
Регистрация: 11.04.2009
Сообщений: 67
21.02.2011, 23:07  [ТС] 13
ну никаких комнонентов не появилось в делфи, да и ярлыка в пуске тоже от Raize нет(
0
maxo
хацкер
172 / 157 / 34
Регистрация: 19.01.2011
Сообщений: 425
21.02.2011, 23:13 14
Значит не указал свою делфи, пробуй ЭТО
1
anonimus
2183 / 1251 / 143
Регистрация: 28.04.2010
Сообщений: 4,592
21.02.2011, 23:21 15
вот код который сворачивает в трей, по клику правой мышей вывод PopupMenu

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
.............
     Procedure Trey(n:Integer;Icon:TIcon);
    Procedure ControlWindow(Var Msg:TMessage); message WM_SYSCOMMAND;
   Procedure OnMinimizeProc(Sender:TObject);
   Procedure IconMouse(var Msg:TMessage); message WM_USER+1;
.............
Procedure TForm1.ControlWindow(Var Msg:TMessage);
Begin
 IF Msg.WParam=SC_MINIMIZE then
  Begin
   Trey(1,Application.Icon);  
   ShowWindow(Handle,SW_HIDE);  
   ShowWindow(Application.Handle,SW_HIDE);  
 End else inherited;
End;
 
procedure TForm1.IconMouse(var Msg:TMessage);
Var p:tpoint;
begin
 GetCursorPos(p); 
 Case Msg.LParam OF 
  WM_LBUTTONUP,WM_LBUTTONDBLCLK: {Aaenoaey, auiieiyaiue ii iaeia?iiio eee aaieiiio uae?eo eaaie eiiiee iuoe ia cia?ea. A iaoai neo?aa yoi i?inoi
aeoeaaoey i?eei?aiey} 
                   Begin
                    Trey(2,Application.Icon);  
                    ShowWindow(Application.Handle,SW_SHOW); 
                    ShowWindow(Handle,SW_SHOW);
                   End;
  WM_RBUTTONUP: {Aaenoaey, auiieiyaiue ii iaeia?iiio uae?eo i?aaie eiiiee iuoe}
   Begin
    SetForegroundWindow(Handle);  
    PopupMenu1.Popup(p.X,p.Y);  
    PostMessage(Handle,WM_NULL,0,0);
   end;
 End;
end;
 
Procedure TForm1.Trey(n:Integer;Icon:TIcon);
Var Nim:TNotifyIconData;
begin
 With Nim do
  Begin
   cbSize:=SizeOf(Nim); 
   Wnd:=Self.Handle;    
   uID:=1;
   uFlags:=NIF_ICON or NIF_MESSAGE or NIF_TIP; 
   hicon:=Icon.Handle; 
   uCallbackMessage:=wm_user+1;
   szTip :=' Мой Backup';      //подсказка
  End;
 Case n OF
  1: Shell_NotifyIcon(Nim_Add,@Nim);         
  2: Shell_NotifyIcon(Nim_Delete,@Nim);   
  3: Shell_NotifyIcon(Nim_Modify,@Nim); 
 End;
 end;
 
 
Procedure TForm1.OnMinimizeProc(Sender:TObject);
Begin
 PostMessage(Handle,WM_SYSCOMMAND,SC_MINIMIZE,0);
End;
 
procedure TForm1.N1Click(Sender: TObject);
begin
close;
end;
1
Determinant
2 / 2 / 3
Регистрация: 11.04.2009
Сообщений: 67
21.02.2011, 23:22  [ТС] 16
помню указывал делфи 7 при установке...
спасибо, это просто образец компонента TrayIcon?
0
anonimus
2183 / 1251 / 143
Регистрация: 28.04.2010
Сообщений: 4,592
21.02.2011, 23:25 17
Determinant, это рабочий код, без всяких компонентов
1
Determinant
2 / 2 / 3
Регистрация: 11.04.2009
Сообщений: 67
21.02.2011, 23:34  [ТС] 18
спасибо! а как определить файл для иконки, чего то не доганяю?
0
maxo
хацкер
172 / 157 / 34
Регистрация: 19.01.2011
Сообщений: 425
22.02.2011, 08:11 19
Цитата Сообщение от Determinant Посмотреть сообщение
спасибо! а как определить файл для иконки, чего то не доганяю?

По видимому его просто нужно загрузить через load icon (Project - Options - Application)

\\\

Не совсем, но должен тоже проканать
1
Determinant
2 / 2 / 3
Регистрация: 11.04.2009
Сообщений: 67
22.02.2011, 23:55  [ТС] 20
спасибо конечно, но вот почему то при нажатии на пункте в popupmenu, окно программы появляется, но оно невидимое( В свойствах формы Visible стоит true...



unit Trayic;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
PopupMenu1: TPopupMenu;
ushow1: TMenuItem;
hint1: TMenuItem;
change1: TMenuItem;
Procedure Trey(n:Integer;Icon:TIcon);
Procedure ControlWindow(Var Msg:TMessage); message WM_SYSCOMMAND;
Procedure OnMinimizeProc(Sender:TObject);
Procedure IconMouse(var Msg:TMessage); message WM_USER+1;
procedure ushow1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}
Procedure TForm1.ControlWindow(Var Msg:TMessage);
var Icon1:TIcon;
Begin

IF Msg.WParam=SC_MINIMIZE then
Begin
Trey(1,Application.Icon);
ShowWindow(Handle,SW_HIDE);
ShowWindow(Application.Handle,SW_HIDE);
End else inherited;
End;

procedure TForm1.IconMouse(var Msg:TMessage);
Var p:tpoint;
begin
GetCursorPos(p);
Case Msg.LParam OF
WM_LBUTTONUP,WM_LBUTTONDBLCLK: {Aaenoaey, auiieiyaiue ii iaeia?iiio eee aaieiiio uae?eo eaaie eiiiee iuoe ia cia?ea. A iaoai neo?aa yoi i?inoi
aeoeaaoey i?eei?aiey}
Begin
Trey(2,Application.Icon);
ShowWindow(Application.Handle,SW_SHOW);
ShowWindow(Handle,SW_SHOW);
End;
WM_RBUTTONUP: {Aaenoaey, auiieiyaiue ii iaeia?iiio uae?eo i?aaie eiiiee iuoe}
Begin
SetForegroundWindow(Handle);
PopupMenu1.Popup(p.X,p.Y);
PostMessage(Handle,WM_NULL,0,0);
end;
End;
end;

Procedure TForm1.Trey(n:Integer;Icon:TIcon);
Var Nim:TNotifyIconData;
Icon1:HICON;
begin
Icon1:=ExtractIcon(Handle,'favicon.ico',0);
With Nim do
Begin
cbSize:=SizeOf(Nim);
Wnd:=Self.Handle;
uID:=1;
uFlags:=NIF_ICON or NIF_MESSAGE or NIF_TIP;
hicon:=Icon.Handle;
uCallbackMessage:=wm_user+1;
szTip :='Мой Backup'; //подсказка
End;
Case n OF
1: Shell_NotifyIcon(Nim_Add,@Nim);
2: Shell_NotifyIcon(Nim_Delete,@Nim);
3: Shell_NotifyIcon(Nim_Modify,@Nim);
End;
end;


Procedure TForm1.OnMinimizeProc(Sender:TObject);
Begin
PostMessage(Handle,WM_SYSCOMMAND,SC_MINIMIZE,0);
End;

procedure TForm1.ushow1Click(Sender: TObject);
begin
ShowWindow(Application.Handle,SW_SHOW);
end;
end.



извените, что так, но почему то код не выделяется

Добавлено через 2 часа 4 минуты
с показом формы разобрался, а вот как ее изменить пользователю не понятно...может кто подскажет?
0
22.02.2011, 23:55
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.02.2011, 23:55

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Как свернуть программу в System Tray?
Привет всем! У меня такой вопрос: как программу написанную на VB (например по нажатию кнопки)...

Visual J++ ::: Как поставить иконку в System Tray?
Пишу программу на Visual J++, и нужно чтобы при запуске программа добавляла свою иконку в System...

Как скрыть приложение в системный лоток (System Tray)
LK, а не подскажите ещё , как реализовать закрытие программы в трэй в с++ Что бы при нажатии на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.