Поскольку в Visual Studio 2008 имеется более одной панели команд с именем Project
, вам нужно найти правильную панель для вставки кнопки. К счастью, есть абсолютно простой, разумный и интуитивно понятный способ сделать это.
1. Нахождение уникального идентификатора командной строки
Откройте редактор реестра и перейдите к HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\9.0\General
. Создайте новое значение DWORD с именем EnableVSIPLogging
и установите значение 1
.
Это позволяет вам определять уникальный GUID и ID команды панели команд, щелкая правой кнопкой мыши элемент управления, в который вы хотите вставить элемент управления, пока нажаты модификаторы SHIFT и CTRL. Это вызовет окно сообщения, подобное этому:
Скопируйте содержимое сообщения, нажав CTRL + C, и вставьте его где-нибудь в текстовое поле. Запишите значения Guid
и CmdID
.
2. Извлечение командной строки по Guid и CmdID
Вы можете использовать следующий фрагмент кода для извлечения панели команд из значений, определенных выше:
private CommandBar FindCommandBar(Guid guidCmdGroup, uint menuID)
{
IOleServiceProvider sp = (IOleServiceProvider)fApplicationObject;
Guid guidSvc = typeof(IVsProfferCommands).GUID;
Object objService;
sp.QueryService(ref guidSvc, ref guidSvc, out objService);
IVsProfferCommands vsProfferCmds = (IVsProfferCommands)objService;
return vsProfferCmds.FindCommandBar(IntPtr.Zero, ref guidCmdGroup, menuID) as CommandBar;
}
[ComImport, Guid("6D5140C1-7436-11CE-8034-00AA006009FA"), InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
internal interface IOleServiceProvider
{
[PreserveSig]
int QueryService([In]ref Guid guidService, [In]ref Guid riid, [MarshalAs(UnmanagedType.Interface)] out System.Object obj);
}
Убедитесь, что панели команд правильно инициализированы перед вызовом метода FindCommandBar
, в противном случае вызов завершится ошибкой с ComException
(HResult E_FAIL). Простой способ сделать это:
private void EnsureInitialized()
{
var menuBar = ((CommandBars)fApplicationObject.CommandBars)["MenuBar"];
}
Источник: http://blogs.msdn.com/b/dr._ex/archive/2007/04/17/using-ivsproffercommands-to-retrieve-a-visual-studio-commandbar.aspx