Я работаю над созданием расширения базового языкового сервиса
Ниже приведен код языковой службы
[ComVisible(true)]
[Guid("5CE7002C-0B61-47AB-9B99-EA0F62E0CE42")]
class CustomLanguageService : LanguageService
{
public const string LanguageName = "Custom Language";
public const string LanguageExtension = ".kav";
private LanguagePreferences _preferences;
public override string Name
{
get
{
return LanguageName;
}
}
public override LanguagePreferences GetLanguagePreferences()
{
if (this._preferences == null)
{
this._preferences = new LanguagePreferences(this.Site, typeof(CustomLanguageService).GUID, this.Name);
this._preferences.Init();
this._preferences.EnableCommenting = true;
}
return this._preferences;
}
public override IScanner GetScanner(IVsTextLines buffer)
{
return null;
}
public override AuthoringScope ParseSource(ParseRequest req)
{
return null;
}
public override string GetFormatFilterList()
{
return "Custom Language (*.kav)\n*.kav";
}
public override Source CreateSource(IVsTextLines buffer)
{
return new CustomLanguageSource(this, buffer, this.GetColorizer(buffer));
}
}
Это мой код пакета
[PackageRegistration(UseManagedResourcesOnly = true)]
[DefaultRegistryRoot("Software\\Microsoft\\VisualStudio\\10.0")]
[ProvideObject(typeof(GeneralPropertyPage))]
[ProvideProjectFactory(typeof(MyCustomProjectFactory), "My Custom Project", "My Custom Project Files (*.myproj);*.myproj", "myproj", "myproj", @"..\..\Templates\Projects\MyCustomProject", LanguageVsTemplate = "MyCustomProject", NewProjectRequireNewFolderVsTemplate = false)]
[ProvideProjectItem(typeof(MyCustomProjectFactory), "My Items", @"..\..\Templates\ProjectItems\MyCustomProject", 500)]
[Guid(GuidStrings.guidCustomProjectPkgString)]
[ProvideService(typeof(CustomLanguageService))]
[ProvideLanguageExtension(typeof(CustomLanguageService), CustomLanguageService.LanguageExtension)]
[ProvideLanguageService(typeof(CustomLanguageService), CustomLanguageService.LanguageName, 0, EnableCommenting = true)]
public sealed class CustomProjectPackage : ProjectPackage
{
private CustomLanguageService _customLanguageService;
#region Overridden Implementation
protected override void Initialize()
{
base.Initialize();
this.RegisterProjectFactory(new MyCustomProjectFactory(this));
_customLanguageService = new CustomLanguageService();
_customLanguageService.SetSite(this);
IServiceContainer serviceContainer = (IServiceContainer)this;
serviceContainer.AddService(typeof(CustomLanguageService), _customLanguageService, true);
}
public override string ProductUserContext
{
get { return "CustomProj"; }
}
#endregion
}
В контекстном меню редактора отображаются меню «Перейти к определению», «Перейти к объявлению» и «Перейти к справке».
![Editor Right Click Menu Options](https://i.stack.imgur.com/mTwWO.png)
Поскольку я не реализую их сейчас, мне не нужны эти опции.
Я попытался отключить меню с помощью функций IOleCommandTarget.QueryStatus и IOleCommandTarget.Exec. Однако при этом скрываются только меню «Перейти к определению» и «Перейти к объявлению», а «Перейти к справке» остается видимым. Я использую следующий код, чтобы скрыть их:
int IOleCommandTarget.QueryStatus(ref Guid pguidCmdGroup, uint cCmds, OLECMD[] prgCmds, IntPtr pCmdText)
{
if (Microsoft.VisualStudio.Project.VsMenus.guidStandardCommandSet97 == pguidCmdGroup)
{
switch ((uint)prgCmds[0].cmdID)
{
case (uint)VsCommands.GotoDecl:
case (uint)VsCommands.GotoDefn:
case (uint)VsCommands.GotoRef:
prgCmds[0].cmdID |= (uint)QueryStatusResult.NOTSUPPORTED | (uint)QueryStatusResult.INVISIBLE;
return VSConstants.S_OK;
}
}
return _commandTarget.QueryStatus(ref pguidCmdGroup, cCmds, prgCmds, pCmdText);
}
Есть ли лучший способ через сам языковой сервис, который помогает мне отключить это?