Parancs implementálása

Ha a VSPackage-ben szeretne parancsot implementálni, a következő feladatokat kell elvégeznie:

  1. A .vsct fájlban állítson be egy parancscsoportot, majd adja hozzá a parancsot. További információ: Visual Studio command table (.vsct) fájlok.

  2. Regisztrálja a parancsot a Visual Studióban.

  3. Implementálja a parancsot.

A következő szakaszok a parancsok regisztrálását és implementálását ismertetik.

Parancsok regisztrálása a Visual Studióval

Ha a parancs egy menüben jelenik meg, hozzá kell adnia a ProvideMenuResourceAttribute VSPackage-hoz, és értékként kell használnia a menü nevét vagy erőforrás-azonosítóját.

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

Emellett regisztrálnia kell a parancsot a OleMenuCommandService. Ezt a szolgáltatást azzal a GetService metódussal szerezheti be, ha a VSPackage a Package osztályból van származtatva.

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

Parancsok implementálása

A parancsok többféleképpen is implementálhatóak. Ha statikus menüparancsot szeretne, amely egy olyan parancs, amely mindig ugyanúgy és ugyanazon a menün jelenik meg, hozza létre a parancsot MenuCommand az előző szakaszban bemutatott példáknak megfelelően. Statikus parancs létrehozásához meg kell adnia egy eseménykezelőt, amely felelős a parancs végrehajtásáért. Mivel a parancs mindig engedélyezve és látható, nem kell megadnia az állapotát a Visual Studiónak. Ha bizonyos feltételektől függően módosítani szeretné egy parancs állapotát, létrehozhatja a parancsot az OleMenuCommand osztály példányaként, és konstruktorában adjon meg egy eseménykezelőt a parancs végrehajtásához, valamint egy kezelőt QueryStatus , amely értesíti a Visual Studiót a parancs állapotának változásáról. A parancsosztály részeként is implementálható IOleCommandTarget , vagy implementálható IVsHierarchy , ha egy projekt részeként ad meg parancsot. A két felület és az OleMenuCommand osztály mind olyan metódusokkal rendelkezik, amelyek értesítik a Visual Studiót egy parancs állapotának változásáról, és más metódusokkal, amelyek biztosítják a parancs végrehajtását.

Amikor hozzáad egy parancsot a parancsszolgáltatáshoz, az a parancsláncok egyikévé válik. Amikor implementálja a parancs állapotértesítési és végrehajtási módszereit, ügyeljen arra, hogy csak az adott parancsot adja meg, és az összes többi esetet továbbítsa a lánc többi parancsának. Ha nem továbbítja a parancsot (tipikusan a OLECMDERR_E_NOTSUPPORTED visszaadása által), előfordulhat, hogy a Visual Studio nem működik megfelelően.

QueryStatus metódusok

Ha a metódust vagy a QueryStatusQueryStatusCommand metódust implementálja, ellenőrizze annak a parancskészletnek a GUID-azonosítóját, amelyhez a parancs tartozik, valamint a parancs azonosítóját. Kövesse az alábbi irányelveket:

  • Ha a GUID nem ismerhető fel, a metódus implementálásának OLECMDERR_E_UNKNOWNGROUP-t kell visszaadnia.

  • Ha bármelyik metódus implementálása felismeri a GUID-t, de nem implementálta a parancsot, akkor a metódusnak vissza kell térnie OLECMDERR_E_NOTSUPPORTED.

  • Ha bármelyik metódus implementációja felismeri a GUID-t és a parancsot is, akkor a metódusnak az alábbi prgCmds jelölőkkel kell beállítania az összes parancs parancsjelző mezőjét (a OLECMDF paraméterben):

    • OLECMDF_SUPPORTED: A parancs támogatott.

    • OLECMDF_INVISIBLE: A parancs nem lehet látható.

    • OLECMDF_LATCHED: A parancs be van kapcsolva, és úgy tűnik, hogy be van jelölve.

    • OLECMDF_ENABLED: A parancs engedélyezve van.

    • OLECMDF_DEFHIDEONCTXTMENU: A parancsnak néha rejtettnek kell lennie, ha megjelenik egy gyorsmenüben.

    • OLECMDF_NINCHED: A parancs egy menüvezérlő, és nincs engedélyezve, de a legördülő menülista nem üres, és továbbra is elérhető. (Ezt a jelzőt ritkán használják.)

  • Ha a parancsot a .vsct fájlban definiálta a TextChanges jelölővel, állítsa be a következő paramétereket:

    • Állítsa be a pCmdText paraméter rgwz elemét a parancs új szövegére.

    • Állítsa a pCmdText paraméter cwActual elemét a parancssztring méretére.

Győződjön meg arról is, hogy a jelenlegi környezet nem automatizálási függvény, kivéve, ha a parancs kifejezetten az automatizálási függvények kezelésére szolgál.

Ha azt szeretné jelezni, hogy egy adott parancsot támogat, adja vissza S_OK. Az összes többi parancs esetén adja vissza a következőt: OLECMDERR_E_NOTSUPPORTED.

A következő példában a QueryStatus metódus először meggyőződik arról, hogy a környezet nem automatizálási függvény, majd megkeresi a megfelelő parancskészlet GUID-azonosítóját és parancsazonosítóját. Maga a parancs engedélyezve és támogatva van. Más parancsok nem támogatottak.

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

Végrehajtási módszerek

A metódus implementálása hasonlít a ExecQueryStatus metódus implementálására. Először győződjön meg arról, hogy a környezet nem automatizálási függvény. Ezután tesztelje a GUID-t és a parancsazonosítót is. Ha a GUID vagy a parancsazonosító nem ismerhető fel, adja vissza a következőt OLECMDERR_E_NOTSUPPORTED: .

A parancs kezeléséhez hajtsa végre, és adja vissza S_OK , ha a végrehajtás sikeres. A parancs felelős a hibaészlelésért és az értesítésért; ezért hibakódot ad vissza, ha a végrehajtás sikertelen. Az alábbi példa bemutatja, hogyan kell implementálni a végrehajtási módszert.

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