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

bsr*_*uth 5 icons uac windows-xp windows-vista windows-7

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

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

Vit*_*Val 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)
Run Code Online (Sandbox Code Playgroud)

这适用于 XP 和 Vista,并且可以为所有目标系统正常编译。