c++ - 如何在 C++ 中使用 UAC-shield 创建菜单项?
问题描述
我想为需要提升的操作创建一个菜单项。
Windows UI 指南规定,此类操作应在其旁边显示 UAC 盾牌。
如何使用普通的 Windows API 和 C++ 做到这一点?
解决方案
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)中所述。
推荐阅读
- haskell - Stack 如何决定依赖关系?
- javascript - 如何在类组件中使用反应导航道具?
- angular - Angular 6:更改对象的属性并将其保存到数据库(内存中 Web API)
- sql - SSIS:合并连接/条件拆分问题
- firefox - 如何在 firefox 62.0.3 的控制台中查看 content_script 错误?
- ms-access - 使用查询 Access 2007 填充组合框的两行
- javascript - 如果消息仅以标签开头,如何使 slackbot 回复
- javascript - postMessage 期间 Microsoft Edge 中的 SCRIPT5022 语法错误
- javascript - 惰性脚本(使用文本)
- oracle - How to filter particular time period in oracle