首页 > 解决方案 > 如何在 C++ 中使用 UAC-shield 创建菜单项?

问题描述

我想为需要提升的操作创建一个菜单项。

Windows UI 指南规定,此类操作应在其旁边显示 UAC 盾牌。

如何使用普通的 Windows API 和 C++ 做到这一点?

标签: c++winapi

解决方案


Windows shell 确实提供了各种默认图标,其中还有 UAC-shield 图标。

加载图标

SHSTOCKICONINFO ssii = {};
ssii.cbSize = sizeof(ssii);
SHGetStockIconInfo(SIID_SHIELD, SHGSI_ICON | SHGSI_SMALLICON, &ssii);

这给了你 a HICON,但是SetMenuItemBitmaps需要 aHBITMAP所以HICON需要转换:

ICONINFOEX iconInfo = {};
iconInfo.cbSize = sizeof(iconInfo);
GetIconInfoEx(ssii.hIcon, &iconInfo);
auto bitmap = (HBITMAP)CopyImage(iconInfo.hbmColor, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION);

最后,设置图标:

SetMenuItemBitmaps(hMenu, YOUR_MENU_ITEM_COMMAND, MF_BYCOMMAND, bitmap, bitmap);

清理:

DestroyIcon(ssii.hIcon);

bitmap菜单销毁后需要销毁(使用DeleteObject(bitmap);),或者将在应用程序关闭时清理,如CopyImage(MSDN)SetMenuItemBitmaps(MSDN)中所述。


推荐阅读