-
Код который использую для того чтобы поместить иконку в трей и вывести нал дей балон с сообщением:
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 и так же вывести дан дим балон, но как не бился ничего не выходит, где грабли?
-
грабли в том, что RXTrayIcon их не поддерживает
-
т.е. тогда один выход - вручную помещать иконку в трей или все же можно что-то придумать?
-
> leonidus (26.05.08 23:30) [2] > > т.е. тогда один выход - вручную помещать иконку в трей или > все же можно что-то придумать? >
У тебя есть работающий (по твоим словам) код. Зачем тебе TRxTrayIcon? Он нужен только тем, кто не может сам написать код для иконки в трее.
Или у тебя есть чужой код [0], в котором ты не можешь разобраться, чтобы что-то изменить в нём. И есть TRxTrayIcon, в котором ты можешь изменить что-то тебе нужное (в Инспекторе объектов), но там нет BaloonHint?
-
Как я и написал выше код не мой и как вы правильно заметили я в нем разобраться не могу, потому и хочу "скрестить" его и TRxTrayIcon.
|