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

时间:2014-08-13 11:33:40

标签: c# visual-studio-2013 hotkeys vspackage

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

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

初始化我的VSPackage时,我可以从注册表中读取旧的热键,但是我将它们分配给.vsct文件中定义的菜单命令时出现问题。我可以暂停OleMenuCommand界面和OleMenuCommandService,但是他们没有可以接受键绑定的属性。

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

一个笨重的解决方法是安装程序导入热键,将它们写入.vsct文件,编译文件并在安装过程中将.cto放入MyPackage.Resources.dll。但我宁愿不诉诸这个......

3 个答案:

答案 0 :(得分:0)

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

// 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下次启动时保存并记住,因此无需每次都导入旧的热键。

答案 1 :(得分:0)

由于我不能发表评论[尽管我有50年的系统级编程经验,包括3本MS Press :(]的书籍),我不得不问这样的方式让Shakaron发布更多他的代码我在VS 2015工具菜单中添加了一个简短的菜单命令树(1-4-1元素).dte.Commands的枚举没有显示任何一个。用一个字符串调用Commands.Item(或者"对象"我分配了一个字符串)包含GUID,无论有无{},都会生成无效的参数异常。

因此,要么EnvDTE80界面非常脆弱,文档非常错误,要么Shakaron的解决方案还有一些我们尚未见过的魔力。而且我非常希望这将成为我最后一块拼图......

答案 2 :(得分:0)

回答Shakaron的问题:

  1. 我使用.vsct文件添加1个菜单,其中包含3个命令和1个子菜单,后者又有1个命令。

  2. 使用guid和index参数调用Commands.Item会导致明显相同的无效参数异常。我能够枚举该集合,但我的命令不在集合中。

  3. 我也无法为Bindings赋值的右侧编译代码。但是,当然,我没有那么远,因为我无法找到命令项目。

  4. 这里必须有一个版本依赖。我不怀疑你的代码一年前是否有效,但是我在Win 10上使用VS 2015运行的虚拟副本新版本遇到了我所描述的问题。

    < / LI>