Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.12.28;
Скачать: CL | DM;

Вниз

иконка в трее без форм   Найти похожие ветки 

 
AHTOLLlKA   (2008-11-10 12:55) [0]

подскажите люди добрые...
как засунуть иконку в трей, не используя в uses forms
??????


 
Сергей М. ©   (2008-11-10 13:01) [1]


> не используя в uses forms


Чем он тебе помешал ?


 
AHTOLLlKA   (2008-11-10 13:07) [2]

он помешал весом... нет смысла носить 400кб с собой думаю.. если будеттолько иконка с попапами например..


 
Сергей М. ©   (2008-11-10 13:10) [3]

см. Shell_NotifyIcon()


 
AHTOLLlKA   (2008-11-10 13:19) [4]

нет, ну я понимаю чем и как оно делаеться, но оно привязано к форме!!!!!!!
я и прошу помочь как сделать без формы... читайте пожалуйста внимательней...


 
Поросенок Винни-Пух ©   (2008-11-10 13:23) [5]

ни к какой форме оно не привязано


 
Сергей М. ©   (2008-11-10 13:24) [6]


> оно привязано к форме


Не привязано, не выдумывай.


 
AHTOLLlKA   (2008-11-10 13:25) [7]

procedure TForm1.WMTRAYICONNOTIFY(var Msg: TMessage);
begin
{обрабатываем события на иконке в трее}
case Msg.LParam of
WM_LBUTTONDOWN: Form1.Visible:=true;
WM_LBUTTONDBLCLK: {ваш код обработки события двойного нажатия на левую кнопку мыши}
WM_LBUTTONUP: {ваш код обработки события отпускания левой кнопки мыши}

WM_RBUTTONDOWN: {ваш код}
WM_RBUTTONDBLCLK: {ваш код}
WM_RBUTTONUP: {ваш код}

WM_MOUSEMOVE: {ваш код}
end;
end;

таже оброботка событий...


 
Поросенок Винни-Пух ©   (2008-11-10 13:26) [8]

здесь привязно. а вообще не привязано.


 
Поросенок Винни-Пух ©   (2008-11-10 13:28) [9]

если бы было привязано к форме, то у шеллнотифайикон был бы параметр - экземпляр формы. а его нет.


 
AHTOLLlKA   (2008-11-10 13:33) [10]

можешь показать как это ?


 
brother ©   (2008-11-10 13:34) [11]

(х(х_х)х)


 
Поросенок Винни-Пух ©   (2008-11-10 13:34) [12]

нужно окно для обработки сообщений иконы. а окно это не обязательно форма, а значит и forms.pas


 
Сергей М. ©   (2008-11-10 13:36) [13]


> AHTOLLlKA   (10.11.08 13:25) [7]


Ты справку к этой ф-ции проштудировал ?
Где ты там увидел хоть какое-либо упоминание о форме ?


 
AHTOLLlKA   (2008-11-10 13:37) [14]

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


 
AHTOLLlKA   (2008-11-10 13:38) [15]


> > AHTOLLlKA   (10.11.08 13:25) [7]Ты справку к этой ф-ции
> проштудировал ?Где ты там увидел хоть какое-либо упоминание
> о форме ?

я про обработку событий..


 
Сергей М. ©   (2008-11-10 13:39) [16]


> AHTOLLlKA   (10.11.08 13:37) [14]


Вот и показывай с чувством, с толком, с расстановкой, как ты пытался и что при этом не получается..


 
Поросенок Винни-Пух ©   (2008-11-10 13:39) [17]

пытался как то к окну привязать написанному на апи.. не получаеться..

надо пробовать еще раз


 
Сергей М. ©   (2008-11-10 13:41) [18]


> я про обработку событий


Событие в этом случае - это факт получения оконного сообщения.
Прежде чем получать какие-то сообщения, надо чтобы существовало окно.
Какие меры ты принял для этого ?


 
AHTOLLlKA   (2008-11-10 13:47) [19]

program APIForm;
uses
 Windows, Messages,ShellApi;
const
 TITLE = "Cамый простой пример API формы без всего";
WM_NOTIFYTRAYICON = WM_USER + 1;

