Win32平台下NOTIFYICONDATA的气泡点击功能的响应与实现

 

      功能来源:本人实现开启自己开发的应用程序或者在用户点击应用程序的关闭按钮来实现最小化到系统托盘,并且要求弹出气泡通知而且能够支持鼠标点击功能。

      首先, 确定一下我们是在win32平台使用vs2015+C++语言进行开发,在确定了编译平台以及语言环境我们就可以着手准备查找技术资料。


第一部:     

      接下来,我们查找关于win32技术的资料一般推荐MSDN官网技术文档,因为MSDN技术文档是目前为止最准确的技术资料,我们来看看下面两个技术链接为我们提供了关于 NOTIFYICONDATA结构体相关的说明,

  1. https://msdn.microsoft.com/en-us/library/ms910625.aspx
  2. 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]

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值