1.创建菜单资源 ID: IDR_MENU_NOTIFY
添加子菜单 显示 IDM_NOTIFY_SHOW
退出 IDM_NOTIFY_CLOSE
2.认识一个API
Shell_NotifyIcon
BOOL Shell_NotifyIcon( //向系统托盘中加入图标
DWORD dwMessage, //状态
PNOTIFYICONDATA lpdata //含有图标 消息响应 的一个结构体
);
3.认识NOTIFYICONDATA 结构体:
typedef struct _NOTIFYICONDATA {
DWORD cbSize; //结构体自身大小
HWND hWnd; //托盘的父窗口 托盘发出的消息由哪一个窗口响应
UINT uID; //显示图标的ID
UINT uFlags; //托盘的状态 (如有图标,有气泡提示,有消息响应等)
UINT uCallbackMessage; //托盘事件的消息响应函数
HICON hIcon; //图标的变量
TCHAR szTip[64]; //气泡的显示文字
DWORD dwState; //图标的显示状态
DWORD dwStateMask; //图标的显示状态
TCHAR szInfo[256]; //气泡的显示文字 (可以忽略)
union {
UINT uTimeout;
UINT uVersion;
};
TCHAR szInfoTitle[64];
DWORD dwInfoFlags;
GUID guidItem;
HICON hBalloonIcon;
} NOTIFYICONDATA, *PNOTIFYICONDATA;
4.在oninitdialog函数中写入加入系统脱盘的代码:
nid.cbSize = sizeof(nid); //大小赋值
nid.hWnd = m_hWnd; //父窗口
nid.uID = IDR_MAINFRAME; //icon ID
nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; //托盘所拥有的状态
nid.uCallbackMessage = UM_ICONNOTIFY; //回调消息
nid.hIcon = m_hIcon; //icon 变量
CString str="PCRemote远程协助软件........."; //气泡提示
lstrcpyn(nid.szTip, (LPCSTR)str, sizeof(nid.szTip) / sizeof(nid.szTip[0]));
Shell_NotifyIcon(NIM_ADD, &nid); //显示托盘
5.运行 ,在窗口销毁时托盘依然存在
6.添加WM_CLOSE消息并写入代码:
Shell_NotifyIcon(NIM_DELETE, &nid); //销毁图标
7.stdafx.h文件中加入自定义消息的定义
//自定义消息
enum
{
UM_ICONNOTIFY= WM_USER+0x100,
};
8.声明消息处理函数:
afx_msg void OnIconNotify(WPARAM wParam,LPARAM lParam);
9. cpp文件中写入代码:
void CPCRemoteDlg::OnIconNotify(WPARAM wParam, LPARAM lParam)
{
switch ((UINT)lParam)
{
case WM_LBUTTONDOWN: // click or dbclick left button on icon
case WM_LBUTTONDBLCLK: // should show desktop
if (!IsWindowVisible())
ShowWindow(SW_SHOW);
else
ShowWindow(SW_HIDE);
break;
case WM_RBUTTONDOWN: // click right button, show menu
CMenu menu;
menu.LoadMenu(IDR_MENU_NOTIFY);
CPoint point;
GetCursorPos(&point);
SetForegroundWindow();
menu.GetSubMenu(0)->TrackPopupMenu(
TPM_LEFTBUTTON|TPM_RIGHTBUTTON,
point.x, point.y, this, NULL);
PostMessage(WM_USER, 0, 0);
break;
}
}
10.添加消息响应:
ON_MESSAGE(UM_ICONNOTIFY, (LRESULT (__thiscall CWnd::* )(WPARAM,LPARAM))OnIconNotify)
11.添加显示菜单消息响应
void CPcRemoteDlg::OnClose()
{
// TODO: 在此添加消息处理程序代码和/或调用默认值 点击界面关闭时响应函数
//Shell_NotifyIcon(NIM_DELETE, &nid); //销毁图标
//
if (!IsWindowVisible())
ShowWindow(SW_SHOW);
else
ShowWindow(SW_HIDE);
return;
}
void CPcRemoteDlg::OnNotifyClose()
{
// TODO: 在此添加命令处理程序代码
OnDestroy();
Shell_NotifyIcon(NIM_DELETE, &nid); //销毁图标
}
void CPcRemoteDlg::OnNotifyShow()
{
// TODO: 在此添加命令处理程序代码
ShowWindow(SW_SHOW);
}
12:运行结果:
总结:还存在问题,退出后,该程序进程你并没有关闭
本节附带代码(项目为止所有代码):
https://download.csdn.net/download/sunjikui1255326447/11172714