var
 h_Wnd  : HWND;
 tray: TNotifyIconData;

function WndProc(hWnd: HWND; Msg: UINT;  wParam: WPARAM;  lParam:
LPARAM): LRESULT; stdcall;
begin
 case (Msg) of
   WM_CREATE:
     begin { а здесь могло бы быть то что выполняется при старте проги }
     end;
   WM_CLOSE:
     begin
       PostQuitMessage(0);
       Result := 0
     end;
   else
     Result := DefWindowProc(hWnd, Msg, wParam, lParam);
 end;
end;

function APIFormC(Width, Height : Integer ) : Boolean;
var
 wndClass : TWndClass;         { Window class }
 dwStyle ,                     { Window styles }
 dwExStyle : DWORD;            { Extended window styles }
 h_Instance : HINST;           { Current instance }
begin
 h_Instance := GetModuleHandle(nil);     { Grab An Instance For Our
Window }
 with wndClass do                    { Set up the window class }
 begin
   style         := CS_HREDRAW or    { Redraws entire window if length
changes }
                    CS_VREDRAW or    { Redraws entire window if height
changes }
                    CS_OWNDC;        { Unique device context for the
window }
   lpfnWndProc   := @WndProc;        { Set the window procedure to our
func WndProc }
   hInstance     := h_Instance;
   hCursor       := LoadCursor(0, IDC_ARROW);
   hbrBackground := COLOR_WINDOW; { стандартный цвет окна(можно так
445566 (RGB), или просто clred (красный) ) }
   lpszClassName := "APIForm";
 end;
 RegisterClass(wndClass);
 dwStyle := WS_OVERLAPPEDWINDOW; { форма с кнопками  вверху }
 dwExStyle := WS_EX_APPWINDOW;   { форма со значком приложения в углу }
 h_Wnd := CreateWindowEx(dwExStyle,     { Extended window styles }

                         "APIForm",     { Class name }
                         TITLE,         { Window title (caption) }
                         dwStyle,      { Window styles }
                         0, 0,          { позиция окна(левый верхний
угол) }
                         Width, Height, { Размеры Width и Heught
соответственно }
                         0,             { No parent window }
                         0,             { No menu }
                         h_Instance,    { Instance }
                         nil);          { Pass nothing to WM_CREATE }
 if h_Wnd = 0 then
 begin
   MessageBox(0, "Не могу создать окно!", "Ошибка", MB_OK or
MB_ICONERROR);
   Result := False;
   Exit;
 end;
 ShowWindow(h_Wnd, SW_SHOW);
 SetForegroundWindow(h_Wnd);
 SetFocus(h_Wnd);
 Result := True;
end;

function WinMain(hInstance : HINST; hPrevInstance : HINST;
                lpCmdLine : PChar; nCmdShow : Integer) : Integer; stdcall;
var
 msg : TMsg;
 finished : Boolean;
begin
with tray do begin
cbSize := SizeOf(TNotifyIconData);

uID := 1;
uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
uCallBackMessage := WM_NOTIFYTRAYICON;

szTip := ("Это мое приложение в трее");
end;
Shell_NotifyIcon(NIM_ADD, Addr(tray));

 Finished := False;
 APIFormC( 400, 200 );  { ширина и высота }

 while not finished do
 begin
   if (PeekMessage(msg, 0, 0, 0, PM_REMOVE)) then { Check if there is a
message for this window }
   begin

     if (msg.message = WM_QUIT) then     { If WM_QUIT message received
then we are done }
       finished := True
     else begin                              { Else translate and
dispatch the message to this window }
      TranslateMessage(msg);
       DispatchMessage(msg);
     end;
   end;
 end;
 Result := msg.wParam;

end;

begin

 WinMain( hInstance, hPrevInst, CmdLine, CmdShow );
  with tray do begin
cbSize := SizeOf(TNotifyIconData);

uID := 1;
uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
uCallBackMessage := WM_NOTIFYTRAYICON;

szTip := ("Это мое приложение в трее");
end;
Shell_NotifyIcon(NIM_ADD, Addr(tray));

end.


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


 
AHTOLLlKA   (2008-11-10 13:49) [20]

