如何将UAC盾牌图标添加到仍然必须以XP为目标的程序?

时间:2010-03-19 22:16:26

标签: windows-7 windows-vista windows-xp icons uac

我有一个程序仍然必须针对Windows XP(_WIN32_WINNT 0x501),因为我们的大多数客户仍然使用XP。但是,我们已经推出Vista一段时间了,现在推动Windows 7升级。为使软件在较新的操作系统上正常工作,有一些操作需要UAC提升。我有提升代码工作,但希望在启动UAC进程的按钮上显示UAC图标。不幸的是,Microsoft's UAC UI document中定义的所有选项都需要_WIN32_WINNT 0x600或更新。

是否有任何方法可以在按钮上显示相应的UAC图标(Vista和7使用不同的图标),同时仍能够定位XP(不显示图标)?我正在使用C ++,但可能能够适应.NET解决方案。

2 个答案:

答案 0 :(得分:3)

使用Button_SetElevationRequiredState并添加如下内容:

#if ! defined(BCM_FIRST)
#define BCM_FIRST               0x1600
#define BCM_SETSHIELD  (BCM_FIRST + 0x000C)
#define Button_SetElevationRequiredState(hwnd, fRequired) \
 (LRESULT)SNDMSG((hwnd), BCM_SETSHIELD, 0, (LPARAM)fRequired)
#endif // #if ! defined(BCM_FIRST)

这适用于XP和Vista,并且将针对所有目标系统正常编译。

答案 1 :(得分:1)

如果您在XP上发送了一个BCM_SETSHIELD消息按钮,它会说自己“引人入胜”并且没有任何兴趣。它肯定不会显示盾牌。因此,您无需阻止自己发送消息。不过,在使用它们之前注意你的操作系统功能是一个很好的想法。

如果您启动的“UAC进程”是一个带有清单的单独exe,则XP计算机将忽略清单,您无需在启动时编写任何版本检查代码。

这是最好的跨版本代码 - 它在旧版本上没有任何作用,但是你没有在运行时显式测试版本,也没有为不同的版本构建不同的版本。你无法永远实现这一目标。