返回首页


简介
感谢PJ Naughter首先,原来的 NBSP,我只是改变了一些从MFC WTL代码。
隐藏了大量的直接调用API的苦差事,并使用它提供了一个干净的C接口。重载的成员函数来设置和获取工具提示文本,图标和通知"窗口。该类还提供了一个默认的实现带来了一个上下文菜单,并提供了一​​个默认的菜单项,这是双击该图标时执行。该类还提供了自动清理和复活的图标,如果shell意外崩溃。
WTL港版保持不变,所有的接口,所以你可以阅读文件。好消息:从PJ Naughter更新的代码,独立经营的MFC,如果需要的话。这就要求这是一个开源的ATL库沿MFC的扩展,提供UI支持的WTL的。这么好的男人!
谁想要使用这个包下载,所有的功劳都属于PJ Naughter。CTrayNotifyIcon v1.55
欢迎CTrayNotifyIcon,一个免费的MFC类封装在Windows任务栏通知API。


特点简单干净的C接口。类是完全支持Unicode标准,包括建于Unicode的工作区文件的选项。所有代码完全编译警戒水位4。支持所有的托盘功能到Windows XP SP2,而在同一时间,班会工作的Windows版本上没有问题,早在Windows 95的金。当然,如果你要使用的新功能,如气球托盘图标等,那么这个功能当然会仅适用于更高版本的Windows,所以你仍然可能需要在客户端应用程序处理这个问题,如果你仍然支持旧版本Windows的。隐藏处理凌乱的NOTIFYICONDATA结构和其所有的各种怪癖,你可能会熟悉,如果您有编码的直接"Shell_NotifyIcon"的API的复杂性。


使用要在代码中使用的类的简单,包括在您的项目NTray.cpp和#include NTray.h你的模块需要调用类。您将需要一个最新的安装平台SDK来编译代码,如果你是使用Visual C 6(2003年2月的最后一个版本,这是用VC 6兼容)。作为V1.51,现在的代码使用偏好作者的CHookWnd类ATL的CWindowImpl的类。这意味着,仅用于MFC客户端项目,您将需要您的项目添加ATL支持。要看到在动作类,有一个代码模块中的"mainfrm.cpp"的。您的代码将需要包括的MFC静态或动态。


版权所有你被允许在任何产品的源代码(商业软件,共享软件,免费或以其他方式),当你的产品是二进制形式发布。你可以修改的源代码,在任何您想要的方式,除非你不能修改版权的细节,在每个模块的顶部。如果您要分发的应用程序源代码,那么你只允许分发作者发布的版本。这是为了维持一个单一的源代码分发点。



