//在Form的OnCreate事件中注册 WM_TASKBARCREATED 消息,并在托盘区添加图标
WM_TASKBARCREATED=RegisterWindowMessage("TaskbarCreated");
lIconMessage=RegisterWindowMessage("IconNotify");
//添加图标
void TForm2::AddTrayIcon()
{
NOTIFYICONDATA IconData={0}; //结构体,包含系统需要的用来传递托盘区域消息的信息
IconData.cbSize=sizeof(NOTIFYICONDATA); //结构体的大小
IconData.hWnd=this->Handle; //窗口的句柄
IconData.uID=0; //应用程序定义的任务栏图标的标识符
IconData.uFlags=NIF_INFO | NIF_ICON | NIF_TIP | NIF_MESSAGE; //此成员表明具体哪些其他成员为合法数据
IconData.hIcon=Application->Icon->Handle; //hIcon成员起作用
lstrcpy(IconData.szTip,TEXT("http://www.cnblogs.com/missu")); //指向一个以\0结束的字符串的指针
IconData.uCallbackMessage=lIconMessage; //应用程序定义的消息标示
Shell_NotifyIcon(NIM_ADD,&IconData); //此函数用来向任务栏托盘区域发送消息,nim-add向托盘添加图标
}
修改图标
void TForm2::ModifyTrayIcon() //修改图标,在切换时
{
NOTIFYICONDATA IconData={0};
IconData.cbSize=sizeof(NOTIFYICONDATA);
IconData.hWnd=this->Handle;
IconData.uID=0;
IconData.uFlags=NIF_INFO | NIF_ICON | NIF_TIP | NIF_MESSAGE; //
IconData.hIcon=Application->Icon->Handle;
//-----------------------------------------------------------------------
lstrcpy(IconData.szTip,TEXT("http://www.cnblogs.com/missu"));
lstrcpy(IconData.szInfoTitle,TEXT("欢迎访问笔下有余的博客")); //这2行为跳出信息
lstrcpy(IconData.szInfo,TEXT("欢迎访问笔下有余的博客"));
//-----------------------------------------------------------------------
IconData.uTimeout=0.5;// 泡泡停留时间 10-30自动消除
IconData.dwState=NIS_SHAREDICON; //图标的状态,隐藏或共享NIS_HIDDEN
IconData.dwStateMask=0; //指明dwState成员的那些位可以被设置或者访问
IconData.dwInfoFlags=1; //添加Title图标 , 设置此成员用来给气球提示框增加一个图标 1为info
IconData.uCallbackMessage=lIconMessage;
Shell_NotifyIcon(NIM_MODIFY,&IconData);
}
//删除图标
void TForm2::RemoveTrayIcon() {
NOTIFYICONDATA icondata;
memset(&icondata,0,sizeof(icondata));
icondata.cbSize=sizeof(icondata);
icondata.hWnd=this->Handle;
Shell_NotifyIcon(NIM_DELETE,&icondata);
}
//结合应用程序最小化时候的图标操作
void __fastcall TForm2::ApplicationEvents1Minimize(TObject *Sender) //最小化时候
{ //applicationevent组件,与系统挂钩,执行minimize程序
if(bHide)
{
ShowWindow(Application->Handle,SW_SHOW);
SendMessage(Application->Handle,WM_SYSCOMMAND,SC_RESTORE,0);
bHide=false;
}
else
{
ShowWindow(Application->Handle,SW_HIDE);
SendMessage(Application->Handle,WM_SYSCOMMAND,SC_MINIMIZE,0);
ModifyTrayIcon();
bHide=true;
}
}
//其他
void __fastcall TForm2::WndProc(Messages::TMessage& Message)
{ //重载WndProc,响应系统消息
if(Message.Msg==lIconMessage)
{
if(Message.LParam==WM_LBUTTONDBLCLK) //双击图标的事件
{
if(bHide)
{
ShowWindow(Application->Handle,SW_SHOW); //该函数设置指定窗口的显示状态
SendMessage(Application->Handle,WM_SYSCOMMAND,SC_RESTORE,0); //该函数将指定的消息发送到一个或多个窗口
bHide=false; //设置图标状态 SC_RESTORE是恢复状态
}
else
{
ShowWindow(Application->Handle,SW_HIDE);
SendMessage(Application->Handle,WM_SYSCOMMAND,SC_MINIMIZE,0);
ModifyTrayIcon(); //当最小化时
bHide=true;
}
}
if(Message.LParam==WM_RBUTTONDOWN)
{
TPoint pos;
GetCursorPos(&pos);
this->PopupMenu2->Popup(pos.x,pos.y);
//小图标popup
}
}
if(Message.Msg==WM_TASKBARCREATED) //任务栏重建消息
{
AddTrayIcon(); //重新添加图标
}
TForm::WndProc(Message);//对于其他的消息,调用基础类的WndProc函数让Windows进行缺省处理。
}
//popup
void __fastcall TForm2::PopupMenu2Popup(TObject *Sender)
{
SetForegroundWindow(this->Handle);
}
浙公网安备 33010602011771号