这个问题之前已经有人问过了,但答案是“嗯,这取决于每个应用程序是否支持不同的选项”。不过,当你在记事本、浏览器或其他东西中右键单击某个选项时,它正在构建上下文菜单。应用程序如何做到这一点?为什么我不能添加它?如何添加到突出显示上下文菜单?没有答案总比没有答案好。
答案1
简短回答:如果你添加了新菜单项,当该项目被点击时,程序不知道该做什么。实际上,您必须更改程序代码才能使新菜单项发挥作用。这就是为什么“这取决于每个应用程序”是一个有效的答案。
Windows 与大多数其他操作系统一样,提供了一组用于构建 GUI 程序的功能 - 其中一些是系统的一部分(“创建窗口”),其他一些则主要是为了方便(“绘制一个可点击的按钮”)。
大多数程序都使用这些功能来显示其菜单(常规和上下文)——它们基本上为 Windows 提供项目列表并要求它以菜单的形式显示在屏幕上,并告知程序您选择的内容。
Windows 并不特别关心项目列表的来源。某些菜单由程序本身生成(例如“最近文件”列表);如果不实际重写创建最近文件列表的程序部分,则无法更改这些菜单。其他菜单(例如记事本中的“文件”或“编辑”或“帮助”菜单)是从存储在文件本身中的“资源”创建的.exe
,并且有工具可以编辑此类资源(例如重新排列菜单项或更改程序的图标)。
但如果你使用这样的工具来添加新的菜单项,它们将无法工作,因为程序不知道该怎么办。每个菜单项都没有任何神奇之处,只有一个数字,即“命令 ID”。例如,“复制”在许多程序中很常见,其分配的命令 ID 为 12(“IDM_COPY”),而特定于单个程序(例如“新游戏”)的命令可能为 1234 或 2468 或其他值。当您打开上下文菜单并单击“复制”时,Windows 只会告诉记事本“选择了命令 ID 12”,并且记事本会自行决定何时将选定的文本放入剪贴板。
- 剪切 → ID 11 → 记事本将文本放入剪贴板,然后将其从文档中删除
- 复制 → ID 12 → 记事本将文本放入剪贴板
- 粘贴 → ID 13 → 记事本从剪贴板获取文本,然后将其插入到文档中
- 唱歌 → ID 12 → 记事本将文本放入剪贴板
- 再次复制 → ID 3456 → 记事本不执行任何操作,因为它不知道 ID 3456 是什么意思
附注:以上内容略有简化。记事本中的上下文菜单实际上是由“可编辑文本”控件实现的,它是 Windows 提供的上述实用功能的一部分。但是,主菜单完全是记事本的一部分。
附注:有些程序(通常是那些可以换肤或主题的程序)实际上会自己绘制各种控件 - 这并不难,因为弹出菜单只是一个没有标题栏的窗口。虽然我自己没有看过这类程序的代码,但我认为细节不会有太大变化。