命令实现

若要实现在 VSPackage 中的命令,必须执行以下任务:

  1. 在 .vsct 文件中,找到命令组然后添加命令到它。 有关更多信息,请参见 Visual Studio 命令 (表。Vsct) 文件"

  2. 注册 Visual Studio 的命令。

  3. 实现命令。

以下各节演示如何注册和实现这些命令。

注册 Visual Studio 的命令

如果命令是出现在菜单,必须添加 ProvideMenuResourceAttribute 到 VSPackage,并用作值菜单的名称或其资源 ID.

[ProvideMenuResource("Menus.ctmenu", 1)]
...
    public sealed class MyPackage : Package
    {.. ..}

此外,还必须注册 OleMenuCommandService的命令。 ,如果 VSPackage 从派生 Package,您可以获取此服务通过使用 GetService 方法。

    OleMenuCommandService mcs = GetService(typeof(IMenuCommandService)) as OleMenuCommandService;
    if ( null != mcs )
    {
        // Create the command for the menu item.
        CommandID menuCommandID = new CommandID(guidCommandGroup, myCommandID);
        MenuCommand menuItem = new MenuCommand(MenuItemCallback, menuCommandID );
        mcs.AddCommand( menuItem );
    }

实现命令

有多种方式可实现这些命令。 如果需要一个静态菜单命令,该命令始终显示相同的方式与在同一个菜单,请创建命令使用 MenuCommand 如示例中所演示前面的节。 若要创建静态命令,必须提供负责执行命令的事件处理程序。 由于命令始终启用和可见的,因此您不必提供其状态写入到 Visual Studio。 如果要基于特定条件更改命令的状态,可以创建命令,当 OleMenuCommand 类的实例,然后在其构造函数,提供一个事件处理程序执行命令和查询状态处理程序通知 Visual Studio 中,在命令的状态更改时发生。 您还可以实现 IOleCommandTarget 为命令类的一部分或,可以实现 IVsHierarchy 作为项目的一部分,因此,如果您提供命令。 两个接口和 OleMenuCommand 类都具有通知一个更改 Visual Studio 在命令中的状态的方法并提供命令的执行的其他方法。

当命令添加到命令服务时,它成为一个指挥系统。 当您执行命令时的状态通知和实现方法,请注意仅提供该特定命令和管其他用例成一个链中的其他命令。 如果无法传递命令 (通常通过返回 OLECMDERR_E_NOTSUPPORTED), Visual Studio 会停止正常工作。

查询状态方法

如果执行 QueryStatus 方法或 QueryStatusCommand 方法,请检查设置命令的 GUID 命令属于和命令的 ID。 请遵循这些指导:

  • 如果 GUID 不识别,任一方法的实现必须返回 OLECMDERR_E_UNKNOWNGROUP

  • 如果任一方法的实现识别 GUID,但实际上未实现命令,则方法应返回 OLECMDERR_E_NOTSUPPORTED

  • 如果任一方法的实现识别 GUID 和命令,则方法应将每个命令的命令标志字段 (在 prgCmds 参数) 使用以下标志,例如:

  • 如果命令在具有 TextChanges 标志的 .vsct 文件中定义,设置以下参数:

    • 设置 pCmdText 参数的 rgwz 元素到命令的新文本。

    • 设置 pCmdText 参数的 cwActual 元素到命令字符串的大小。

还请确保当前上下文不是自动化功能,因此,除非该命令专用于处理宏或其他自动化功能。

若要指示您支持特定命令,则返回 S_OK。 对于其他命令,则返回 OLECMDERR_E_NOTSUPPORTED

在下面的示例中,查询状态方法首先确保上下文不是自动化功能,然后找到正确的命令设置的 GUID 和命令 ID. 命令来设置启用和支持。 其他命令不受支持。

public int QueryStatus(ref Guid pguidCmdGroup, uint cCmds, OLECMD[] prgCmds, IntPtr pCmdText)
{
    if (!VsShellUtilities.IsInAutomationFunction(m_provider.ServiceProvider))
    {
        if (pguidCmdGroup == VSConstants.VSStd2K && cCmds > 0)
        {
            // make the Right command visible 
            if ((uint)prgCmds[0].cmdID == (uint)VSConstants.VSStd2KCmdID.RIGHT)
            {
                prgCmds[0].cmdf = (int)Microsoft.VisualStudio.OLE.Interop.Constants.MSOCMDF_ENABLED | (int)Microsoft.VisualStudio.OLE.Interop.Constants.MSOCMDF_SUPPORTED;
                return VSConstants.S_OK;
            }
        }
        return Constants.OLECMDERR_E_NOTSUPPORTED;
    }
}

执行方法

执行方法的实现类似于查询状态方法的实现。 首先,确保上下文不是自动化功能。 然后测试 GUID 和命令 ID. 如果 GUID 或命令 ID 不识别,则返回 OLECMDERR_E_NOTSUPPORTED

处理,如果执行成功,则该命令,执行并返回 S_OK 。 命令对错误检测和通知负责;因此,因此,如果执行失败,则返回错误代码。 下面的示例演示如何应执行方法。

public int Exec(ref Guid pguidCmdGroup, uint nCmdID, uint nCmdexecopt, IntPtr pvaIn, IntPtr pvaOut)
{
    if (!VsShellUtilities.IsInAutomationFunction(m_provider.ServiceProvider))
    {
        if (pguidCmdGroup == VSConstants.GUID_VSStandardCommandSet97)
        {
             if (nCmdID ==(uint) uint)VSConstants.VSStd2KCmdID.RIGHT)
            {
                //execute the command
                return VSConstants.S_OK;
            }
        }
    }
    return Constants.OLECMDERR_E_NOTSUPPORTED;
}

请参见

概念

Vspackage 如何将用户界面元素到 IDE

其他资源

Command Routing in VSPackages