Komut uygulaması

VSPackage'da komut uygulamak için aşağıdaki görevleri gerçekleştirmeniz gerekir:

  1. .vsct dosyasında bir komut grubu ayarlayın ve komutu buna ekleyin. Daha fazla bilgi için bkz . Visual Studio komut tablosu (.vsct) dosyaları.

  2. Komutu Visual Studio'ya kaydedin.

  3. komutunu uygulayın.

Aşağıdaki bölümlerde komutları kaydetme ve uygulama açıklanmaktadır.

Visual Studio ile komutları kaydetme

Komutunuz bir menüde görünecekse, öğesini VSPackage'ınıza eklemeniz ProvideMenuResourceAttribute ve menü adı veya kaynak kimliği olarak bir değer olarak kullanmanız gerekir.

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

Ayrıca komutunu ile OleMenuCommandServicekaydetmeniz gerekir. VSPackage'ınız'dan Packagetüretilmişse yöntemini kullanarak GetService bu hizmeti alabilirsiniz.

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

Komutları uygulama

Komutları uygulamanın birkaç yolu vardır. Her zaman aynı şekilde ve aynı menüde görünen bir komut olan statik menü komutu istiyorsanız, önceki bölümdeki örneklerde gösterildiği gibi komutunu kullanarak MenuCommand oluşturun. Statik komut oluşturmak için, komutu yürütmekle sorumlu olan bir olay işleyicisi sağlamanız gerekir. Komut her zaman etkin ve görünür olduğundan, durumunu Visual Studio'ya sağlamanız gerekmez. Belirli koşullara bağlı olarak bir komutun durumunu değiştirmek istiyorsanız, komutu sınıfın OleMenuCommand bir örneği olarak oluşturabilir ve oluşturucusunda komutu yürütmek için bir olay işleyicisi ve komutun durumu değiştiğinde Visual Studio'ya bildirim göndermek için bir QueryStatus işleyici sağlayabilirsiniz. Bir komut sınıfının parçası olarak da uygulayabilirsiniz IOleCommandTarget veya bir projenin parçası olarak komut sağlıyorsanız uygulayabilirsiniz IVsHierarchy . İki arabirim ve sınıfın OleMenuCommand tümü, Visual Studio'ya bir komutun durumundaki değişikliği bildiren yöntemlere ve komutun yürütülmesini sağlayan diğer yöntemlere sahiptir.

Komut hizmetine bir komut eklendiğinde, komut zincirinden biri haline gelir. Komutun durum bildirimini ve yürütme yöntemlerini uyguladığınızda, yalnızca söz konusu komutu sağlamaya ve diğer tüm servis taleplerini zincirdeki diğer komutlara geçirmeye dikkat edin. komutunu geçiremezseniz (genellikle döndürerek OLECMDERR_E_NOTSUPPORTED), Visual Studio düzgün çalışmayı durdurabilir.

QueryStatus yöntemleri

yöntemini veya QueryStatusCommand yöntemini uyguluyorsanız, komutun QueryStatus ait olduğu komut kümesinin GUID değerini ve komutun kimliğini denetleyin. Şu yönergeleri izleyin:

  • GUID tanınmıyorsa, her iki yöntemden birini uygulamanız döndürmelidir OLECMDERR_E_UNKNOWNGROUP.

  • Her iki yöntemden birini uygulamanız GUID'yi tanır ancak komutunu uygulamadıysa, yöntemi döndürmelidir OLECMDERR_E_NOTSUPPORTED.

  • İki yöntemden birini uygulamanız hem GUID'yi hem de komutu tanırsa, yöntemin aşağıdaki OLECMDF bayrakları kullanarak her komutun komut bayrakları alanını (parametresindeprgCmds) ayarlaması gerekir:

    • OLECMDF_SUPPORTED: Komutu desteklenir.

    • OLECMDF_INVISIBLE: Komut görünür olmamalıdır.

    • OLECMDF_LATCHED: Komut açık durumdadır ve denetlenmiş gibi görünür.

    • OLECMDF_ENABLED: Komut etkindir.

    • OLECMDF_DEFHIDEONCTXTMENU: Komut bir kısayol menüsünde görünürse gizlenmelidir.

    • OLECMDF_NINCHED: Komut bir menü denetleyicisidir ve etkin değildir, ancak açılan menü listesi boş değildir ve hala kullanılabilir durumdadır. (Bu bayrak nadiren kullanılır.)

  • Komut bayrağıyla TextChanges .vsct dosyasında tanımlanmışsa aşağıdaki parametreleri ayarlayın:

    • rgwz parametresinin pCmdText öğesini komutun yeni metnine ayarlayın.

    • cwActual parametresinin pCmdText öğesini komut dizesinin boyutuna ayarlayın.

Ayrıca, komutunuz otomasyon işlevlerini işlemek için özel olarak tasarlanmadığı sürece geçerli bağlamın bir otomasyon işlevi olmadığından emin olun.

Belirli bir komutu desteklediğinizi belirtmek için döndürebilirsiniz S_OK. Diğer tüm komutlar için döndürebilirsiniz OLECMDERR_E_NOTSUPPORTED.

Aşağıdaki örnekte yöntemi önce bağlamın QueryStatus bir otomasyon işlevi olmadığından emin olur, ardından doğru komut kümesi GUID'sini ve komut kimliğini bulur. Komutun kendisi etkinleştirilecek ve desteklenecek şekilde ayarlanmıştır. Başka komut desteklenmez.

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

Yürütme yöntemleri

yönteminin Exec uygulanması, yönteminin uygulanmasına QueryStatus benzer. İlk olarak, bağlamın bir otomasyon işlevi olmadığından emin olun. Ardından hem GUID hem de komut kimliği için test edin. GUID veya komut kimliği tanınmıyorsa döndür.OLECMDERR_E_NOTSUPPORTED

Komutu işlemek için yürütür ve yürütme başarılı olursa döndürür S_OK . Komutunuz hata algılama ve bildirimden sorumludur; bu nedenle, yürütme başarısız olursa bir hata kodu döndürür. Aşağıdaki örnekte yürütme yönteminin nasıl uygulanması gerektiği gösterilmektedir.

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