如何将UAC盾牌图标添加到仍必须针对XP的程序中?

发布于 2024-08-25 10:51:50 字数 458 浏览 7 评论 0原文

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

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

I have a program that still must target Windows XP (_WIN32_WINNT 0x501), as most of our customers still use XP. However, we have been shipping Vista for a while, and are now pushing Windows 7 upgrades. For the software to work correctly on the newer OSs, there are a couple operations that require UAC elevation. I have the elevation code working, but would like to have the UAC icon present on the buttons that launch the UAC process. Unfortunately, all of the options defined in Microsoft's UAC UI document require _WIN32_WINNT 0x600 or newer.

Is there any way to get the appropriate UAC icon (Vista and 7 use different ones) to show on the button while still being able to target XP (where no icon will be shown)? I'm using C++, but may be able to adapt a .NET solution.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

同尘 2024-09-01 10:51:50

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

Use Button_SetElevationRequiredState and add something like:

#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)

This will work on XP and Vista, and will compiled normally for all target systems.

暖阳 2024-09-01 10:51:50

如果您在 XP 上向按钮发送 BCM_SETSHIELD 消息,它会自言自语“令人着迷”,并且不会执行任何有趣的操作。它肯定不会显示盾牌。因此您无需阻止自己发送消息。尽管如此,在使用操作系统功能之前关注它们仍然是一个好主意。

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

这是最好的跨版本代码编写方式 - 它对旧版本没有任何作用,但您不会在运行时显式测试版本,也不会为不同版本构建不同的 exe。你并不总是能够实现这一目标。

If you send the button a BCM_SETSHIELD message on XP, it will say to itself "fascinating" and do nothing of interest. It certainly won't display a shield. So you don't need to prevent yourself from sending the message. Still, it's a good thought to pay attention to your OS features before using them.

If "the UAC process" you're launching is a separate exe with a manifest, the XP machines will ignore the manifest and you won't need to write any version checking code where you launch it.

This is the best kind of cross-version code to write - it does nothing on older versions but you're not running around explicitly testing the version at runtime, nor building different exes for different versions. You won't always be able to achieve that.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文