Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.044 c
15-1187794005
lookin
2007-08-22 18:46
2007.09.23
MAC-адрес сетевой карты


2-1188366012
@!!ex
2007-08-29 09:40
2007.09.23
Как установить иконку на приложение?


15-1187846202
Ega23
2007-08-23 09:16
2007.09.23
Для тех, кто в курсе


2-1188216211
Первокласник Вася
2007-08-27 16:03
2007.09.23
Копирование файлов


6-1170063963
Ural_angel
2007-01-29 12:46
2007.09.23
Обработка исключений в Socket





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский