Конференция "WinAPI" » Балон над TRxTrayIcon [D6, WinXP]
 
  • leonidus (25.05.08 18:28) [0]
    Код который использую для того чтобы поместить иконку в трей и вывести нал дей балон с сообщением:

    unit Unit1;

    interface

    uses
     Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

    const
     NIF_INFO = $10;
     NIF_MESSAGE = 1;
     NIF_ICON = 2;
     NOTIFYICON_VERSION = 3;
     NIF_TIP = 4;
     NIM_SETVERSION = $00000004;
     NIM_SETFOCUS = $00000003;
     NIIF_INFO = $00000001;
     NIIF_WARNING = $00000002;
     NIIF_ERROR = $00000003;

     NIN_BALLOONSHOW = WM_USER + 2;
     NIN_BALLOONHIDE = WM_USER + 3;
     NIN_BALLOONTIMEOUT = WM_USER + 4;
     NIN_BALLOONUSERCLICK = WM_USER + 5;
     NIN_SELECT = WM_USER + 0;
     NINF_KEY = $1;
     NIN_KEYSELECT = NIN_SELECT or NINF_KEY;
     
     TRAY_CALLBACK = WM_USER + $7258;

    type
     PNewNotifyIconData = ^TNewNotifyIconData;
     TDUMMYUNIONNAME    = record
       case Integer of
         0: (uTimeout: UINT);
         1: (uVersion: UINT);
     end;

     TNewNotifyIconData = record
       cbSize: DWORD;
       Wnd: HWND;
       uID: UINT;
       uFlags: UINT;
       uCallbackMessage: UINT;
       hIcon: HICON;
      //Version 5.0 is 128 chars, old ver is 64 chars
       szTip: array [0..127] of Char;
       dwState: DWORD; //Version 5.0
       dwStateMask: DWORD; //Version 5.0
       szInfo: array [0..255] of Char; //Version 5.0
       DUMMYUNIONNAME: TDUMMYUNIONNAME;
       szInfoTitle: array [0..63] of Char; //Version 5.0
       dwInfoFlags: DWORD;   //Version 5.0
     end;

    type
     TForm1 = class(TForm)
       procedure FormCreate(Sender: TObject);
       procedure FormDestroy(Sender: TObject);
     private
       IconData: TNewNotifyIconData;
       procedure SysTrayIconMsgHandler(var Msg: TMessage); message TRAY_CALLBACK;
       procedure AddSysTrayIcon;
       procedure ShowBalloonTips;
       procedure DeleteSysTrayIcon;
     public
     end;

    var
     Form1: TForm1;

    implementation

    {$R *.DFM}

    uses ShellAPI;

    procedure TForm1.SysTrayIconMsgHandler(var Msg: TMessage);
    begin
     case Msg.lParam of
       WM_MOUSEMOVE:;
       WM_LBUTTONDOWN:;
       WM_LBUTTONUP:;
       WM_LBUTTONDBLCLK:;
       WM_RBUTTONDOWN:;
       WM_RBUTTONUP:;
       WM_RBUTTONDBLCLK:;
       //followed by the new messages
       NIN_BALLOONSHOW:
       {Sent when the balloon is shown}
         ShowMessage('NIN_BALLOONSHOW');
       NIN_BALLOONHIDE:
       {Sent when the balloon disappears?Rwhen the icon is deleted,
       for example. This message is not sent if the balloon is dismissed because of
       a timeout or mouse click by the user. }
         ShowMessage('NIN_BALLOONHIDE');
       NIN_BALLOONTIMEOUT:
       {Sent when the balloon is dismissed because of a timeout.}
         ShowMessage('NIN_BALLOONTIMEOUT');
       NIN_BALLOONUSERCLICK:
       {Sent when the balloon is dismissed because the user clicked the mouse.
       Note: in XP there's Close button on he balloon tips, when click the button,
       send NIN_BALLOONTIMEOUT message actually.}
         ShowMessage('NIN_BALLOONUSERCLICK');
     end;
    end;

    procedure TForm1.AddSysTrayIcon;
    begin
     IconData.cbSize := SizeOf(IconData);
     IconData.Wnd := AllocateHWnd(SysTrayIconMsgHandler);
     {SysTrayIconMsgHandler is then callback message' handler}
     IconData.uID := 0;
     IconData.uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
     IconData.uCallbackMessage := TRAY_CALLBACK;   //user defined callback message
     IconData.hIcon := Application.Icon.Handle;    //an Icon's Handle
     IconData.szTip := 'Please send me email.';
     if not Shell_NotifyIcon(NIM_ADD, @IconData) then
       ShowMessage('add fail');
    end;

    procedure TForm1.ShowBalloonTips;
    var
     TipInfo, TipTitle: string;
    begin
     IconData.cbSize := SizeOf(IconData);
     IconData.uFlags := NIF_INFO;
     TipInfo := 'Please send me email.';
     strPLCopy(IconData.szInfo, TipInfo, SizeOf(IconData.szInfo) - 1);
     IconData.DUMMYUNIONNAME.uTimeout := 3000;
     TipTitle := 'Happyjoe@21cn.com';
     strPLCopy(IconData.szInfoTitle, TipTitle, SizeOf(IconData.szInfoTitle) - 1);
     IconData.dwInfoFlags := NIIF_INFO;     //NIIF_ERROR;  //NIIF_WARNING;
     Shell_NotifyIcon(NIM_MODIFY, @IconData);
     {in my testing, the following code has no use}
     IconData.DUMMYUNIONNAME.uVersion := NOTIFYICON_VERSION;
     if not Shell_NotifyIcon(NIM_SETVERSION, @IconData) then
       ShowMessage('setversion fail');
    end;

    procedure TForm1.DeleteSysTrayIcon;
    begin
     DeallocateHWnd(IconData.Wnd);
     if not Shell_NotifyIcon(NIM_DELETE, @IconData) then
       ShowMessage('delete fail');
    end;

    procedure TForm1.FormCreate(Sender: TObject);
    begin
     AddSysTrayIcon;
     ShowBalloonTips;
    end;

    procedure TForm1.FormDestroy(Sender: TObject);
    begin
     DeleteSysTrayIcon;
    end;
    end.

    Код не мой, но работает отлично.

    Теперь встала задача поместить в трей иконку используя TRxTrayIcon и так же вывести дан дим балон, но как не бился ничего не выходит, где грабли?
  • Palladin © (26.05.08 16:00) [1]
    грабли в том, что RXTrayIcon их не поддерживает
  • leonidus (26.05.08 23:30) [2]
    т.е. тогда один выход - вручную помещать иконку в трей или все же можно что-то придумать?
  • Германн © (27.05.08 01:18) [3]

    > leonidus   (26.05.08 23:30) [2]
    >
    > т.е. тогда один выход - вручную помещать иконку в трей или
    > все же можно что-то придумать?
    >

    У тебя есть работающий (по твоим словам) код. Зачем тебе TRxTrayIcon? Он нужен только тем, кто не может сам написать код для иконки в трее.

    Или у тебя есть чужой код [0], в котором ты не можешь разобраться, чтобы что-то изменить в нём. И есть TRxTrayIcon, в котором ты можешь изменить что-то тебе нужное (в Инспекторе объектов), но там нет BaloonHint?
  • leonidus (27.05.08 16:40) [4]
    Как я и написал выше код не мой и как вы правильно заметили я в нем разобраться не могу, потому и хочу "скрестить" его и TRxTrayIcon.
 
Конференция "WinAPI" » Балон над TRxTrayIcon [D6, WinXP]
Есть новые Нет новых   [134433   +22][b:0][p:0]