【问题标题】:Windows Explorer context menu item idsWindows 资源管理器上下文菜单项 ID
【发布时间】:2015-04-15 20:26:17
【问题描述】:

使用::GetMenuItemInfo() 我看到在我的 Win 8.1 x 64 上,“删除”菜单项 ID 等于十进制 18,“属性”ID 等于 20。它们在任何 Windows 上都相同吗?它们在哪里定义SDK 标头?

更新

我想使用TrackPopupMenu 在我的应用程序中显示一些文件的系统菜单,但我想覆盖一些项目,例如“删除”。如何检查项目#i(其中 i 是从 0 到项目计数的索引)是否是“删除”项目以将其 id 更改为我自己的并稍后处理?如果 ID 是恒定的,这似乎很简单,但否则......

【问题讨论】:

  • 我看不出有什么理由可以在任何地方定义它们,或者期望它们是稳定的。您不需要知道这些值。
  • 如何在我的应用程序中跟踪系统上下文菜单,只覆盖其中的两个?我看过一个程序,它可以做到这一点。
  • 这是什么意思?覆盖其中两个?无论如何,您没有询问跟踪任何内容或覆盖任何内容。您询问了菜单项 ID。
  • 2 个项目:我在问题中写的“删除”和“属性”))
  • @DavidHeffernan 抱歉,写的太匆忙了。我已经更新了这个问题,我希望它现在更正确。感谢您指出它的低质量。

标签: winapi contextmenu windows-explorer


【解决方案1】:

不要使用菜单项 ID 来识别命令。即使在同一台 PC 上,命令 ID 在不同时间也可能不同。如果要覆盖任何菜单项,则必须分析命令动词而不是 ID。动词总是一样的。

当您拥有对象枚举菜单项的 IContextMenu 并使用 GCS_VERBA 或 GCS_VERBW 参数调用 IContextMenu.GetCommandString 函数时。当 GetCommandString 返回您的“删除”字符串时 - 在此位置您有删除命令。当 GetCommandString 返回你的“属性”字符串时——在这个位置你有属性命令。

【讨论】:

  • 刚刚查看了 Classic Shell 源代码 — 它的作者也是这样做的。
猜你喜欢
  • 1970-01-01
  • 2011-12-24
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 2012-07-03
  • 2020-12-26
  • 1970-01-01
相关资源
最近更新 更多