Befehlsimplementierung
Um einen Befehl in einem VSPackage zu implementieren, müssen Sie die folgenden Aufgaben ausführen:
Richten Sie in der VSCT-Datei eine Befehlsgruppe ein, und fügen Sie ihn dann hinzu. Weitere Informationen finden Sie unter Visual Studio-Befehlstabellendateien (VSCT).For more information, see Visual Studio command table (.vsct) files.
Registrieren Sie den Befehl bei Visual Studio.
Implementieren Sie den Befehl.
In den folgenden Abschnitten wird erläutert, wie Befehle registriert und implementiert werden.
Registrieren von Befehlen mit Visual Studio
Wenn ihr Befehl in einem Menü angezeigt werden soll, müssen Sie den ProvideMenuResourceAttribute VSPackage hinzufügen und als Wert entweder den Namen des Menüs oder dessen Ressourcen-ID verwenden.
[ProvideMenuResource("Menus.ctmenu", 1)]
public sealed class MyPackage : Package
{
// ...
}
Darüber hinaus müssen Sie den Befehl bei der OleMenuCommandService. Sie können diesen Dienst mithilfe der GetService Methode abrufen, wenn Ihr VSPackage von Package.
OleMenuCommandService mcs = GetService(typeof(IMenuCommandService)) as OleMenuCommandService;
if (mcs is not null)
{
// Create the command for the menu item.
CommandID menuCommandID = new CommandID(guidCommandGroup, myCommandID);
MenuCommand menuItem = new MenuCommand(MenuItemCallback, menuCommandID);
mcs.AddCommand(menuItem);
}
Implementieren von Befehlen
Es gibt eine Reihe von Möglichkeiten zum Implementieren von Befehlen. Wenn Sie einen statischen Menübefehl wünschen, bei dem es sich um einen Befehl handelt, der immer auf die gleiche Weise und im gleichen Menü angezeigt wird, erstellen Sie den Befehl mithilfe MenuCommand der in den Beispielen im vorherigen Abschnitt gezeigten. Zum Erstellen eines statischen Befehls müssen Sie einen Ereignishandler bereitstellen, der für die Ausführung des Befehls verantwortlich ist. Da der Befehl immer aktiviert und sichtbar ist, müssen Sie den Status für Visual Studio nicht angeben. Wenn Sie den Status eines Befehls je nach bestimmten Bedingungen ändern möchten, können Sie den Befehl als Instanz der OleMenuCommand Klasse erstellen und im Konstruktor einen Ereignishandler zum Ausführen des Befehls und einen QueryStatus
Handler bereitstellen, um Visual Studio zu benachrichtigen, wenn sich der Status des Befehls ändert. Sie können auch als Teil einer Befehlsklasse implementieren IOleCommandTarget oder implementieren IVsHierarchy , wenn Sie einen Befehl als Teil eines Projekts bereitstellen. Die beiden Schnittstellen und die OleMenuCommand Klasse weisen alle Methoden auf, mit denen Visual Studio über eine Änderung des Status eines Befehls und andere Methoden benachrichtigt wird, die die Ausführung des Befehls bereitstellen.
Wenn dem Befehlsdienst ein Befehl hinzugefügt wird, wird er zu einer Kette von Befehlen. Wenn Sie die Statusbenachrichtigungs- und Ausführungsmethoden für den Befehl implementieren, müssen Sie nur für diesen bestimmten Befehl bereitstellen und alle anderen Fälle an die anderen Befehle in der Kette übergeben. Wenn Sie den Befehl nicht übergeben (in der Regel durch Zurückgeben OLECMDERR_E_NOTSUPPORTED), funktioniert Visual Studio möglicherweise nicht mehr ordnungsgemäß.
QueryStatus-Methoden
Wenn Sie entweder die QueryStatus Methode oder die QueryStatusCommand Methode implementieren, überprüfen Sie die GUID des Befehlssatzes, zu dem der Befehl gehört, und die ID des Befehls. Befolgen Sie diese Richtlinien:
Wenn die GUID nicht erkannt wird, muss die Implementierung einer der beiden Methoden zurückgegeben werden OLECMDERR_E_UNKNOWNGROUP.
Wenn Die Implementierung einer der beiden Methoden die GUID erkennt, den Befehl jedoch nicht implementiert hat, sollte die Methode zurückgegeben werden OLECMDERR_E_NOTSUPPORTED.
Wenn die Implementierung einer der beiden Methoden sowohl die GUID als auch den Befehl erkennt, sollte die Methode das Feld "Command-Flags" jedes Befehls (im
prgCmds
Parameter) mithilfe der folgenden OLECMDF Flags festlegen:OLECMDF_SUPPORTED
: Der Befehl wird unterstützt.OLECMDF_INVISIBLE
: Der Befehl sollte nicht sichtbar sein.OLECMDF_LATCHED
: Der Befehl wird aktiviert und scheint aktiviert zu sein.OLECMDF_ENABLED
: Der Befehl ist aktiviert.OLECMDF_DEFHIDEONCTXTMENU
: Der Befehl sollte ausgeblendet werden, wenn er in einem Kontextmenü angezeigt wird.OLECMDF_NINCHED
: Der Befehl ist ein Menücontroller und nicht aktiviert, aber seine Dropdownmenüliste ist nicht leer und ist weiterhin verfügbar. (Dieses Kennzeichen wird selten verwendet.)
Wenn der Befehl in der VSCT-Datei mit dem
TextChanges
Flag definiert wurde, legen Sie die folgenden Parameter fest:Legen Sie das
rgwz
Element despCmdText
Parameters auf den neuen Text des Befehls fest.Legen Sie das
cwActual
Element despCmdText
Parameters auf die Größe der Befehlszeichenfolge fest.
Stellen Sie außerdem sicher, dass der aktuelle Kontext keine Automatisierungsfunktion ist, es sei denn, Ihr Befehl ist speziell für die Verarbeitung von Automatisierungsfunktionen vorgesehen.
Geben Sie zurück S_OK, um anzugeben, dass Sie einen bestimmten Befehl unterstützen. Geben Sie für alle anderen Befehle zurück OLECMDERR_E_NOTSUPPORTED.
Im folgenden Beispiel stellt die QueryStatus
Methode zunächst sicher, dass der Kontext keine Automatisierungsfunktion ist, und findet dann die richtige Befehlssatz-GUID und Befehls-ID. Der Befehl selbst ist so festgelegt, dass er aktiviert und unterstützt wird. Es werden keine anderen Befehle 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;
}
Ausführungsmethoden
Die Implementierung der Methode ähnelt der Exec
Implementierung der QueryStatus
Methode. Stellen Sie zunächst sicher, dass der Kontext keine Automatisierungsfunktion ist. Testen Sie dann sowohl die GUID als auch die Befehls-ID. Wenn die GUID oder Befehls-ID nicht erkannt wird, geben Sie zurück OLECMDERR_E_NOTSUPPORTED.
Um den Befehl zu behandeln, führen Sie ihn aus, und geben Sie zurück S_OK , wenn die Ausführung erfolgreich ist. Ihr Befehl ist für die Fehlererkennung und Benachrichtigung verantwortlich; Geben Sie daher einen Fehlercode zurück, wenn die Ausführung fehlschlägt. Im folgenden Beispiel wird veranschaulicht, wie die Ausführungsmethode 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)VSConstants.VSStd2KCmdID.RIGHT)
{
// execute the command
return VSConstants.S_OK;
}
}
}
return Constants.OLECMDERR_E_NOTSUPPORTED;
}