如何在仍需针对XP的程序中添加UAC盾牌图标?

5
我有一个程序,仍然必须针对Windows XP(_WIN32_WINNT 0x501),因为我们的大多数客户仍在使用XP。然而,我们已经推出了Vista一段时间了,现在正在推广Windows 7升级。为了使软件在新的操作系统上正常工作,有几个操作需要进行UAC提升。我已经编写了提升代码,但希望在启动UAC进程的按钮上呈现UAC图标。不幸的是,在Microsoft的UAC UI文档中定义的所有选项都需要_WIN32_WINNT 0x600或更高版本。
是否有办法让适当的UAC图标(Vista和7使用不同的图标)显示在按钮上,同时仍能够针对XP进行目标设置(此时不会显示任何图标)?我正在使用C ++,但可能可以适应.NET解决方案。
2个回答

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

如果你在XP上向按钮发送BCM_SETSHIELD消息,它会对自己说“有趣”,并不会有任何有趣的事情发生。它肯定不会显示盾牌。因此,您无需防止自己发送消息。不过,在使用操作系统功能之前留意一下操作系统特性是个好习惯。

如果您要启动的“UAC进程”是带有清单的独立exe,则XP机器将忽略该清单,您不需要编写任何版本检查代码来启动它。

这是最好的跨版本代码编写方式——在旧版本上不做任何事情,但您不需要在运行时明确测试版本,也不需要为不同版本构建不同的exe。您不总是能够实现这一点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接