First define new constants:
Const
NIF_INFO = $ 10;
NIM_SETVERSION = $ 00000004;
Notifyicon_version = 3;
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;
{The above column may not be complete, if it is not defined, you can find the platformsdk / include / shellapi.h in VC7 in VS.NET}
Available in a SYSTRAYICON back message:
TRAY_CALLBACK = WM_USER $ 7258;
Then define a new Notifyicondata structure (in Type):
Type
PNEWNOTIFYICONDATA = ^ TNEWNOTIFYICONDATA;
TDummyunionName = Record
Case Integer of
0: (utimeout: uint);
1: (Uversion: UINT);
END;
TNEWNOTICONDATA = Record
CBSIZE: DWORD;
Wnd: hwnd;
Uid: uint;
Uflags: uint;
UcallbackMessage: uint;
Hicon: Hicon;
Sztip: array [0..127] of char; // version 5.0 is 128, formerly 64
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;
Declare a global variable:
VAR
Icondata: TNEWNOTIFYICONDATA;
Then transfer to the topic, the following process is used to add SYSTRAYICON:
PROCEDURE ADDSYSTRAYICON;
Begin
IconData.cbsize: = sizeof (icondata);
ICondata.Wnd: = allocatehwnd (Systrayiconmsghandler); //self.handle; {systrayiconmsghandler is the message processing process defined later.
Icondata.uid: = 0;
IconData.uflags: = nif_icon or nif_message or nif_tip;
IconData.ucallbackMessage: = tray_callback; // Custom Rehabilitation Message
ICondata.hicon: = image1.picture.icon.handle; // This is an icon of Handleicondata.sztip: = 'please send me email.';
IF not shell_notifyicon (nim_add, @icondata) THEN
ShowMessage ('add fail');
END;
There is another process to display Balloon Tips:
Procedure 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;
TIPTITE: =
'Happyjoe@21cn.com';
Strplcopy (iconder.szinfotitle, tiptitle, sizeof (icondata.szinfotitle) - 1);
Icondata.dwinfoflags: = niif_info; // niif_error; // niif_warning;
Shell_Notifyicon (Nim_Modify, @icondata);
// The following code is actually useless, you can remove it (at least now)
IconData.dummyunionName.uversion: = notifyicon_version;
IF not shell_notifyicon (nim_setversion, @icondata) THEN
ShowMessage ('setversion fail');
END;
Don't forget to delete the process:
Procedure deletesystrayicon;
Begin
DeallocatehWnd (icondata.wnd);
IF not shell_notifyicon (nim_delete, @icondata) THEN
ShowMessage ('Delete Fail');
END;
There is also an important link --- message processing:
statement:
Procedure Systrayiconmsghandler (Var Msg: TMESSAGE); Message Tray_Callback;
definition:
Procedure Systrayiconmsghandler (Var Msg: TMessage);
Begin
Case msg.lparam of
WM_MOUSEMOVE:;
WM_LBUTTONDOWN:;
WM_LBUTTONUP:;
WM_LBUTTONDBLCLK:;
WM_RBUTTONDOWN:;
WM_RBUTTONUP:;
WM_RBUTTONDBLCLK:;
// The following is a new message
Nin_balloonshow: {Perform {when the Balloon TIPS pops up}
ShowMessage ('nin_balloonshow');
NIN_BALLOONHIDE: {When the Balloon TIPS disappears (for example, SYSTRAYICON is deleted), but the specified Timeout time or the mouse clicks on the disappearance of the balloon tips does not send this message} showMessage ('nin_balloonhide');
Nin_balloontimeout: {When the timeout time of the balloon tiPs is executed}
ShowMessage ('nin_balloontimeout');
NIN_BalloonUserClick: {Perform it when the mouse click on Balloon TIPS. Note: There is a closed button on the Balloon TIPS when XP is executed, and the balloon tips has been displayed (icholda.dummyunionName.utimeout: = 3000; this sentence is not used, my test is like this), if the mouse Point will receive a nin_balloontimeout message on the button. }
ShowMessage ('nin_balloonuserclick ";
END;
END;
Ok, the code is finished. I was also asked for a post to ask how to force the SYSTRAYICON TIPS. Now it seems to be executed as long as ShowballoontIPS (to assign the new domain in the structure, execute the NIM_MODIFY action). I don't know if I have answered my question. ^ _ ^
The new feature requires IE5.0 or above, I have passed the test under Win2000, XP Delphi 6.0. There is no 98 / me in the hand, I don't know if it can. (Finish)