c++ - 如何在 C++ 中使用 UAC-shield 创建菜单项?

标签 c++ winapi

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

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

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

最佳答案

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

加载图标

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

这为您提供了一个 HICON,但是 SetMenuItemBitmaps 需要一个 HBITMAP,因此需要转换 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) .

关于c++ - 如何在 C++ 中使用 UAC-shield 创建菜单项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54178446/

相关文章:

c++ - MoveToEx 和 LineTo 不使用存储在顶点 (push_back) win32 c++ 中的 MAKEPOINTS 绘制

c++ - 使用分配器实现 vector 类 : EXC_BAD_ACCESS

c++ - 是否可以在构造函数的初始化列表中初始化 std::unique_ptr 的 std::array?

C++ unix下递归复制目录

c# - 通过 Win32 API 你将如何获得一类 SysListView32 的值

windows - 模式对话框窗口出现后按钮丢失 WM_LBUTTONUP

c++ - 显示模态窗口 1 秒

抽象类中的c++克隆函数

c++ - 如何删除也是函数返回值的新分配的 char?

c++ - 使用此代码的“特定”双缓冲?