Форум: "Начинающим";
Текущий архив: 2007.09.23;
Скачать: [xml.tar.bz2];
ВнизСистемный трей Найти похожие ветки
← →
DimOk © (2007-08-29 09:39) [0]Добрый день всем. Подскажите пожалусто как программу свернуть в системный трей.
Заранее всем благодарен.
← →
iXT © (2007-08-29 09:44) [1]Я ожидал в другой ветке :) Ищи Запуздырить в трей
← →
DimOk © (2007-08-29 09:47) [2]
> Я ожидал в другой ветке :) Ищи Запуздырить в трей
Оригинально...... :)
← →
Человек (2007-08-29 09:50) [3]abfComponents ищи
← →
DimOk © (2007-08-29 09:52) [4]
> abfComponents ищи
А без этого....?
← →
alshtam © (2007-08-29 09:53) [5]function TaskBarAddIcon(hWindow: THandle; ID: Cardinal;
ICON: hicon; CallbackMessage: Cardinal; Tip: string): Boolean;
var
NID: TNotifyIconData;
begin
FillChar(NID, SizeOf(TNotifyIconData), 0);
with NID do
begin
cbSize := SizeOf(TNotifyIconData);
Wnd := hWindow;
uID := ID;
uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP;
uCallbackMessage := CallbackMessage;
hIcon := Icon;
if Length(Tip) > 63 then
SetLength(Tip, 63);
StrPCopy(szTip, Tip);
end;
Result := Shell_NotifyIcon(NIM_ADD, @NID);
end;
← →
DimOk © (2007-08-29 09:54) [6]
> alshtam
Спасибо :)
← →
DimOk © (2007-08-29 10:06) [7]
> NID: TNotifyIconData;
[Error] MainFormUnit.pas(535): Undeclared identifier: "TNotifyIconData"
На этапе компиляции
← →
Anatoly Podgoretsky © (2007-08-29 10:08) [8]Ну наконец то, а то я думал, что с выходом Д2006 эти вопросы канули в небытие.
← →
DimOk © (2007-08-29 10:08) [9]
> abfComponents ищи
Нашел, скачал, установил. Спасибо :)
← →
Сергей М. © (2007-08-29 10:08) [10]
> как программу свернуть в системный трей
Никак.
> Undeclared identifier: "TNotifyIconData"
uses ShellAPI
← →
DimOk © (2007-08-29 10:09) [11]
> Ну наконец то, а то я думал, что с выходом Д2006 эти вопросы
> канули в небытие.
Delphi 7 :)
← →
DimOk © (2007-08-29 10:10) [12]
> Никак.
[5]
← →
Rouse_ © (2007-08-29 10:15) [13]
> DimOk © (29.08.07 10:10) [12]
>
> > Никак.
>
> [5]
Этот код не сворачивает программу в системный трей :)
← →
@!!ex © (2007-08-29 10:16) [14]
unit TrayUnit;
interface
uses
Windows, Messages;
const
WM_IconMessage=WM_User;
var
Handle:integer=0;
procedure TrayCreate(const i,N:string);overload;
procedure TrayModify(const i,N:string);overload;
procedure TrayCreate(I:integer;const N:string);overload;
procedure TrayModify(I:integer;const N:string);overload;
procedure TrayDelete;
implementation
uses ShellAPI;
function StrCopy(Dest: PChar; const Source: PChar): PChar; assembler;
asm
PUSH EDI
PUSH ESI
MOV ESI,EAX
MOV EDI,EDX
MOV ECX,0FFFFFFFFH
XOR AL,AL
REPNE SCASB
NOT ECX
MOV EDI,ESI
MOV ESI,EDX
MOV EDX,ECX
MOV EAX,EDI
SHR ECX,2
REP MOVSD
MOV ECX,EDX
AND ECX,3
REP MOVSB
POP ESI
POP EDI
end;
var
nid: TNotifyIconData;
procedure TrayCreate(I:integer;const N:string);
begin
nid.cbSize := sizeof (nid);
nid.wnd := Handle;
nid.uID := 1; // icon ID
nid.uCallBAckMessage := WM_IconMessage;
nid.hIcon := LoadIcon(HInstance,MakeIntResource(I));
strcopy (nid.szTip, PChar(N));
nid.uFlags := 7;
Shell_NotifyIcon (0, @nid);
end;
procedure TrayModify(I:integer;const N:string);
begin
nid.hIcon := LoadIcon(HInstance,MakeIntResource(I));;
strcopy (nid.szTip, PChar(N));
nid.uFlags := 6;
if Shell_NotifyIcon(1, @nid) then
TrayCreate(i,N);
end;
procedure TrayCreate(const i,N:string);
begin
nid.cbSize := sizeof (nid);
nid.wnd := Handle;
nid.uID := 1; // icon ID
nid.uCallBAckMessage := WM_IconMessage;
nid.hIcon := LoadIcon(HInstance,PChar(I));
strcopy (nid.szTip, PChar(N));
nid.uFlags := 7;
Shell_NotifyIcon (0, @nid);
end;
procedure TrayModify(const i,N:string);
begin
nid.hIcon := LoadIcon(HInstance,PChar(I));;
strcopy (nid.szTip, PChar(N));
nid.uFlags := 6;
if Shell_NotifyIcon(1, @nid) then
TrayCreate(i,N);
end;
procedure TrayDelete;
begin
nid.uFlags := 0;
Shell_NotifyIcon (2, @nid);
end;
end.
Это модуль для запуздыривания иконки туда, где часики.
Для того, чтобы работать с ним, нужно в одной из форм прописать:
TRayUnit.Handle:=Form.Handle;
указанная форма будет получать сообщения, которые будут генериться иконкой в трее.
Не забывай удалять иконки в конце работы, иначе после закрытия иконка останется в трее и умрети только при наведении мыши(иконка также будет умирать, если не указать окно для приема сообщение).
Вот это будет обрабатывать сообщения иконки:
procedure WMICON(var msg:TMessage);
У меня обработка выглядит так:
procedure TQuestionForm.WMICON(var msg: TMessage);
var
Point:TPoint;
begin
if (Msg.LParam=WM_LBUTTONDOWN) or (Msg.LParam=WM_RBUTTONDOWN) then
begin
GetCursorPos(Point);
PopupMenu1.Popup(Point.x,Point.y);
end;
end;
P.S.
забыл сказать, в качестве иконок используется те, что находяться в ресурсах exe шникак.
Функцию для открытия иконки из файла напишешь сам, если оно тебе надо, лично я с такой необходимостью не встречался.
message WM_User;
← →
@!!ex © (2007-08-29 10:17) [15]P.P.S.
Действительно. И мой код тоже не сворачивает приложение в трей.
Он лишь позволяет создать в трее иконку.
А уж куда ты будешь сворачивать приложение, это твое дело, трэй тут ни при чем.
← →
DimOk © (2007-08-29 10:19) [16]Всем большое спасибо, буду переваривать :)
← →
DimOk © (2007-08-29 10:21) [17]
> Он лишь позволяет создать в трее иконку.
> А уж куда ты будешь сворачивать приложение, это твое дело,
> трэй тут ни при чем.
Я это понял. Окно достаточно скрывать по определенному событию..
← →
DimOk © (2007-08-29 10:22) [18]Хотя abfComponents на все 200% делает этузадачу и многие другие, как я уже вижу :)
← →
@!!ex © (2007-08-29 10:23) [19]Упс. Косяк в моем сообщении.
Правильно так:
Вот это будет обрабатывать сообщения иконки:procedure WMICON(var msg:TMessage);
message WM_User;
У меня обработка выглядит так:procedure TQuestionForm.WMICON(var msg: TMessage);
var
Point:TPoint;
begin
if (Msg.LParam=WM_LBUTTONDOWN) or (Msg.LParam=WM_RBUTTONDOWN) then
begin
GetCursorPos(Point);
PopupMenu1.Popup(Point.x,Point.y);
end;
end;
P.S.
забыл сказать, в качестве иконок используется те, что находяться в ресурсах exe шникак.
Функцию для открытия иконки из файла напишешь сам, если оно тебе надо, лично я с такой необходимостью не встречался.
← →
@!!ex © (2007-08-29 10:24) [20]> [18] DimOk © (29.08.07 10:22)
Компонеты - путь ламеров. ИМХО ИМХО ИМХО ИМХО ИМХО
Что будешь делать, есть у проги не будет формы? Скажем все на WinAPI.
← →
Человек (2007-08-29 10:28) [21]
> @!!ex © (29.08.07 10:24) [20]
Видимо у него форма есть :)
← →
DimOk © (2007-08-29 10:31) [22]
> Компонеты - путь ламеров. ИМХО ИМХО ИМХО ИМХО ИМХО
> Что будешь делать, есть у проги не будет формы? Скажем все
> на WinAPI.
Я понимаю, поэтому мне интересны все варианты, спасибо за помощь.
Компоненты - это как MathCad Умного делает умнее, а глупого глупее.... :)
Я думаю их стоит использовать с достаточно большим занием методик программирования. Но есть простые задачи, для решения которых нет необходимости использовать WinAPI и раздувать код программы.
← →
DimOk © (2007-08-29 10:32) [23]
> Видимо у него форма есть :)
А как ты догадался :)
← →
@!!ex © (2007-08-29 10:34) [24]> Но есть простые задачи, для решения которых нет необходимости
> использовать WinAPI и раздувать код программы.
Бугага. ЛОл.
← →
DimOk © (2007-08-29 10:34) [25]К стати я сейчас вспомнил, что скачивал программу DesctopFire там есть реализация функций связанных с системным трейем. Надо посмотреть исходник :)
← →
DimOk © (2007-08-29 10:44) [26]Вот код:
//////////////////////////////////////////////////////////////////
/////////////////// tray icons ///////////////////////////////////
//////////////////////////////////////////////////////////////////
function AddTrayIcon(wHandle : THandle; Const IconName, Hint : String;
PopupMenuStrings : array of String;
TrayEventProc : TTrayEventProc = nil): Boolean;
Var n,m,i,c : Integer;
s : String;
begin
TrayIcon.cbSize := SizeOf(TrayIcon);
TrayIcon.Wnd := wHandle;
TrayIcon.uID := 100;
TrayIcon.uFlags := NIF_MESSAGE + NIF_ICON + NIF_TIP;
TrayIcon.uCallbackMessage := WM_MYTRAYMSG;
TrayIcon.hIcon :=LoadIcon(hInstance, PChar(IconName));
Move(PChar(Hint)^,TrayIcon.szTip,Length(Hint));
TrayEnabled:=Shell_NotifyIcon(NIM_ADD,@TrayIcon);
Result:=TrayEnabled;
TrayProc:=TrayEventProc;
MItemCount:=Length(PopupMenuStrings);
If (TrayEnabled) and (MItemCount>0) then begin
PopupMenu:=CreatePopupMenu;
SetLength(MenuKeys,MItemCount);
i:=0;
For n:=0 to MItemCount-1 do begin
MenuKeys[n]:=0;
If PopupMenuStrings[n]="-" then AppendMenu(PopupMenu,MF_SEPARATOR,0,nil)
else begin
s:=PopupMenuStrings[n]; m:=Pos("[",s);
If m<>0 then begin
Val(Copy(s,m+1,Length(s)-m-1),MenuKeys[n],c);
// MenuKeys[n]:=Str_2Num(Copy(s,m+1,Length(s)-m-1));
Delete(s,m,Length(s)-m+1);
end;
AppendMenu(PopupMenu,0,n,PChar(s));
Inc(i);
end;
end;
end;
end;
Надеюсь автор не будет предъявлять претензий, эту прогу я скачивал из роздела "Статьи" этого сайта.
← →
DrPass © (2007-08-29 10:52) [27]
> Ну наконец то, а то я думал, что с выходом Д2006 эти вопросы
> канули в небытие
Все равно надо кончать на месте и афтаров этих вопросов, и тех, кто им дает правильные ответы - за вред, который они наносят эволюции человечества
← →
DimOk © (2007-08-29 10:56) [28]
> Все равно надо кончать на месте и афтаров этих вопросов,
> и тех, кто им дает правильные ответы - за вред, который
> они наносят эволюции человечества
А пояснить можно......?
← →
Человек (2007-08-29 11:00) [29]
> DimOk © (29.08.07 10:56) [28]
</I
> А пояснить можно......?
>
Не обращай внимания
← →
Gydvin © (2007-08-29 11:02) [30]
> А пояснить можно......?
Гугл рулит. Только на этом форуме, пока я тут нахожусь (2 или 3 года) этот вопрос задают как минимум раз в две недели. А по всем тырнету...
Все дело в ДНК.
← →
DimOk © (2007-08-29 11:05) [31]
> Гугл рулит. Только на этом форуме, пока я тут нахожусь (2
> или 3 года) этот вопрос задают как минимум раз в две недели.
> А по всем тырнету...
> Все дело в ДНК.
Просто кто не заметил эта ветка форума называется "Начинающим" :)
> Не обращай внимания
Да я просто интересуюсь, может быть этот вопрос даже к этой категории не относится :)
← →
Gydvin © (2007-08-29 11:09) [32]Причем здесь ветка "Начинающим"?
Смотри.
http://www.google.ru/search?hl=ru&newwindow=1&q=%D1%81%D0%BA%D1%80%D1%8B%D1%82%D1%8C+%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D1%83+%D0%B2+%D1%82%D1%80%D0%B5%D0%B9+delphi&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA&lr=
← →
Anatoly Podgoretsky © (2007-08-29 11:09) [33]
> Видимо у него форма есть :)
У него нет Д2006
← →
DimOk © (2007-08-29 11:11) [34]
> procedure TrayModify(I:integer;const N:string);
> begin
> nid.hIcon := LoadIcon(HInstance,MakeIntResource(I));;
> strcopy (nid.szTip, PChar(N));
> nid.uFlags := 6;
> if Shell_NotifyIcon(1, @nid) then
> TrayCreate(i,N);
> end;
>
> procedure TrayCreate(const i,N:string);
> begin
> nid.cbSize := sizeof (nid);
> nid.wnd := Handle;
> nid.uID := 1; // icon ID
> nid.uCallBAckMessage := WM_IconMessage;
> nid.hIcon := LoadIcon(HInstance,PChar(I));
> strcopy (nid.szTip, PChar(N));
> nid.uFlags := 7;
> Shell_NotifyIcon (0, @nid);
> end;
>
> procedure TrayModify(const i,N:string);
> begin
> nid.hIcon := LoadIcon(HInstance,PChar(I));;
> strcopy (nid.szTip, PChar(N));
> nid.uFlags := 6;
> if Shell_NotifyIcon(1, @nid) then
> TrayCreate(i,N);
> end;
В чем разница...?
← →
DimOk © (2007-08-29 11:12) [35]
> У него нет Д2006
Да у меня D7 и Windows хрюша.
← →
@!!ex © (2007-08-29 11:12) [36]> В чем разница...?
В коде? :))
← →
DimOk © (2007-08-29 11:16) [37]
> В коде? :))
Может быть дурацкий вопрос, но не вижу..... :)
← →
@!!ex © (2007-08-29 11:18) [38]> [37] DimOk © (29.08.07 11:16)
А получше посмотреть?
← →
@!!ex © (2007-08-29 11:20) [39]i - идентефиактор иконки
N - Строка, которая выводить при наведении мыши на иконку.
С практической стоорны разница в том, что в одном случае иконка выбираеться по номеру, во втором - по названию.
← →
DimOk © (2007-08-29 11:30) [40]
> nid.hIcon := LoadIcon(HInstance,MakeIntResource(I));;
> nid.hIcon := LoadIcon(HInstance,PChar(I));;
Все понял, извеняюсь просмотрел
← →
DimOk © (2007-08-29 11:34) [41]
> Причем здесь ветка "Начинающим"?
> Смотри.
> http://www.google.ru/search?hl=ru&newwindow=1&q=%D1%81%D0%BA%D1%80%D1%8B%D1%82%D1%8C+%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D1%83+%D0%B2+%D1%82%D1%80%D0%B5%D0%B9+delphi&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA&lr=
Может быть я так и делал, и нашел я www.delphimaster.ru. Кроме того попросите админа что бы добавил баннер (основной) - "ПО ВОПРОСАМ СВЯЗАННЫХ С СИСТЕМНЫМ ТРЕЙЕМ НЕ ВХОДИТЬ. УБЪЕТ!" или что то другое..... :))
← →
DimOk © (2007-08-29 12:18) [42]
> procedure WMICON(var msg:TMessage);
> message WM_User;
Иконка рисуется, но событий ни каких нет.....
← →
Anatoly Podgoretsky © (2007-08-29 12:52) [43]
> Кроме того попросите админа что бы добавил баннер (основной)
> - "ПО ВОПРОСАМ СВЯЗАННЫХ С СИСТЕМНЫМ ТРЕЙЕМ НЕ ВХОДИТЬ.
> УБЪЕТ!" или что то другое..... :))
Ну еще из-за этого беспокоить администратора, с этим мы и сами справимся.
← →
DimOk © (2007-08-29 12:55) [44]
> Ну еще из-за этого беспокоить администратора, с этим мы
> и сами справимся.
Дерзайте, удачи :))
← →
@!!ex © (2007-08-29 13:36) [45]> Иконка рисуется, но событий ни каких нет.....
Хэндл формы присвоить не забыл?
← →
DimOk © (2007-08-29 14:49) [46]
> Хэндл формы присвоить не забыл?
Unit2.Handle := Form1.Handle;
← →
DimOk © (2007-08-29 14:55) [47]Можно еще вопрос не совсем в тему. Как зделать так что бы пр сворачивании форма скрывалась и не отображалась на панели?
← →
@!!ex © (2007-08-29 16:01) [48]> [47] DimOk © (29.08.07 14:55)
ShowWindow(Application.Handle, SW_HIDE);
← →
DVM © (2007-08-29 16:22) [49]Системный трей - это все окно панели задач. Поэтому, чтобы свернуть окно в "трей" очевидно достаточно нажать кнопку минимизации окна.
То место где часики - это область уведомлений трея, но никак не сам трей.
← →
Anatoly Podgoretsky © (2007-08-29 16:23) [50]> DVM (29.08.2007 16:22:49) [49]
Это так, только в друзьях согласья нет.
← →
DimOk © (2007-08-29 16:35) [51]
> Системный трей - это все окно панели задач. Поэтому, чтобы
> свернуть окно в "трей" очевидно достаточно нажать кнопку
> минимизации окна.
>
> То место где часики - это область уведомлений трея, но никак
> не сам трей.
Я поражон Вашими знаниями..... :)) Спасибо что помогли....
← →
DimOk © (2007-08-29 16:37) [52]
> ShowWindow(Application.Handle, SW_HIDE);
Понятно, а событие OnMinimize есть то у формы, что то я не нашел....
← →
{RASkov} © (2007-08-29 16:43) [53]> [52] DimOk © (29.08.07 16:37)
> Понятно, а событие OnMinimize есть то у формы, что то я
> не нашел....
Поищи его у Application...
← →
DimOk © (2007-08-29 16:48) [54]
> Поищи его у Application...
Ok. спасибо
← →
DVM © (2007-08-29 16:48) [55]
> DimOk © (29.08.07 16:35) [51]
> Я поражон Вашими знаниями
MSDN читай - будешь такой же умный.
← →
DimOk © (2007-08-29 16:56) [56]
> MSDN читай - будешь такой же умный.
Вах-вах-вах. На форум иду за помощью не из-за того что мне влом читать MSDN, а из-за того что мне непонятны некоторые вещи которые там написаны...
к примеру читал про дерективу overload, так и ни чего не понял, так что наверное таким умным мне и не быть......:)
← →
DVM © (2007-08-29 17:00) [57]
> к примеру читал про дерективу overload, так и ни чего не
> понял
Прискорбно, что могу сказать. Тем более, что в MSDN про паскалевский overload нет ни строчки :)
← →
{RASkov} © (2007-08-29 17:00) [58]> [56] DimOk © (29.08.07 16:56)
> к примеру читал про дерективу overload
На МСДН? Т.е. про делфевую overload на MSDN?
← →
Anatoly Podgoretsky © (2007-08-29 17:02) [59]
> читал про дерективу overload
Капитан, никогда ты не станешь майором.
← →
DimOk © (2007-08-29 17:02) [60]
> > к примеру читал про дерективу overload, так и ни чего
> не
> > понял
>
> Прискорбно, что могу сказать. Тем более, что в MSDN про
> паскалевский overload нет ни строчки :)
> <Цитата>
>
>
> {RASkov} © (29.08.07 17:00) [58]
> > [56] DimOk © (29.08.07 16:56)
> > к примеру читал про дерективу overload
>
> На МСДН? Т.е. про делфевую overload на MSDN?
Ну лоханулся, ну и что.... я же себя в грудь не бью, что я мол........ :)
← →
DimOk © (2007-08-29 17:08) [61]
> Капитан, никогда ты не станешь майором.
Славо Богу что не сержант.... :)
← →
DimOk © (2007-08-29 17:11) [62]MSDN я снес вместе с VisualStudio. Диски найду и поставлю себе. Может быть перестану тогда задовать глупые вопросы :)
← →
DVM © (2007-08-29 17:14) [63]
> MSDN я снес вместе с VisualStudio
Кусочек у тебя все равно остался - тот что в справке Delphi. Его достаточно на 90% случаев. Он просто устаревший немного.
← →
DimOk © (2007-08-29 17:18) [64]
> Кусочек у тебя все равно остался - тот что в справке Delphi.
> Его достаточно на 90% случаев. Он просто устаревший немного.
>
Это который Windows SDK? или MS SDK Help Files?
← →
DVM © (2007-08-29 17:20) [65]Тот который в меню Delphi: Help - > Windows SDK
← →
iXT © (2007-08-29 17:24) [66]А еще в инете можно сразу читать, не ставя себе ничего.
← →
DimOk © (2007-08-29 17:25) [67]
> Тот который в меню Delphi: Help - > Windows SDK
Спасибо, буду теперь знать и почаще в него заглядывать, всем спасибо за помощь!
← →
TStas © (2007-08-29 23:36) [68]У Розыча на сайте есть компонент, который сворачивает в трей, притом с прибамбасами какими-то. Компонент реально хороший, но с одним глюком: поднимает исключение зря. А вот адрес сайта Розыча я забыл. :(
← →
Германн © (2007-08-30 01:20) [69]
> TStas © (29.08.07 23:36) [68]
>
> У Розыча на сайте есть компонент, который сворачивает в
> трей, притом с прибамбасами какими-то. Компонент реально
> хороший, но с одним глюком: поднимает исключение зря. А
> вот адрес сайта Розыча я забыл. :(
>
А он его и не прячет. Как был в анкете, так и до сих пор есть. Токмо Розычу, имхо, лень было возиться с недавней путаницей с анкетами и у него сейчас немного другой ник Rouse_ :) Анкета тут http://www.delphimaster.ru/cgi-bin/anketa.pl?id=1084946849
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.09.23;
Скачать: [xml.tar.bz2];
Память: 0.64 MB
Время: 0.045 c