unit uBladder;interface uses Messages,Windows,ShellApi,Forms,SysUtils;
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; {other constants can be found in vs.net---vc7's dir: PlatformSDK\Include\ShellAPI.h} {define the callback message} TRAY_CALLBACK = WM_USER + $7258; {new NotifyIconData structure definition} 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 TBladder = Class(TObject) private FTimeOut : Integer; IconData : TNewNotifyIconData;
procedure SysTrayIconMsgHandler(var Msg: TMessage); message TRAY_CALLBACK; function AddSysTrayIcon(const AHIcon : HWND):Boolean; function DeleteSysTrayIcon:Boolean; public constructor Create(const AHIcon : HWND;const ATimeOut : Integer);overload; destructor Destroy;override; function ShowBalloonTips(const ATipTitle,ATipInfo : WideString):Boolean;
End;
implementation{ TBladder }Function TBladder.AddSysTrayIcon(const AHIcon : HWND) : Boolean; 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 := AHIcon;//Application.Icon.Handle; //an Icon's Handle IconData.szTip := 'TBladder.Title'; Result := Shell_NotifyIcon(NIM_ADD, @IconData); end;constructor TBladder.Create(const AHIcon: HWND;const ATimeOut : Integer); begin AddSysTrayIcon(AHIcon); FTimeOut := ATimeOut; end;function TBladder.DeleteSysTrayIcon:Boolean; begin DeallocateHWnd(IconData.Wnd); Result := Shell_NotifyIcon(NIM_DELETE, @IconData); end;destructor TBladder.Destroy; begin DeleteSysTrayIcon; inherited; end;function TBladder.ShowBalloonTips(const ATipTitle, ATipInfo: WideString):Boolean; begin IconData.cbSize := SizeOf(IconData); IconData.uFlags := NIF_INFO; strPLCopy(IconData.szInfo, ATipInfo, SizeOf(IconData.szInfo) - 1); IconData.DUMMYUNIONNAME.uTimeout := FTimeOut;//3000; strPLCopy(IconData.szInfoTitle, ATipTitle, 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; Result := Shell_NotifyIcon(NIM_SETVERSION, @IconData);
end;procedure TBladder.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} 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. } NIN_BALLOONTIMEOUT:; {Sent when the balloon is dismissed because of a timeout.} 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.} end; end;end. ======================================= 最好不要用第三方控件
http://download.csdn.net/source/1123364
uses Messages,Windows,ShellApi,Forms,SysUtils;
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; {other constants can be found in vs.net---vc7's dir: PlatformSDK\Include\ShellAPI.h} {define the callback message}
TRAY_CALLBACK = WM_USER + $7258; {new NotifyIconData structure definition}
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
TBladder = Class(TObject) private
FTimeOut : Integer;
IconData : TNewNotifyIconData;
procedure SysTrayIconMsgHandler(var Msg: TMessage); message TRAY_CALLBACK;
function AddSysTrayIcon(const AHIcon : HWND):Boolean;
function DeleteSysTrayIcon:Boolean; public
constructor Create(const AHIcon : HWND;const ATimeOut : Integer);overload;
destructor Destroy;override; function ShowBalloonTips(const ATipTitle,ATipInfo : WideString):Boolean;
End;
implementation{ TBladder }Function TBladder.AddSysTrayIcon(const AHIcon : HWND) : Boolean;
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 := AHIcon;//Application.Icon.Handle; //an Icon's Handle
IconData.szTip := 'TBladder.Title';
Result := Shell_NotifyIcon(NIM_ADD, @IconData);
end;constructor TBladder.Create(const AHIcon: HWND;const ATimeOut : Integer);
begin
AddSysTrayIcon(AHIcon);
FTimeOut := ATimeOut;
end;function TBladder.DeleteSysTrayIcon:Boolean;
begin
DeallocateHWnd(IconData.Wnd);
Result := Shell_NotifyIcon(NIM_DELETE, @IconData);
end;destructor TBladder.Destroy;
begin
DeleteSysTrayIcon;
inherited;
end;function TBladder.ShowBalloonTips(const ATipTitle, ATipInfo: WideString):Boolean;
begin
IconData.cbSize := SizeOf(IconData);
IconData.uFlags := NIF_INFO;
strPLCopy(IconData.szInfo, ATipInfo, SizeOf(IconData.szInfo) - 1);
IconData.DUMMYUNIONNAME.uTimeout := FTimeOut;//3000;
strPLCopy(IconData.szInfoTitle, ATipTitle, 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;
Result := Shell_NotifyIcon(NIM_SETVERSION, @IconData);
end;procedure TBladder.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}
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. }
NIN_BALLOONTIMEOUT:;
{Sent when the balloon is dismissed because of a timeout.}
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.}
end;
end;end.
=======================================
最好不要用第三方控件
如果你想功能强大一点的汽泡提示功能,可以参考使用cooltrayicon
用现成的控件比较方便和可靠。
还有一些能在按钮或者LABEL上生成气泡提示的,代码在网上很多。