Windows 7 如何将UAC屏蔽图标添加到仍然必须以XP为目标的程序中?

Windows 7 如何将UAC屏蔽图标添加到仍然必须以XP为目标的程序中?,windows-7,windows-vista,windows-xp,icons,uac,Windows 7,Windows Vista,Windows Xp,Icons,Uac,我有一个程序仍然必须针对Windows XP(_WIN32_WINNT 0x501),因为我们的大多数客户仍然使用XP。然而,我们已经发布Vista一段时间了,现在正在推动Windows7升级。为了让软件在较新的OSs上正常工作,有几个操作需要UAC提升。我有提升代码,但希望启动UAC流程的按钮上有UAC图标。不幸的是,中定义的所有选项都需要_WIN32_WINNT 0x600或更高版本 有没有办法让相应的UAC图标(Vista和7使用不同的图标)显示在按钮上,同时仍然能够以XP为目标(没有图标

我有一个程序仍然必须针对Windows XP(_WIN32_WINNT 0x501),因为我们的大多数客户仍然使用XP。然而,我们已经发布Vista一段时间了,现在正在推动Windows7升级。为了让软件在较新的OSs上正常工作,有几个操作需要UAC提升。我有提升代码,但希望启动UAC流程的按钮上有UAC图标。不幸的是,中定义的所有选项都需要_WIN32_WINNT 0x600或更高版本


有没有办法让相应的UAC图标(Vista和7使用不同的图标)显示在按钮上,同时仍然能够以XP为目标(没有图标显示)?我使用C++,但是可以适应.NET解决方案。

使用ButoNoToStRealTestRealDeDtand并添加一些类似的内容:

#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上工作,并将为所有目标系统正常编译。

如果您在XP上向按钮发送BCM_SETSHIELD消息,它会对自己说“迷人”,而不会做任何有趣的事情。它当然不会显示一个盾牌。所以你不需要阻止自己发送信息。不过,在使用操作系统功能之前,还是要注意它们

如果您正在启动的“UAC进程”是一个带有清单的单独exe,XP机器将忽略清单,您不需要在启动清单的地方编写任何版本检查代码

这是最好的跨版本代码——它在旧版本上不起任何作用,但您不会在运行时显式地测试版本,也不会为不同的版本构建不同的EXE。你不可能总是做到这一点