2010-03-19 13 views
5

我有一个程序,仍然必须针对Windows XP(_WIN32_WINNT 0x501),因为我们的大多数客户仍然使用XP。但是,我们一直在推出Vista,现在正在推动Windows 7升级。为了使软件能够在较新的操作系统上正常工作,有几项操作需要UAC提升。我有高程代码工作,但想在启动UAC进程的按钮上显示UAC图标。不幸的是,Microsoft's UAC UI document中定义的所有选项都需要_WIN32_WINNT 0x600或更高版本。如何将UAC盾牌图标添加到仍然必须针对XP的程序中?

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

回答

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机器将忽略该清单,并且您无需在启动它时编写任何版本检查代码。

这是最好的一种交叉版本代码 - 它在旧版本上没有做任何事情,但是你没有在运行时显式测试版本,也没有针对不同版本构建不同的版本。你不会总是能够实现这一点。

相关问题