托盘在XP下不能显示tooltip,在Vista和Windows7下正常
奇怪的问题,想了很多可能的理由,最终的答案竟然是一开始就被我否认了的一种可能!!
问题现象:
调用Shell_NotifyIcon,在Vista和Windows 7上可以正常显示托盘的Balloon ToolTips,但在XP下却不行,而且函数返回值和GetLastError都正常。
问题的原因:
1、有问题的系统版本声明:
1 // 是具有运行应用程序所需功能的 Windows、Internet Explorer 等产品的
2 // 最早版本。通过在指定版本及更低版本的平台上启用所有可用的功能,宏可以
3 // 正常工作。
4 // 如果必须要针对低于以下指定版本的平台,请修改下列定义。
5 // 有关不同平台对应值的最新信息,请参考 MSDN。
6 #ifndef WINVER // 指定要求的最低平台是 Windows Vista。
7 #define WINVER 0x0600 // 将此值更改为相应的值,以适用于 Windows 的其他版本。
8 #endif
9 #ifndef _WIN32_WINNT // 指定要求的最低平台是 Windows Vista。
10 #define _WIN32_WINNT 0x0600 // 将此值更改为相应的值,以适用于 Windows 的其他版本。
11 #endif
12 #ifndef _WIN32_WINDOWS // 指定要求的最低平台是 Windows 98。
13 #define _WIN32_WINDOWS 0x0410 // 将此值更改为适当的值,以适用于 Windows Me 或更高版本。
14 #endif
15 #ifndef _WIN32_IE // 指定要求的最低平台是 Internet Explorer 7.0。
16 #define _WIN32_IE 0x0700 // 将此值更改为相应的值,以适用于 IE 的其他版本。
17 #endif
2 // 最早版本。通过在指定版本及更低版本的平台上启用所有可用的功能,宏可以
3 // 正常工作。
4 // 如果必须要针对低于以下指定版本的平台,请修改下列定义。
5 // 有关不同平台对应值的最新信息,请参考 MSDN。
6 #ifndef WINVER // 指定要求的最低平台是 Windows Vista。
7 #define WINVER 0x0600 // 将此值更改为相应的值,以适用于 Windows 的其他版本。
8 #endif
9 #ifndef _WIN32_WINNT // 指定要求的最低平台是 Windows Vista。
10 #define _WIN32_WINNT 0x0600 // 将此值更改为相应的值,以适用于 Windows 的其他版本。
11 #endif
12 #ifndef _WIN32_WINDOWS // 指定要求的最低平台是 Windows 98。
13 #define _WIN32_WINDOWS 0x0410 // 将此值更改为适当的值,以适用于 Windows Me 或更高版本。
14 #endif
15 #ifndef _WIN32_IE // 指定要求的最低平台是 Internet Explorer 7.0。
16 #define _WIN32_IE 0x0700 // 将此值更改为相应的值,以适用于 IE 的其他版本。
17 #endif
2、没问题的系统版本声明
1 // 是具有运行应用程序所需功能的 Windows、Internet Explorer 等产品的
2 // 最早版本。通过在指定版本及更低版本的平台上启用所有可用的功能,宏可以
3 // 正常工作。
4 // 如果必须要针对低于以下指定版本的平台,请修改下列定义。
5 // 有关不同平台对应值的最新信息,请参考 MSDN。
6 #ifndef WINVER // 指定要求的最低平台是 Windows XP。
7 #define WINVER 0x0500 // 将此值更改为相应的值,以适用于 Windows 的其他版本。
8 #endif
9 #ifndef _WIN32_WINNT // 指定要求的最低平台是 Windows XP。
10 #define _WIN32_WINNT 0x0501 // 将此值更改为相应的值,以适用于 Windows 的其他版本。
11 #endif
12 #ifndef _WIN32_WINDOWS // 指定要求的最低平台是 Windows 98。
13 #define _WIN32_WINDOWS 0x0410 // 将此值更改为适当的值,以适用于 Windows Me 或更高版本。
14 #endif
15 #ifndef _WIN32_IE // 指定要求的最低平台是 Internet Explorer 5.0。
16 #define _WIN32_IE 0x0501 // 将此值更改为相应的值,以适用于 IE 的其他版本。
2 // 最早版本。通过在指定版本及更低版本的平台上启用所有可用的功能,宏可以
3 // 正常工作。
4 // 如果必须要针对低于以下指定版本的平台,请修改下列定义。
5 // 有关不同平台对应值的最新信息,请参考 MSDN。
6 #ifndef WINVER // 指定要求的最低平台是 Windows XP。
7 #define WINVER 0x0500 // 将此值更改为相应的值,以适用于 Windows 的其他版本。
8 #endif
9 #ifndef _WIN32_WINNT // 指定要求的最低平台是 Windows XP。
10 #define _WIN32_WINNT 0x0501 // 将此值更改为相应的值,以适用于 Windows 的其他版本。
11 #endif
12 #ifndef _WIN32_WINDOWS // 指定要求的最低平台是 Windows 98。
13 #define _WIN32_WINDOWS 0x0410 // 将此值更改为适当的值,以适用于 Windows Me 或更高版本。
14 #endif
15 #ifndef _WIN32_IE // 指定要求的最低平台是 Internet Explorer 5.0。
16 #define _WIN32_IE 0x0501 // 将此值更改为相应的值,以适用于 IE 的其他版本。
17 #endif
小结:
这是我第一次遇到这个问题,而且花了差不多一个早上来找原因,要记下这个问题。
出现这个问题是有原因的,我用的vs2008,版本声明是IDE帮我自动生成的;而我使用的是windows7,测试这个功能也一直没问题,在我的vista虚拟机下测试也是对的,想不到的是XP下竟然有这个问题。
还是那句老话:要对自己的每一行代码负责。(哪怕是IDE帮你生成的)