一、隐藏程序的主窗口
并不在任务栏上出现任务按钮,需设置主边框窗口的风格
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
cs.style = WS_POPUP;//隐藏主窗口
cs.dwExStyle |= WS_EX_TOOLWINDOW;//隐藏任务按钮
return CFrameWnd::PreCreateWindow(cs);
}
二、托盘程序
![ContractedBlock.gif](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
头文件:
NOTIFYICONDATA nd;
LONG OnNotifyIcon(WPARAM wParam, LPARAM lParam);
cpp文件:
#define WM_NOTIFYICON WM_USER+5 // 托盘消息
ON_MESSAGE(WM_NOTIFYICON, OnNotifyIcon) // 托盘消息处理
ON_COMMAND(ID_RELOGIN, OnReLogin) // 菜单响应函数
ON_COMMAND(ID_CALL, OnCall)
在BOOL CTrayDemoDlg::OnInitDialog()中:
// 添加托盘图标
nd.cbSize = sizeof (NOTIFYICONDATA);
nd.hWnd = m_hWnd;
nd.uID = IDR_MAINFRAME;
nd.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
nd.uCallbackMessage = WM_NOTIFYICON;
nd.hIcon = m_hIcon;
lstrcpy(nd.szTip, L " 托盘项目提示 " );
Shell_NotifyIcon(NIM_ADD, & nd); // 添加托盘图标
// 托盘消息:菜单及鼠标动作
LONG CTrayDemoDlg::OnNotifyIcon(WPARAM wParam, LPARAM lParam)
{
// wParam中是响应消息的图标ID,lParam中则是Windows的消息
switch ( lParam )
{
case WM_LBUTTONDOWN:
case WM_RBUTTONDOWN: // 响应在托盘图标上的单击
{
CMenu pMenu;
if (pMenu.LoadMenu(IDR_TRAYMENU)) // 用户在托盘图标上单击鼠标右键,弹出菜单
{
CMenu * pPopup = pMenu.GetSubMenu( 0 );
ASSERT(pPopup != NULL);
CPoint Point;
if (IsIconic())
{
pPopup -> EnableMenuItem(ID_RELOGIN,MF_BYCOMMAND | MF_ENABLED );
pPopup -> EnableMenuItem(ID_CALL,MF_BYCOMMAND | MF_ENABLED );
// pPopup->EnableMenuItem(ID_CALL,MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
}
// 确定鼠标位置以便在该位置附近显示菜单
GetCursorPos( & Point );
SetForegroundWindow();
pPopup -> TrackPopupMenu(
TPM_LEFTALIGN | TPM_RIGHTBUTTON,
Point.x, Point.y, this );
}
}
break ;
case WM_LBUTTONDBLCLK: // 托盘双击
OnReLogin();
break ;
}
return 0 ;
}
// 隐藏对话框并任务栏图标
void CTrayDemoDlg::OnBnClickedQuit()
{
ShowWindow(SW_HIDE);
}
三、托盘数据结构
typedef struct _NOTIFYICONDATA
{
DWORD cbSize; //结构长度,单位:bit,一般用(DWORD)sizeof(NOTIFYICONDATA)
HWND hWnd; //窗口句柄,对托盘图标操作消息所传递的窗口,一般是this->m_hWnd
UINT uID; //图标ID
UINT uFlags; //有效标志,NIF_ICON标识hIcon有效,NIF_MESSAGE标识uCallbackMessage,NIF_TIP标识szTip
UINT uCallbackMessage; //自定义消息,处理托盘操作
HICON hIcon; //图标,一般是m_hIcon; 如果只知道uID,一般会用LoadIcon(AfxGetInstanceHandle(),MAKEINTERSOURCE(IDR_MAINFRAME))
char szTip[64]; //托盘提示文字
}NOTIFYICONDATA, *PNOTIFYICONDATA;
四、托盘消息
绘制图标及其他操作传递消息的系统函数:
WINSHELLAPI BOOL WINAPI Shell_NotifyIcon(DWORD dwMessage,PNOTIFYICONDATA pnid);
pnid是NOTIFYICONDATA结构指针,dwMessage是被传递的消息
消息有:
NIM_ADD | 修改图标 |
NIM_DELETE | 删除图标 |
NIM_MODIFY | 修改图标 |
程序退出时删除图标:
::Shell_NotifyIcon(NIM_DELETE, &m_tnid);