以编程方式为VSPackage菜单命令分配热键

本文关键字:命令 分配 菜单 VSPackage 编程 方式 | 更新日期: 2023-09-27 18:17:43

我正在开发一个新版本的Visual Studio扩展。在旧版本中,热键存储在注册表中,我想将这些设置导入到新版本的软件中。

新版本使用。vsct格式来定义菜单命令,您可以在。vsct文件中分配热键。然而,我不能使用这种机制,因为我想从注册表导入用户设置,而.vsct是一个静态描述。

当我的vpackage初始化时,我可以从注册表中读取旧的热键,但是我有问题将它们分配给.vsct文件中定义的菜单命令。我可以获得OleMenuCommand接口和OleMenuCommandService接口,但是它们没有可以接受键绑定的属性。

如何以编程方式为菜单命令分配热键?

一个笨拙的解决方案是安装程序导入热键,将它们写入.vsct文件,编译该文件,并在安装期间将.cto放入MyPackage.Resources.dll中。

以编程方式为VSPackage菜单命令分配热键

虽然我通过.vsct文件定义命令,但我仍然可以通过EnvDTE访问它们。命令接口。

// The commandGuid has to be the same GUID you use in the .vsct file, HOWEVER, you have to include the braces here
Command command = dte.Commands.Item(commandGuid, commandId);
command.Bindings = new object[] { "Global::Ctrl+Alt+Shift+1" };

它的工作原理。它被保存并在下次Visual Studio启动时记住,所以没有必要每次都导入旧的热键。

由于我不允许评论[尽管我有50年的系统级编程经验,包括为MS Press编写的3本书],我不得不以这种方式要求Shakaron发布更多他的代码。我在VS 2015 Tools菜单中添加了一个简短的菜单命令树(1-4-1元素)。dte的枚举。命令没有显示它们中的任何一个。调用命令。带有包含GUID的字符串(或我为其分配了字符串的"对象")的项,无论是否带有{},都会生成无效参数异常。

所以,要么EnvDTE80接口非常脆弱,要么文档非常错误,要么Shakaron的解决方案有一些我们还没有看到的魔力。我非常希望这将是我拼图的最后一块…

回答Shakaron的问题:

  1. 我使用。vsct文件添加了一个带有3个命令和1个子菜单的菜单,而子菜单又有1个命令。

  2. 调用命令。带有guid和索引参数的项会导致明显相同的无效参数异常。我可以列举这个集合,但是我的命令不在集合中。

  3. 我也无法为Bindings赋值的右侧编译代码。但是,当然,我没有做到这一点,因为我一开始就找不到命令项。

  4. 这里必须有版本依赖。我不怀疑你的代码在一年前是可以工作的,但是我在使用win10上运行的VS 2015的新虚拟箱副本时遇到了我所描述的问题。