功能来源:本人实现开启自己开发的应用程序或者在用户点击应用程序的关闭按钮来实现最小化到系统托盘,并且要求弹出气泡通知而且能够支持鼠标点击功能。
首先, 确定一下我们是在win32平台使用vs2015+C++语言进行开发,在确定了编译平台以及语言环境我们就可以着手准备查找技术资料。
第一部:
接下来,我们查找关于win32技术的资料一般推荐MSDN官网技术文档,因为MSDN技术文档是目前为止最准确的技术资料,我们来看看下面两个技术链接为我们提供了关于 NOTIFYICONDATA结构体相关的说明,
- https://msdn.microsoft.com/en-us/library/ms910625.aspx
- https://docs.microsoft.com/en-us/windows/desktop/api/shellapi/ns-shellapi-_notifyicondataa
其中文献1的 文档说明比较早,是在2005年写的, 对于现在的我们来说比较过时了,而文献2的文档说明正是我们所需要找的资料,那我们就来简单分析一下相关的结构体的各个成员变量含义吧(注:参照相关文档解释)!
typedef struct _NOTIFYICONDATAA {
DWORD cbSize;
HWND hWnd;
UINT uID;
UINT uFlags;
UINT uCallbackMessage;
HICON hIcon;
CHAR szTip[64];
CHAR szTip[128];
DWORD dwState;
DWORD dwStateMask;
CHAR szInfo[256];
union {
UINT uTimeout;
UINT uVersion;
} DUMMYUNIONNAME;
CHAR szInfoTitle[64];
DWORD dwInfoFlags;
GUID guidItem;
HICON hBalloonIcon;
} NOTIFYICONDATAA, *PNOTIFYICONDATAA;
DWORD cbSize:
cbSize标识着该结构体的大小,用来确定包含哪些成员变量;不过,好多程序开发人员直接使用sizeof(NOTIFYICONDATA)给该成员赋值会有一定的潜在危险,下文会有相应的代码贴出:
/*
@brief 根据系统自带的动态库来获取关于系统的版本号
*/
ULONGLONG __GetVersion(LPCTSTR lpszDllName)
{
HINSTANCE hinstDll;
ULONGLONG dwVersion = 0;
hinstDll = LoadLibrary(lpszDllName);
if (hinstDll)
{
DLLGETVERSIONPROC pDllGetVersion;
pDllGetVersion = (DLLGETVERSIONPROC)GetProcAddress(hinstDll, "DllGetVersion");
if (pDllGetVersion)
{
DLLVERSIONINFO dvi;
HRESULT hr;
ZeroMemory(&dvi, sizeof(dvi));
dvi.cbSize = sizeof(dvi);
hr = (*pDllGetVersion)(&dvi);
if (SUCCEEDED(hr))
{
dwVersion = MAKEDLLVERULL(dvi.dwMajorVersion, dvi.dwMinorVersion,
dvi.dwBuildNumber, dvi.dwPlatformID);
}
}
FreeLibrary(hinstDll);
}
return dwVersion;
}
/*
@brief 确定NOTIFYICONDATA结构体的大小
*/
DWORD __GetSizeNotifyIconData()
{
TCHAR lpszDllName[128];
GetWindowsDirectory(lpszDllName, _TRUNCATE);
_tcsncat_s(lpszDllName, __T("\\System32\\Shell32.dll"), _TRUNCATE);
ULONGLONG NIDdllVer = __GetVersion(lpszDllName);
// before windows 2000
if (NIDdllVer < MAKEDLLVERULL(5, 0, 0, 0)) {
return NOTIFYICONDATA_V1_SIZE;
}
// Windows 2000
else if (NIDdllVer < MAKEDLLVERULL(6, 0, 0, 0)) {
return NOTIFYICONDATA_V2_SIZE;
}
// Windows XP or 2003
else if (NIDdllVer < MAKEDLLVERULL(6, 0, 6000, 0)) {
return NOTIFYICONDATA_V3_SIZE;
}
// Windows Vista and later
else {
return sizeof(NOTIFYICONDATA);
}
}
HWND hWnd
hWnd标识窗口的句柄。标示的窗口用来接收与托盘图标相关的消息。Shell_NotifyIcon函数调用时,hWnd和uID成员用来标示具体要操作的图标。
UINT uID
uID应用程序定义的任务栏图标的标识符,hWnd和uID成员用来标示具体要操作的图标。
UINT uFlags
此成员表明具体哪些其他成员为合法数据(即哪些成员起作用)。此成员可以为以下值的组合:
NIF_ICON:hIcon成员起作用,NIF_MESSAGE:uCallbackMessage成员起作用。NIF_TIP:szTip成员起作用。
NIF_STAT:dwState和dwStateMask成员起作用;NIF_INFO:使用气球提示代替普通的工具提示框。szInfo, uTimeout, szInfoTitle和dwInfoFlags成员起作用。
NIF_GUID:保留。
UINT uCallbackMessage
uCallbackMessage:应用程序定义的消息标示。当托盘图标区域发生鼠标事件或者使用键盘选择或激活图标时,系统将使用此标示向由hWnd成员标示的窗口发送消息。消息响应函数的wParam参数标示了消息事件发生的任务栏图标,lParam参数根据事件的不同,包含了鼠标或键盘的具体消息,例如当鼠标指针移过托盘图标时,lParam将为WM_MOUSEMOVE。
HICON hIcon
hIcon:增加、修改或删除的图标的句柄。注意,windows不同版本对于图标有不同要求。Windows XP可支持32位。
CHAR szTip[64]