命令的實作
如需 Visual Studio 2017 的最新文件請參閱 Visual Studio 2017 文件。
若要在 VSPackage 中實作的命令,您必須執行下列工作︰
在.vsct 檔案中,設定命令群組,然後將命令。 如需詳細資訊,請參閱Visual Studio 命令資料表 (。Vsct) 檔案'
註冊 Visual Studio 命令。
實作命令。
下列各節說明如何註冊和實作命令。
註冊使用 Visual Studio 命令
如果您的命令就會出現在功能表上,您必須增加ProvideMenuResourceAttribute至 VSPackage,並使用值可能是功能表的名稱或其資源識別碼。
[ProvideMenuResource("Menus.ctmenu", 1)]
...
public sealed class MyPackage : Package
{.. ..}
此外,您必須註冊與命令OleMenuCommandService。 您可以使用,以取得這項服務GetService方法如果 VSPackage 衍生自封裝。
OleMenuCommandService mcs = GetService(typeof(IMenuCommandService)) as OleMenuCommandService;
if ( null != mcs )
{
// Create the command for the menu item.
CommandID menuCommandID = new CommandID(guidCommandGroup, myCommandID);
MenuCommand menuItem = new MenuCommand(MenuItemCallback, menuCommandID );
mcs.AddCommand( menuItem );
}
實作命令
有數種方式來實作命令。 如果您想要靜態功能表命令,也就是一律會顯示相同方式,且在相同的功能表上的命令,建立命令使用MenuCommand上一節中的範例所示。 若要建立靜態命令,您必須提供事件處理常式負責執行命令。 命令一定是啟用的可見的因為您沒有 Visual studio 提供它的狀態。 如果您想要變更命令,以根據特定條件的狀態,您可以建立命令的執行個體OleMenuCommand類別,並在其建構函式,會提供事件處理常式來執行命令和命令的狀態變更時通知 Visual Studio 的查詢狀態處理常式。 您也可以實作IOleCommandTarget命令類別或一部分,您可以實作IVsHierarchy如果您提供的命令為專案的一部分。 兩個介面和OleMenuCommand類別所有具有通知的命令,狀態變更的 Visual Studio 的方法和其他方法來執行命令。
當命令加入至命令的服務時,它會變成的命令鏈結的其中一個。 當您實作命令的狀態通知和執行方法時,負責提供只針對該特定命令,以及傳遞至其他命令的所有其他情況下鏈結中。 如果您無法將其傳遞命令 (通常是藉由傳回OLECMDERR_E_NOTSUPPORTED),Visual Studio 可能會停止正常運作。
查詢狀態方法
如果您實作QueryStatus方法或QueryStatusCommand方法中,檢查的命令集命令所屬的 GUID 和命令的識別碼。 請遵循這些方針:
如果無法辨識 GUID,這兩種方法的實作必須傳回OLECMDERR_E_UNKNOWNGROUP。
如果這兩種方法的實作可辨識的 GUID,但尚未實際實作命令,則這個方法應傳回OLECMDERR_E_NOTSUPPORTED。
如果這兩種方法的實作可辨識的 GUID 和命令,則方法應該設定的每個命令的命令旗標] 欄位 (在
prgCmds
參數) 使用下列旗標︰OLECMDF_SUPPORTED如果支援該命令。
OLECMDF_INVISIBLE如果命令不應該為可見。
OLECMDF_LATCHED如果命令切換為開,似乎已檢查。
OLECMDF_ENABLED如果此命令會啟用。
OLECMDF_DEFHIDEONCTXTMENU如果應該隱藏命令,如果出現在捷徑功能表。
OLECMDF_NINCHED如果命令功能表控制站,且未啟用,但其下拉式選單清單不是空的以及仍然可用。 (這個旗標是很少使用)。
如果命令定義在使用.vsct 檔
TextChanges
旗標,設定下列參數︰設定
rgwz
元素pCmdText
參數,以新的命令文字。設定
cwActual
元素pCmdText
參數的命令字串的大小。
也請確定目前的內容不是 automation 函式,除非您的命令特別用於處理自動化功能。
若要指出您是否支援特定的命令,傳回S_OK。 對於所有其他的命令會傳回OLECMDERR_E_NOTSUPPORTED。
在下列範例中,查詢狀態方法會先確定內容不是 automation 函式,則會尋找正確的命令集 GUID 和命令 id。 命令本身設定為啟用,而且支援。 不支援任何其他命令。
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;
}
}
執行方法
執行方法的實作類似於查詢狀態方法的實作。 首先,請確定您的內容不是 automation 函式。 然後測試 GUID 和命令 id。 如果 GUID 或無法辨識的命令 ID,傳回OLECMDERR_E_NOTSUPPORTED。
若要處理命令,執行它,並傳回S_OK如果執行成功。 您的命令會負責錯誤偵測和通知。如果執行作業失敗,因此,傳回錯誤碼。 下列範例將示範實作執行方法的方式。
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) uint)VSConstants.VSStd2KCmdID.RIGHT)
{
//execute the command
return VSConstants.S_OK;
}
}
}
return Constants.OLECMDERR_E_NOTSUPPORTED;
}