V1.0(1997年5月14日)首次公开发行。
V1.1(1997年11月25日)此外HideIcon(),ShowIcon()放大器; MoveToExtremeRight()支持动画托盘图标
V1.2(1998年6月23日)类现在支持新的任务栏创建通知消息,它​​与IE浏览器4。这使得重新创建托盘图标,只要在资源管理器重新启动(Crashes!!)
V1.3(1998年7月22日)代码现在完全编译的警告级别4代码现在启用Unicode生成配置提供类文档已经完全改变
V1.31(1999年1月27日)代码现在可以正确地负载可达16 * 16的图标,以前它允许Windows来重新调整,从32 * 32稍微模糊图像的图标。这已通过新的LoadIconResource方法来完成。
V1.32(1999年1月28日)删除发生的第4级警告。
v1.33中(1999年5月9日) 修正了一个问题,记录在知识库文章"PRB:通知图标的菜单无法正常工作",文章编号:Q135788。
V1.4(1999年5月16日)修改示例程序,以确保16 * 16的图标时,会使用不使用托盘图标动画。现在使用的作者的hookwnd类。这样就避免了需要创建两个隐藏窗口即CTrayRessurectionWnd CTrayTimerWnd处理动画图标和托盘创建消息。示例项目现在编译警戒水位4。通用代码清理和重排。增加了大量的ASSERT的提高代码的健壮性。新增的功能允许上下文菜单进行定制。
2000年5月21日次要更新的文档。
V1.41(2001年1月1日)现在,包括版权的源代码和documentation.nbsp消息;固定的窗口双击托盘图标后,没有得到重点的问题。现在完全支持Windows 2000的气球风格的工具提示。修正之一的ASSERT的一些问题关闭。用Unicode生成配置的固定问题。提供了WIN2K具体的构建配置。
V1.42(2001年2月10日)现在完全支持创建托盘图标,在同一时间。
V1.43(2001年6月13日)现在删除后调用RemoveIcon Windows挂钩。
V1.44(2001年8月26日)RemoveIcon固定内存泄漏。在RemoveIcon拆除呼叫,以解开固定GPF
V1.45(2001年8月28日)增加了直接访问系统托盘的hDC的支持。这使您可以生成一个托盘上使用GDI调用动态图标。这个想法来自杰夫希顿在4月的WDJ问题的文章。还增加了被覆盖的创建方法,让您可以轻松地给出了位图的图标,而不是构建一个动态的托盘图标。{BR 2002年11月25日那里得到HookWnd.h的文件,如果代码编译失败NTray.h头文件中添加注释。
V1.46(2003年3月21日)操作SetIcon(LPCTSTR lpIconName)和操作SetIcon(UINT nIDResource)固定图标资源泄漏。报告此感谢Egor Pervouninski。固定脱钩的通知窗口被关闭时,托盘图标。
V1.47(2003年3月31日)现在使用我的Hookwnd类V1.05
V1.48(2003年4月2日)现在使用我的Hookwnd类V1.06修正了在这个钩子应该已经创建全局实例,而不是作为大型机窗口的成员变量的类的示例应用程序的错误。这确保了挂钩仍然有效,即使在大型机上调用DefWindowProc。
V1.49(2004年7月23日)次要更新,消除不必要的包括"RESOURCE.H"
V1.50(2006年3月3日)更新版权的详细信息。更新文档的网站使用相同的样式。做了一个文档的拼写检查。使用/ Wp64编译代码时,修正了一些问题。请注意,支持代码现在需要recentish的平台SDK要安装的,如果代码是用Visual C 6编译。取代所有调用ZeroMemory与memset的。修正了一个问题SetBalloonDetails是没有设置cbSize参数。恩里克格兰达报告此问题。新增支持NIIF_USER和NIIF_NONE标志。现在,包括支持通过SetVersion NIM_NIMSETVERSION。此外,这是现在的Create()自动调用如果WIN2K布尔参数设置。删除,因为它是不是真的需要从CObject派生。现在支持包括NIM_SETFOCUS新增支持NIS_HIDDEN通过ShowIcon和HideIcon方法。新增支持为NIIF_NOSOUND
V1.51(2006年6月27日)代码现在使用新的C风格转换,而不是在必要时老C型转换。如果使用VC 6编译类框架,现在需要的Platform SDK。更新逻辑的断言验证各种字符串长度。修正了一个错误,在CTrayNotifyIcon:SetFocus的()cbSize值不正确设置。CTrayIconHooker类现在使用偏好作者的CHookWnd类ATL的CWindowImpl的类。这意味着,仅用于MFC客户端项目,您将需要您的项目添加ATL支持。优化CTrayIconHooker构造函数代码。更新后的代码编译使用VC 2005。促使此更新"伊塔马尔"。此外,一个CTRAYNOTIFYICON_EXT_CLASS和CTRAYNOTIFYICON_EXT_API宏这使得更容易使用扩展DLL中的类。CTrayNotifyIcon析构函数的虚拟制造。
V1.52(2006年7月3日)修正了一个错误HideIcon功能没有工作在Windows 2000。这是关系到如何NOTIFYICONDATA结构的cbSize成员被初始化。现在的代码动态确定正确的大小在运行时设置,根据MSDN文档提供了这种结构的指示。作为一个这样做的结果,所有的"bWin2k"这在以前是通过CTrayNotifyIcon暴露的参数现在已经被删除,因为没有为他们的需要。报告这一重要的bug感谢埃德温耿。客户端代码将仍然需要智能地做出决定,对什么是操作系统的支持。例如气球托盘图标只支持壳牌V5(名义上的Windows 2000或更高版本)。 CTrayNotifyIcon将断言,如果比如调用它来创建一个气球LT操作系统托盘图标,壳牌V5。
V1.53(2006年7月5日)修正了一个错误的菜单可能会弹出一个菜单项后的第二次选择是在Windows 2000。问题是追查CTrayNotifyIcon代码:OnTrayNotification。这个bug进行测试期间,我是无法得到一个可行的解决方案,使用新的shell消息WM_CONTEXTMENU,NIN_KEYSELECT放大器; NIN_SELECT在Windows 2000和Windows XP。这意味着在CTrayNotifyIcon代码:OnTrayNotification使用的老办法处理通知(WM_RBUTTDOWN *)。这也意味着,默认情况下,客户端应用程序使用的CTrayNotifyIcon类不支持新的键盘和鼠标托盘图标的语义(恕我直言,这是没有什么大的损失!)。当然,客户端代码是自由处理自己的通知。如果你走这条路,那么我劝你彻底地测试您的应用程序在Windows 2000和Windows XP,我的测试表明,有显著的差异是在托盘图标如何处理他们对这些2操作系统的消息。埃德温耿报告此问题。类现在显示的菜单根据当前消息的屏幕坐标,而不是当前光标的屏幕坐标。固定的臭虫在示例应用程序的关于对话框已经和它是重新从托盘菜单,并没有带来自己到前台
V1.54(2006年7月6日)还原为v1.53屏幕坐标用来显示上下文菜单中选择"使用当前消息的屏幕坐标的变化。相反,前v1.53机制,使用当前光标的屏幕坐标是现在使用。到伊塔马尔SYN -什科报告此问题。
V1.55(2006年7月19日)默认菜单项现在可以通过SetDefaultMenuItem和GetDefaultMenuItem定制。米哈伊尔Bykanov提示这个漂亮的更新。优化CTrayNotifyIcon构造函数代码


API参考
实例化,它将会为你的图标的寿命大约一个CTrayNotifyIcon。示例程序在大型机的图标将可用于应用程序的生命周期。在示例程序中,这样做是在大型机级。 API包含类CTrayNotifyIcon以下的公共职能
CTrayNotifyIcon:CTrayNotifyIcon
CTrayNotifyIcon:CTrayNotifyIcon();
备注
标准的构造函数,只是初始化为安全值的所有成员变量。

CTrayNotifyIcon:〜CTrayNotifyIcon
CTrayNotifyIcon::〜CTrayNotifyIcon();
备注
标准析构函数。在内部,这将调用RemoveIcon从UI中删除的图标。

CTrayNotifyIcon:
BOOL CTrayNotifyIcon::创建(CWnd的* pNotifyWnd,UINT NID,LPCTSTR pszTooltipText,HICON惠康,nNotifyMessage UINT,UINT uMenuID = 0);
布尔CTrayNotifyIcon:(CWnd的* pNotifyWnd,UINT UID,LPCTSTR pszTooltipText,HICON * phIcons,INT nNumIcons,DWORD dwDelay,UINT nNotifyMessage,UINT uMenuID = 0);
BOOL CTrayNotifyIcon:创建的CWnd * pNotifyWnd,UINT的UID,LPCTSTR pszTooltipText,LPCTSTR pszBalloonText,LPCTSTR pszBalloonCaption,UINT nTimeout,BalloonStyle风格,HICON惠康,nNotifyMessage UINT,UINT uMenuID = 0,布尔bNoSound = FALSE;
布尔CTrayNotifyIcon:(CWnd的* pNotifyWnd,UINT UID,LPCTSTR pszTooltipText,LPCTSTR pszBalloonText,LPCTSTR pszBalloonCaption,UINT nTimeout,BalloonStyle风格,HICON * phIcons,INT nNumIcons,DWORD dwDelay,UINT nNotifyMessage,UINT uMenuID = 0,布尔bNoSound = FALSE);
BOOL CTrayNotifyIcon:创建的CWnd * pNotifyWnd,UINT的UID,LPCTSTR pszTooltipText,CBitmap * pBitmap,UINT nNotifyMessage,UINT uMenuID = 0;
BOOL CTrayNotifyIcon:创建的CWnd * pNotifyWnd,UINT的UID,LPCTSTR pszTooltipText,LPCTSTR pszBalloonText,LPCTSTR pszBalloonCaption,UINT nTimeout,BalloonStyle风格,CBitmap * pBitmap,UINT nNotifyMessage,UINT uMenuID = 0,布尔bNoSound = FALSE;
返回值TRUE,如果成功地创建托盘图标,否则返回假。
参数
pNotifyWnd:发送通知消息的窗口。这以后可以更改使用的SetNotificationWnd方法。
UID:每个托盘图标关联的应用程序定义的值。这可以让你从一个应用程序中显示多个图标。 CTrayNotifyIcon还覆盖其含义,它是使用上下文菜单中的菜单资源ID。
pszTooltipText:初始的工具提示文本显示。以后使用的SetTooltipText方法是可以改变的。
的hIcon:图标显示。以后使用SetIcon方法可以改变。
nNotifyMessage:这是使用通知有关鼠标消息的窗口的通知消息。这应该被定义为一些WM_USER消息和通知Windows消息映射使用ON_MESSAGE宏处理。要看到如何挂钩,这件事有一个看mainfrm.cpp
phIcons:指针图标的数组处理用做图标动画。
nNumIcons的图标数量phIcons点。
dwDelay:在图标动画帧之间的毫秒间隔。
pszBalloonText:文字显示在气球风格的工具提示
pszBalloonCaption:气球样式的标题工具提示
nTimeout:气球风格的工具提示超时。经过这段时间(毫秒)气球工具提示就会消失。
风格:图标出现在气球工具提示。它可以是一个枚举值CTrayNotifyIcon:信息,CTrayNotifyIcon:错误,CTrayNotifyIcon:警告,CTrayNotifyIcon:"无"或"CTrayNotifyIcon:用户。请注意,CTrayNotifyIcon:用户是仅适用于XP SP2或更高。还要注意的是气球样式工具提示本身只是壳或更高版本(Windows 2000或更高)第5版。
uMenuID将此值设置为一个非零值,使用不同的菜单资源,而不是默认UID指定
pBitmap显示为图标的位图。内部代码转换为位图前显示的图标。
bNoSound将此值设置为TRUE(默认为false)会导致外壳没有发挥在弹出的声音,当气球样式工具提示显示。请注意,此功能仅适用于XP SP2或更高。
备注
创建一个托盘通知图标。 2重写的版本,指定气球工具提示仅适用于V5壳牌(名义上的Windows 2000及更高版本)。

CTrayNotifyIcon:SetTooltipText
BOOL CTrayNotifyIcon:SetTooltipText(LPCTSTR pszTooltipText);
BOOL CTrayNotifyIcon:SetTooltipText(UINT NID);
返回值
TRUE,如果工具提示文本被改变成功,否则返回FALSE
参数
pszTooltipText设置的文本
NID一个窗口设置文本的字符串资源ID
备注
设置托盘图标与文本相关联的工具提示

CTrayNotifyIcon:GetTooltipText
CString的CTrayNotifyIcon:GetTooltipText()const的
返回值
当前工具提示文本

CTrayNotifyIcon:操作SetIcon
BOOL操作SetIcon(HICON HICON);
BOOL操作SetIcon(CBitmap * pBitmap);
BOOL操作SetIcon(LPCTSTR lpIconName);
BOOL操作SetIcon(UINT nIDResource);
BOOL操作SetIcon(HICON * phIcons,DWORD,INT nNumIcons dwDelay);
返回值
TRUE,如果图标被改变成功,否则返回FALSE
参数
HICON句柄设置的图标
lpIconName一个Windows图标使用的图标资源字符串
nIDResource一个Windows图标使用的图标资源ID
phIcons:指针图标的数组处理用做图标动画。
nNumIcons的图标数量phIcons点。
dwDelay:在图标动画帧之间的毫秒间隔。
pBitmap用作图标的位图
备注
设置托盘图标关联的图标。通常情况下,你应该使用加载你的图标。

CTrayNotifyIcon:SetStandardIcon
BOOL CTrayNotifyIcon:SetStandardIcon(LPCTSTR lpIconName);
BOOL CTrayNotifyIcon:SetStandardIcon(UINT nIDResource);
参数
lpIconName一个Windows图标使用的图标资源字符串
nIDResource一个Windows图标使用的图标资源ID
备注
设置托盘图标,使用标准的图标标识符关联的图标。
要使用的Windows预定义的图标,lpIconName参数为下列值之一:
价值说明IDI_APPLICATION默认的应用程序图标。IDI_ASTERISKIDI_INFORMATION相同。IDI_ERROR手形图标。IDI_EXCLAMATIONIDI_WARNING相同。IDI_HANDIDI_ERROR相同。IDI_INFORMATIONAsterisk的图标。IDI_QUESTION问号图标。IDI_WARNING惊叹号图标。IDI_WINLOGOWindows徽标图标。

CTrayNotifyIcon:GetIcon
HICON CTrayNotifyIcon:GetIcon()const的;
返回值目前正在显示
图标的图标的句柄

CTrayNotifyIcon:UsingAnimatedIcon
BOOL UsingAnimatedIcon()const的;
返回值
TRUE,如果一个动画图标显示,FALSE,如果正在使用普通的静态图标。

CTrayNotifyIcon:SetNotificationWnd
BOOL CTrayNotifyIcon:SetNotificationWnd(的CWnd * pNotifyWnd);
返回值
TRUE,如果通知窗口设置成功,否则返回假
参数
pNotifyIcon是这个托盘图标关联的通知窗口的窗口

CTrayNotifyIcon:GetNotificationWnd
的CWnd * GetNotificationWnd()const的;
返回值
是这个托盘图标关联的通知窗口的窗口

CTrayNotifyIcon:HideIcon
CTrayNotifyIcon::HideIcon();
备注
暂时隐藏托盘通知图标。如果类检测到它正在运行壳牌V5或更高版本(名义上的Windows 2000或更高版本,则此方法将使用NIS_HIDDEN功能隐藏的图标,而不是实际上摧毁托盘图标。使用此功能的位置极左出现时,它是完全重新保存,而不是重新显示图标。

CTrayNotifyIcon:ShowIcon
CTrayNotifyIcon::ShowIcon();
备注
推论功能,以HideIcon

CTrayNotifyIcon:RemoveIcon
CTrayNotifyIcon::RemoveIcon();
备注
完全删除托盘图标和重置类的成员变量。这是推论功能

CTrayNotifyIcon:SetMenu
CTrayNotifyIcon:SetMenu(HMENU HMENU);
参数
HMENU菜单资源使用托盘图标的上下文菜单。

CTrayNotifyIcon:GetMenu
CMenuamp; CTrayNotifyIcon:GetMenu();
返回值
菜单资源,目前相关的托盘图标。

CTrayNotifyIcon:OnTrayNotification
虚拟LRESULT CTrayNotifyIcon:OnTrayNotification(UID的WPARAM,LPARAM勒);
返回值
标准消息处理返回结果
参数
UID:你在调用中指定的值
勒:鼠标事件(如WM_LBUTTONDOWN)。
备注
当您的处理程序获得控制,wParam是当您创建的CTrayNotifyIcon指定的ID。 lParam是鼠标事件(例如,WM_LBUTTONDOWN)。你可以做任何你喜欢的,当你得到通知。这个虚拟的(所以你可以覆盖它)函数实现了默认的UI"软件的Windows界面指南"中所述的行为,所提供的示例应用程序无关的一切工作和代表在CTrayNotifyIcon的默认实现。

CTrayNotifyIcon:IsShowing
BOOL CTrayNotifyIcon:IsShowing()const的;
返回值
TRUE,如果托盘图标是目前被证明,否则为假

CTrayNotifyIcon:IsHidden
BOOL CTrayNotifyIcon:IsHidden();
返回值
TRUE,如果托盘图标是目前隐藏否则返回false

CTrayNotifyIcon:LoadIconResource
静态HICON CTrayNotifyIcon:LoadIconResource(LPCTSTR lpIconName);
静态HICON CTrayNotifyIcon:LoadIconResource(UINT nIDResource);
参数
lpIconName加载一个Windows图标的图标资源字符串
nIDResource一个Windows图标的图标加载的资源ID
返回值
图标的句柄,如果该图标可以加载否则为null。
备注
你应该调用这个函数在MFC的CWinApp的优先::LoadIcon或SDK LoadIcon调用加载由CTrayNotifyIcon使用您的图标。此功能将首先尝试加载一个16 * 16大小的图标。通常情况下,当你问Windows加载一个图标,它会首先尝试加载资源为32 * 32,然后Windows将它的规模往往造成轻微模糊图像的托盘使用16 * 16。

CTrayNotifyIcon:SetBalloonDetails
BOOL CTrayNotifyIcon:SetBalloonDetails(LPCTSTR pszBalloonCaption,LPCTSTR pszBalloonText BalloonStyle风格,UINT nTimeout,HICON hUserIcon = NULL,布尔bNoSound = FALSE);
返回值
TRUE,如果成功,否则虚假的细节进行了更新
参数
pszBalloonText:文字显示在气球风格的工具提示
pszBalloonCaption:气球样式的标题工具提示
nTimeout:气球风格的工具提示超时。经过这段时间(毫秒)气球工具提示就会消失
风格:图标出现在气球工具提示。请看到的可能值的更多细节。
hUserIcon:如果你设置的"风格"的用户,那么这个参数是您指定的用户图标显示在气球风格的工具提示
bNoSound:将此值设置为TRUE(默认为false)会造成的外壳不打气球风格的工具提示显示弹出的声音。请注意,此功能仅适用于XP SP2或更高
备注
设置气球工具提示托盘图标的相关细节

CTrayNotifyIcon:GetBalloonText
CString的CTrayNotifyIcon:GetBalloonText()const的
返回值
目前的气球文本

CTrayNotifyIcon:GetBalloonCaption
CString的CTrayNotifyIcon:GetBalloonCaption()const的
返回值
目前的气球标题

CTrayNotifyIcon:GetBalloonStyle
CTrayNotifiyIcon:BalloonStyle CTrayNotifyIcon:GetBalloonStyle()const的
返回值
当前样式气球工具提示正在使用

CTrayNotifyIcon:GetBalloonTimeout
UINT CTrayNotifyIcon:GetBalloonTimeout()const的
返回值
当前的超时(毫秒)与气球相关的工具提示正在使用

CTrayNotifyIcon:BitmapToIcon
HICON CTrayNotifyIcon:BitmapToIcon(CBitmap * pBitmap)
返回值
一个指定位图的图标表示
参数
pBitmap:位图转换为一个图标
备注
转换为Windows位图的图标。使用此方法时,而不是一个HICON CBitmap调用Create方法。

CTrayNotifyIcon:GetDynamicDCAndBitmap
静态布尔CTrayNotifyIcon:GetDynamicDCAndBitmap(CDC * PDC,CBitmap * pBitmap)
返回值
TRUE,如果DC和位图获得确定否则返回FALSE
参数
PDC:直流类的地址与DC兼容托盘返回。
pBitmap:一个位图,其中将包含托盘图标表示的地址。
备注
这个函数应该被称为为准备使用动态托盘图标(即你在运行时构造绘制到一个内存设备上下文的图标)。成功后的回报,你应该挂在这两个参数,直到你需要他们。例如,在示例应用程序,代码定期更新的DC到DC绘制一个新的号码,然后更新这个托盘图标。对于使用动态托盘图标的详细信息,请咨询提供的样品application.nbsp;



联络作者
PJ Naughter电子邮件:pjna(AT)naughter.com
网站

7月19日2006年
| zhaozg

回答

评论会员:游客 时间:2011/12/06
大的更新和伟大的阶级。我在想,如果有可能,也允许执行一个动作一个只需点击一下托盘图标?
zhaozg
评论会员:游客 时间:2011/12/06
是的,您可以如果您使用WTL的用户界面,只是用MESSAGE_HANDLER_EX(WM_TRAYNOTIFY,OnTrayNotification)消息映射和LRESULTOnTrayNotification(UINT/*uMsg*/,WPARAMWPARAM,LPARAM的lParam)获取鼠标点xPos=GET_X_LPARAM(LPARAM);yPos=GET_Y_LPARAM(LPARAM);其中wParam消息将WM_MOUSE_MSG或WM_[L|R]按钮[动作]这是esay!v1.57一个MFC/WTL的类来处理托盘图标OK!让大家知道,这篇文章是在现在的基础原始类包括这些更新。这个非常不错的除了感谢zhaozg。您可以从我www.naughter.com下载网站的最新版本