Freigeben über


Befehls-Implementierung

Um einen Befehl in einem VSPackage implementieren, müssen Sie die folgenden Aufgaben ausführen:

  1. In der .vsct-Datei richten Sie eine Befehlsgruppe und fügen Sie dann den Befehl hinzu. Weitere Informationen finden Sie unter (Visual Studio-Befehls-Tabelle. Dateien Vsct)'

  2. Registrieren Sie den Befehl mit Visual Studio.

  3. Implementieren Sie den Befehl.

In den folgenden Abschnitten wird beschrieben, wie Befehle registriert und implementiert.

Registrieren von Befehlen mit Visual Studio

Wenn der Befehl in einem Menü angezeigt wird, müssen Sie ProvideMenuResourceAttribute VSPackage hinzufügen und als Wert verwenden entweder den Namen des Menüs oder dessen Ressource ID.

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

Darüber hinaus müssen Sie den Befehl mit OleMenuCommandServiceregistrieren. Sie können diesen Dienst abrufen, indem Sie die GetService-Methode verwenden, wenn ein VSPackage von Packageabgeleitet ist.

    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 );
    }

Befehle implementieren

Es gibt mehrere Möglichkeiten, um Befehle zu implementieren. Wenn Sie einen statischen Menübefehl soll, der ein Befehl, der immer die gleiche Weise und auf demselben Menü angezeigt wird, erstellen Sie den Befehl, indem Sie MenuCommand wie in den Beispielen im vorherigen Abschnitt verwenden. Um einen statischen Befehl zu erstellen, müssen Sie einen Ereignishandler bereitstellen, der für das Ausführen des Befehls zuständig ist. Da der Befehl immer aktiviert und sichtbar ist, müssen Sie seinen Status nicht an Visual Studio bereitstellen. Wenn Sie den Status eines Befehls je nach bestimmten Bedingungen ändern möchten, können Sie den Befehl erstellen, während eine Instanz der OleMenuCommand-Klasse und in seinem Konstruktor einen Ereignishandler bereitstellen, um den Befehl auszuführen STATUS-Handler Abfrage und einen Visual Studio zu benachrichtigen, wenn sich der Status des Befehls geändert wird. Sie können IOleCommandTarget als Teil einer Befehlsklasse ebenfalls implementieren, oder Sie können IVsHierarchy implementieren, wenn Sie einen Befehl als Teil eines Projekts bereitstellen. Alle zwei Schnittstellen und die OleMenuCommand-Klasse verfügen über Methoden, die Visual Studio einer Änderung des Status eines Befehls melden, während andere Methoden, die die Ausführung des Befehls bereitstellen.

Wenn ein Befehl zum Befehl für hinzugefügt wird, wird er einer Befehlskette. Wenn Sie die Ereignisbenachrichtigung und den Status Hinrichtungsmethoden für den Befehl implementieren, mach's am besten nur die für diesen speziellen Befehl bereitzustellen und alle anderen Fälle an die anderen Befehlen in der Kette weitergeleitet werden. Wenn der Befehl nicht weitergeleitet werden können (in der Regel durch das Zurückgeben einer OLECMDERR_E_NOTSUPPORTED), hält möglicherweise auf Visual Studio ordnungsgemäß funktionieren.

Abfragen-Status-Methoden

Wenn Sie entweder die QueryStatus-Methode oder die QueryStatusCommand-Methode implementieren, suchen Sie nach den GUID des Befehls, der festgelegt wird, das der Befehl und die ID des Befehls gehört. Befolgen Sie die nachstehenden Richtlinien:

  • Wenn die GUID nicht erkannt wird, muss die Implementierung einer Methode OLECMDERR_E_UNKNOWNGROUPzurückgeben.

  • Wenn die Implementierung einer Methode mit dem GUID, verfügt jedoch nicht wirklich implementiert den Befehl erkennt, sollte die Methode OLECMDERR_E_NOTSUPPORTEDzurückgeben.

  • Wenn die Implementierung einer Methode mit dem GUID und der Befehl erkennt, wird die Methode sollte das Befehl Flags im Feld jedes Befehls (Parameter) prgCmds indem sie die folgenden Flags festlegen:

    • OLECMDF_SUPPORTED , wenn der Befehl unterstützt wird.

    • OLECMDF_INVISIBLE , wenn der Befehl nicht sichtbar ist.

    • OLECMDF_LATCHED , wenn der Befehl beendet wird und scheint überprüft worden sein.

    • OLECMDF_ENABLED , wenn der Befehl aktiviert ist.

    • OLECMDF_DEFHIDEONCTXTMENU , wenn der Befehl ausgeblendet wird, wenn er in einem Kontextmenü angezeigt wird.

    • OLECMDF_NINCHED , wenn der Befehl ein Menü controller ist und nicht aktiviert ist, aber seine Liste Dropdownmenü nicht leer ist und ist weiterhin verfügbar. (Dieses Flag wird selten verwendet.)

  • Wenn der Befehl in der .vsct-Datei mit dem TextChanges-Flag definiert wurde, legen Sie die folgenden Parameter an:

    • Legen Sie das rgwz-Element des pCmdText-Parameters an den neuen Text des Befehls.

    • Legen Sie das cwActual-Element des pCmdText-Parameters auf die Größe der Befehlszeichenfolge fest.

Stellen Sie außerdem sicher, dass der aktuelle Kontext keine Automatisierungsfunktion ist, sofern der Befehl ausdrücklich dazu gedacht ist, Makros oder über andere Funktionen zu behandeln.

So geben Sie an, dass Sie einen bestimmten Befehl unterstützen, geben S_OK. Für alle anderen Befehlen OLECMDERR_E_NOTSUPPORTEDzurückgeben.

Im folgenden Beispiel wird sichergestellt STATUS-Methode die Abfrage zunächst sicher, dass der Kontext keine Automatisierungsfunktion ist, sucht das richtige Befehl-festgelegte GUID und die Befehls-ID. Der Befehl selbst ist aktiviert und unterstützt werden. Andere Befehle werden unterstützt.

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;
    }
}

Hinrichtungsmethoden

Implementierung der Ausführung Methode ähnelt Implementierung der Abfrage STATUS-Methode. Zunächst müssen Sie sicherstellen, dass der Kontext keine Automatisierungsfunktion ist. Dann Test für die GUID und die Befehls-ID. Wenn die GUID oder die Befehls-ID nicht erkannt wird, geben Sie OLECMDERR_E_NOTSUPPORTEDzurück.

Um den Befehl zu behandeln, führen Sie ihn aus, und geben Sie S_OK zurück, wenn die Ausführung erfolgreich war oder nicht. Der Befehl ist für Fehlererkennung und - benachrichtigung zuständig. Deshalb geben Sie einen Fehlercode zurück, wenn die Ausführung ein Fehler auftritt. Im folgenden Beispiel wird veranschaulicht, wie die Hinrichtungsmethode implementiert werden soll.

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;
}

Siehe auch

Konzepte

Wie VSPackages Benutzeroberflächenelemente Hinzufügen der IDE

Weitere Ressourcen

Command Routing in VSPackages