Форум: "Начинающим";
Текущий архив: 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));;
Все понял, извеняюсь просмотрел
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.09.23;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.041 c