with tray do
begin
cbSize := sizeof(TNotifyIconData);
uID := 0;
uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
uCallBackMessage := WM_NOTIFYTRAYICON;
hIcon := LoadIcon(0, IDI_ASTERISK);
szTip := ("My Resident");
end;
Shell_NotifyIcon(NIM_ADD, @tray);


иконка появляеца и изчезает... (


 
Сергей М. ©   (2008-11-10 13:52) [21]


> иконку пока не могу прикрутить.


А где собственно попытки "прикручивания" ?

Ты привел просто некий чужой код, для изучения и понимания каждой строчки которого ты нге сделал никаких умственных усилий и телодвижений


 
AndreyV ©   (2008-11-10 13:53) [22]

Сообщения в цикле обрабатывай в WinProc


 
AndreyV ©   (2008-11-10 13:56) [23]

> [22] AndreyV ©   (10.11.08 13:53)

Пардон. Не туда посмотрел.


 
Сергей М. ©   (2008-11-10 13:59) [24]


> AHTOLLlKA   (10.11.08 13:49) [20]


Где обработка сообщений иконки ?
Тобой обрабатываются только WM_CREATE и WM_CLOSE ..


 
AHTOLLlKA   (2008-11-10 14:00) [25]

program APIForm;
uses
 Windows, Messages,ShellApi,Graphics;
const
 TITLE = "Cамый простой пример API формы без всего";
WM_NOTIFYTRAYICON = WM_USER + 1;

var
 h_Wnd  : HWND;
 tray: TNotifyIconData;
 TrayIcon: TIcon;

function WndProc(hWnd: HWND; Msg: UINT;  wParam: WPARAM;  lParam:
LPARAM): LRESULT; stdcall;
begin
 case (Msg) of
   WM_CREATE:
     begin { а здесь могло бы быть то что выполняется при старте проги }
     end;
   WM_CLOSE:
     begin
       PostQuitMessage(0);
       Result := 0
     end;

WM_LBUTTONDOWN:
begin
{ а здесь могло бы быть то что выполняется при старте проги }
end;

WM_LBUTTONDBLCLK:
begin
{ а здесь могло бы быть то что выполняется при старте проги }
end;

WM_LBUTTONUP:
begin
{ а здесь могло бы быть то что выполняется при старте проги }
end;

WM_RBUTTONDOWN:
begin
{ а здесь могло бы быть то что выполняется при старте проги }
end;

WM_RBUTTONDBLCLK:
begin
{ а здесь могло бы быть то что выполняется при старте проги }
end;

WM_RBUTTONUP:
begin
{ а здесь могло бы быть то что выполняется при старте проги }
end;

WM_MOUSEMOVE:
begin
messagebox(0,"test","test",0);
end;

   else
     Result := DefWindowProc(hWnd, Msg, wParam, lParam);
 end;
end;

function APIFormC(Width, Height : Integer ) : Boolean;
var
 wndClass : TWndClass;         { Window class }
 dwStyle ,                     { Window styles }
 dwExStyle : DWORD;            { Extended window styles }
 h_Instance : HINST;           { Current instance }
begin
 h_Instance := GetModuleHandle(nil);     { Grab An Instance For Our
Window }
 with wndClass do                    { Set up the window class }
 begin
   style         := CS_HREDRAW or    { Redraws entire window if length
changes }
                    CS_VREDRAW or    { Redraws entire window if height
changes }
                    CS_OWNDC;        { Unique device context for the
window }
   lpfnWndProc   := @WndProc;        { Set the window procedure to our
func WndProc }
   hInstance     := h_Instance;
   hCursor       := LoadCursor(0, IDC_ARROW);
   hbrBackground := COLOR_WINDOW; { стандартный цвет окна(можно так
445566 (RGB), или просто clred (красный) ) }
   lpszClassName := "APIForm";
 end;
 RegisterClass(wndClass);
 dwStyle := WS_OVERLAPPEDWINDOW; { форма с кнопками  вверху }
 dwExStyle := WS_EX_APPWINDOW;   { форма со значком приложения в углу }
 h_Wnd := CreateWindowEx(dwExStyle,     { Extended window styles }

                         "APIForm",     { Class name }
                         TITLE,         { Window title (caption) }
                         dwStyle,      { Window styles }
                         0, 0,          { позиция окна(левый верхний
угол) }
                         Width, Height, { Размеры Width и Heught
соответственно }
                         0,             { No parent window }
                         0,             { No menu }
                         h_Instance,    { Instance }
                         nil);          { Pass nothing to WM_CREATE }
 if h_Wnd = 0 then
 begin
   MessageBox(0, "Не могу создать окно!", "Ошибка", MB_OK or
MB_ICONERROR);
   Result := False;
   Exit;
 end;
 ShowWindow(h_Wnd, SW_SHOW);
 SetForegroundWindow(h_Wnd);
 SetFocus(h_Wnd);
 Result := True;
end;

function WinMain(hInstance : HINST; hPrevInstance : HINST;
                lpCmdLine : PChar; nCmdShow : Integer) : Integer; stdcall;
var
 msg : TMsg;
 finished : Boolean;
begin

 Finished := False;
 APIFormC( 400, 200 );  { ширина и высота }

 while not finished do
 begin
   if (PeekMessage(msg, 0, 0, 0, PM_REMOVE)) then { Check if there is a
message for this window }
   begin

     if (msg.message = WM_QUIT) then     { If WM_QUIT message received
then we are done }
       finished := True
     else begin                              { Else translate and
dispatch the message to this window }
      TranslateMessage(msg);
       DispatchMessage(msg);
     end;
   end;
 end;
 Result := msg.wParam;

end;

begin

with tray do
begin
cbSize := sizeof(TNotifyIconData);
//wnd := mywnd;
uID := 0;
uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
uCallBackMessage := WM_NOTIFYTRAYICON;
hIcon := LoadIcon(0, IDI_ASTERISK);
szTip := ("My Resident");
end;
Shell_NotifyIcon(NIM_ADD, @tray);

WinMain( hInstance, hPrevInst, CmdLine, CmdShow );

end.


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


 
AHTOLLlKA   (2008-11-10 14:03) [26]

как то надо заставить обрабатывать только WM_NOTIFYTRAYICON
шевеление мышки и тд...
и иконка.. не могу понять почему изчезает при наведение...


 
Сергей М. ©   (2008-11-10 14:05) [27]


> обрабатываю так


Вижу обработку

WM_CREATE:
WM_CLOSE:
WM_LBUTTONDOWN:
WM_LBUTTONDBLCLK:
WM_LBUTTONUP:
WM_RBUTTONDOWN:
WM_RBUTTONDBLCLK:
WM_RBUTTONUP:
WM_MOUSEMOVE:

А обработку WM_NOTIFYTRAYICON в упор не вижу.

Где она у тебя ?


 
AHTOLLlKA   (2008-11-10 14:13) [28]

не понимаю...
тоесть окей, я ее если там добавлю.. что делать при ее обработке тогда ??

из-за этого пропадает иконка ??


 
@!!ex ©   (2008-11-10 14:16) [29]

> из-за этого пропадает иконка ??

Да. Винда не получает результата обработки и считает, что иконка сдохла.


 
Сергей М. ©   (2008-11-10 14:33) [30]


> я ее если там добавлю.. что делать при ее обработке тогда


Как минимум сформировать результат обработки.

Всё это (и многое-многое другое) следует делать ручками, раз ты отказался от forms.


 
AHTOLLlKA   (2008-11-10 14:44) [31]

многое.. понятно... а хоть что-нибудь подскажите что там обрабатывать...

и что делать при срабатывании сообщения


 
Поросенок Винни-Пух ©   (2008-11-10 14:46) [32]

и что делать при срабатывании сообщения

можно хрюкать при левом клике на иконке. а при правом клике на иконке можно собачий вальс проиграть.


 
AHTOLLlKA   (2008-11-10 14:48) [33]

дак я понять не могу как оставить ее на месте при наведении мышкой на неее (((((


 
Leonid Troyanovsky ©   (2008-11-10 14:48) [34]


> AHTOLLlKA   (10.11.08 14:44) [31]

> многое.. понятно... а хоть что-нибудь подскажите что там
> обрабатывать...

Читать msdn.
Это небольшая мзда за отказ от forms.

--
Regards, LVT.


 
Сергей М. ©   (2008-11-10 14:52) [35]


> что делать при срабатывании сообщения


WM_NOTIFYTRAYICON:
begin
  case lparam of
    WM_RBUTTONUP: ..
    WM_LBUTTONUP: ..
    WM_MOUSEMOVE:..
...
  end;
  Result := 0;
end;


 
Anatoly Podgoretsky ©   (2008-11-10 14:53) [36]

> Leonid Troyanovsky  (10.11.2008 14:48:34)  [34]

Это не мзда, это расплата за отказ.


 
Сергей М. ©   (2008-11-10 14:55) [37]


> AHTOLLlKA   (10.11.08 14:44) [31]


Бросай эту гнилую затею - так и будешь с протянутой рукой сюда ходить по каждому чиху)


 
AHTOLLlKA   (2008-11-10 15:01) [38]

program APIForm;
uses
 Windows, Messages,ShellApi,Graphics;

const
 TITLE = "11111111";
WM_NOTIFYTRAYICON = WM_USER + 1;

var
 h_Wnd  : HWND;
 tray: TNotifyIconData;
 TrayIcon: TIcon;

function WndProc(hWnd: HWND; Msg: UINT;  wParam: WPARAM;  lParam:
LPARAM): LRESULT; stdcall;
begin
 case (Msg) of
   WM_CREATE:
     begin { а здесь могло бы быть то что выполняется при старте проги }
     end;
   WM_CLOSE:
     begin
       PostQuitMessage(0);
       Result := 0
     end;

WM_NOTIFYTRAYICON:
begin
 case lparam of

WM_RBUTTONUP:
begin
//
end;

WM_LBUTTONUP:
begin
//
end;

WM_MOUSEMOVE:
begin
messagebox(0,"test","test",0);
end;

 end;
 Result := 0;
end;

{WM_LBUTTONDOWN:
begin
// а здесь могло бы быть то что выполняется при старте проги
end;

WM_LBUTTONDBLCLK:
begin
// а здесь могло бы быть то что выполняется при старте проги
end;

WM_LBUTTONUP:
begin
// а здесь могло бы быть то что выполняется при старте проги
end;

WM_RBUTTONDOWN:
begin
// а здесь могло бы быть то что выполняется при старте проги
end;

WM_RBUTTONDBLCLK:
begin
// а здесь могло бы быть то что выполняется при старте проги
end;

WM_RBUTTONUP:
begin
// а здесь могло бы быть то что выполняется при старте проги
end;

WM_MOUSEMOVE:
begin
messagebox(0,"test","test",0);
end;  }

   else
     Result := DefWindowProc(hWnd, Msg, wParam, lParam);
 end;
end;

function APIFormC(Width, Height : Integer ) : Boolean;
var
 wndClass : TWndClass;         { Window class }
 dwStyle ,                     { Window styles }
 dwExStyle : DWORD;            { Extended window styles }
 h_Instance : HINST;           { Current instance }
begin
 h_Instance := GetModuleHandle(nil);     { Grab An Instance For Our
Window }
 with wndClass do                    { Set up the window class }
 begin
   style         := CS_HREDRAW or    { Redraws entire window if length
changes }
                    CS_VREDRAW or    { Redraws entire window if height
changes }
                    CS_OWNDC;        { Unique device context for the
window }
   lpfnWndProc   := @WndProc;        { Set the window procedure to our
func WndProc }
   hInstance     := h_Instance;
   hCursor       := LoadCursor(0, IDC_ARROW);
   hbrBackground := COLOR_WINDOW; { стандартный цвет окна(можно так
445566 (RGB), или просто clred (красный) ) }
   lpszClassName := "APIForm";
 end;
 RegisterClass(wndClass);
 dwStyle := WS_OVERLAPPEDWINDOW; { форма с кнопками  вверху }
 dwExStyle := WS_EX_APPWINDOW;   { форма со значком приложения в углу }
 h_Wnd := CreateWindowEx(dwExStyle,     { Extended window styles }

                         "APIForm",     { Class name }
                         TITLE,         { Window title (caption) }
                         dwStyle,      { Window styles }
                         0, 0,          { позиция окна(левый верхний
угол) }
                         Width, Height, { Размеры Width и Heught
соответственно }
                         0,             { No parent window }
                         0,             { No menu }
                         h_Instance,    { Instance }
                         nil);          { Pass nothing to WM_CREATE }
 if h_Wnd = 0 then
 begin
   MessageBox(0, "Не могу создать окно!", "Ошибка", MB_OK or
MB_ICONERROR);
   Result := False;
   Exit;
 end;
 ShowWindow(h_Wnd, SW_SHOW);
 SetForegroundWindow(h_Wnd);
 SetFocus(h_Wnd);
 Result := True;
end;

function WinMain(hInstance : HINST; hPrevInstance : HINST;
                lpCmdLine : PChar; nCmdShow : Integer) : Integer; stdcall;
var
 msg : TMsg;
 finished : Boolean;
begin

 Finished := False;
 APIFormC( 400, 200 );  { ширина и высота }

 while not finished do
 begin
   if (PeekMessage(msg, 0, 0, 0, PM_REMOVE)) then { Check if there is a
message for this window }
   begin

     if (msg.message = WM_QUIT) then     { If WM_QUIT message received
then we are done }
       finished := True
     else begin                              { Else translate and
dispatch the message to this window }
      TranslateMessage(msg);
       DispatchMessage(msg);
     end;
   end;
 end;
 Result := msg.wParam;

end;

begin

with tray do
begin
cbSize := sizeof(TNotifyIconData);
wnd := h_Wnd;
uID := 0;
uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
uCallBackMessage := WM_NOTIFYTRAYICON;
hIcon := LoadIcon(0, IDI_ASTERISK);
szTip := ("My Resident");
end;
Shell_NotifyIcon(NIM_ADD, @tray);

WinMain( hInstance, hPrevInst, CmdLine, CmdShow );

end.


пока с протянутой... ога...
ну ткните в коде где ОНО почему изчезает все равно иконка в треее то...=(((


 
Сергей М. ©   (2008-11-10 15:08) [39]


> ткните в коде где ОНО


Его нет, понимаешь ? Совсем нет. То есть напрочь отсутствует.
Так что тыкать некуда.

А вот в [35] есть.
Дело за малым - самомтоятельно дотумкать, куда этот фрагмент приспособить.
Задачка для школьника)


> почему изчезает


Вот потому и исчезает.


 
AHTOLLlKA   (2008-11-10 15:10) [40]


> А вот в [35] есть.Дело за малым - самомтоятельно дотумкать,
>  куда этот фрагмент приспособить.Задачка для школьника)

дак я же добавил это в
function WndProc(hWnd: HWND; Msg: UINT;  wParam: WPARAM;  lParam:
LPARAM): LRESULT; stdcall


 
Сергей М. ©   (2008-11-10 15:18) [41]


> AHTOLLlKA   (10.11.08 15:10) [40]


Вот как ты отформатировал, так и видно что "добавил".

Рууи бы поотрывать за такое форматирование текста программы !

Ну так что, диал.окно "test" открывается при елозаньи мышью в области иконки ?


 
AHTOLLlKA   (2008-11-10 15:21) [42]

в том то и дело что нет (((

и так же изчезает ((


 
Сергей М. ©   (2008-11-10 15:30) [43]

потому что у тебя h_Wnd = 0


 
Sapersky   (2008-11-10 16:33) [44]

http://sapersky.narod.ru/files/TrayIcon.rar

Не знаю, поможет или наоборот усугубит... :)


 
AHTOLLlKA   (2008-11-11 07:50) [45]

Спасибо тебе большое Sapersky!!!
это то что нужно... сейчас буду сидеть разбираться!
всем кто помогал спасибо что уделили время


 
Юрий Зотов ©   (2008-11-15 13:01) [46]

До кучи. Писал когда-то этот пример, лет 100 назад. Может, снова кому-то пригодится.

program TrayWithoutVCL;

{$M 1024, 1024}

uses
 Windows,
 Messages,
 ShellAPI;

const
 AppName = "WinApiTrayApp";
 WM_TRAYMSG = WM_USER + 100;

var
 WndClass: TWndClassEx;
 WndHandle: HWND = 0;
 Msg: TMsg;
 IconData: TNotifyIconData;
 IconMenu: HMENU = 0;
 SecondIcon: HICON;

function WndFunc(Wnd, Msg: DWORD; wParam, lParam: integer): integer; stdcall;
var
 P: TPoint;
begin
 case Msg of
   WM_DESTROY, WM_QUERYENDSESSION:
     begin
       Result := Integer(Msg = WM_QUERYENDSESSION);
       PostQuitMessage(0)
     end;
   WM_TRAYMSG:
     begin
       Result := 0;
       if (lParam = WM_RBUTTONDOWN) and GetCursorPos(P) then
       begin
         SetForegroundWindow(Wnd);
         TrackPopupMenuEx(IconMenu, 0, P.X, P.Y, Wnd, nil);
         PostMessage(Wnd, WM_NULL, 0, 0)
       end
     end;
   WM_COMMAND:
     begin
       Result := 0;
       case wParam and $FFFF of
         0: begin
              if IconData.hIcon = SecondIcon then
                IconData.hIcon := WndClass.hIcon
              else
                IconData.hIcon := SecondIcon;
              Shell_NotifyIcon(NIM_MODIFY, @IconData)
            end;
         1: PostMessage(Wnd, WM_CLOSE, 0, 0)
       end
     end;
   else
     Result := DefWindowProc(Wnd, Msg, wParam, lParam)
 end
end;

{ -------------------------------------------------------------------------------------------- }

begin { main }
 with WndClass do
 begin
   cbSize := SizeOf(WndClass);
   Style := CS_HREDRAW or CS_VREDRAW ;
   lpfnWndProc := @WndFunc;
   hIcon := LoadIcon(0, IDI_EXCLAMATION);
   hCursor := LoadCursor(0, IDC_ARROW);
   hbrBackground := hBrush(COLOR_WINDOW);
   lpszMenuName := nil;
   lpszClassName := AppName;
   hIconSm := hIcon
 end;
 WndClass.hInstance := hInstance;
 if RegisterClassEx(WndClass) = 0 then
   Exit;
 WndHandle := CreateWindowEx(WS_EX_TOOLWINDOW, AppName, AppName, WS_OVERLAPPEDWINDOW, 0, 0, 0, 0, 0, 0, hInstance, nil);
 if WndHandle = 0 then
   Exit;
 with IconData do
 begin
   cbSize := SizeOf(IconData);
   Wnd:= WndHandle;
   uID := 100;
   uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP;
   uCallbackMessage := WM_TRAYMSG;
   hIcon:= WndClass.hIcon;
   szTip := AppName
 end;
 if Shell_NotifyIcon(NIM_ADD, @IconData) then
 try
   IconMenu := CreatePopupMenu;
   if IconMenu <> 0 then
   try
     if AppendMenu(IconMenu, MF_STRING, 0, "Сменить иконку") and
        AppendMenu(IconMenu, MF_STRING, 1, "Выход") then
     begin
       SecondIcon := LoadIcon(0, IDI_QUESTION);
       while GetMessage(Msg, 0, 0, 0) do
       begin
         TranslateMessage(Msg);
         DispatchMessage(Msg)
       end
     end
   finally
     DestroyMenu(IconMenu)
   end;
 finally
   Shell_NotifyIcon(NIM_DELETE, @IconData)
 end
end.


 
AHTOLLlKA   (2008-11-19 15:11) [47]

спасибо и вам Юрий!



Страницы: 1 2 вся ветка

Текущий архив: 2008.12.28;
Скачать: CL | DM;

Наверх




Память: 0.62 MB
Время: 0.015 c
15-1224145808
Kerk
2008-10-16 12:30
2008.12.28
MMP 24 октября


2-1226918959
BiT
2008-11-17 13:49
2008.12.28
Подскажите, пожалуйста, как скопировать определенный текст в memo


15-1222763889
Добегался...
2008-09-30 12:38
2008.12.28
UPDATE / INSERT в одном флаконе


15-1225297567
AlexDan
2008-10-29 19:26
2008.12.28
Округление к боьшему..


2-1227115460
june29
2008-11-19 20:24
2008.12.28
Проблеммы с компилятором