亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

VS2013在右鍵菜單添加命令插件開發

2019-11-17 02:45:09
字體:
來源:轉載
供稿:網友

VS2013在右鍵菜單添加命令插件開發

一、選擇Visual Studio Package模板建立插件項目

由于此功能需要在右鍵菜單上添加命令,所以選擇Visual Studio Package模板,根據模板向導步驟插件項目,在Select VSPackage Options步驟的時候選擇Menu Command選項,如圖-1所示:

圖-1

接下來是設置命令的名稱,如圖-2所示

圖-2

修改Command name的值,將其設置為我們要添加到右鍵菜單時的名稱。Command ID可選擇是否修改,值是一個十六進制數,由于標識我們的添加的命令。按照模板向導建立好插件項目后,按F5運行插件項目,此時VS會新建一個實驗實例,點擊工具菜單,可以看到已經有一個命令添加到工具菜單里了,如名稱My Command name(如果沒有修改Command name的值得話)如圖-3所示:

圖-3

點擊該命令的時候會彈出一個提示框?,F在有兩個疑問:

1、命令是如何與具體的功能關聯?

2、該命令是如何添加到工具菜單?

對于第一個疑問:我們可以打開項目下以Package結尾的cs文件,該文件里有一個Initialize方法和一個MenuItemCallback事件處理方法,Package代碼文件只有在我們點擊命令的時候才會被

加載運行。當我們點擊命令的時候會依次調用構造函數、Initialize方法、MenuItemCallBack事件處理方法,MenuItemCallBack事件處理方法就是在Initialize方法里與我們的命令進行關聯。

對于第二個疑問:在項目的文件里我們可以找到一個以vsct(Visual Studio Command Table)為后綴的文件,命令就是通過該文件添加到工具菜單下的,項目在編譯的時候會將該文件編譯為二進制文件。

二、vsct文件簡介

在vsct文件里,我們的菜單命令使用Button元素來表示的,如圖-3所示:

圖-4

Button元素的guid和id屬性是該命令的唯一標識,這兩個屬性值分別在項目的Guids.cs和PkgCmdID.cs文件里定義了,PRiority表示命令在目標菜單的排列優先級。Parent子元素表示要將我們的命令添加到哪個菜單下面,如工具、幫助、右鍵菜單,id屬性的值是Group元素的id屬性值,如圖-4所示。Icon元素是命令前的小圖標,其屬性值是在GuidSymbol元素定義的,如圖-6所示。

圖-5

Group元素定義了目標菜單的guid和id,也可以將圖-4的guid和id換成guidSHLMainMenu和IDM_VS_MENU_TOOLS,這兩種效果是一樣的,都是將命令添加到右鍵菜單里。如果要按照圖-4的方式設置guid和id值的話,需要事先知道目標菜單的guid和id值,并且要在Sysmbols元素里定義guid和id,如圖-5所示:

圖-6

除了紅色框里的元素是我們自己定義的,其他的都是向導自動生成。那么為什么使用guidSHLMainMenu和IDM_VS_MENU_TOOLS作為guid和id兩個屬性的值的時候就不需要在Sysmbols元素里定義了呢?因為這兩個元素的值已經在stdidcmd.h和vsshlids.h(C:/Program Files (x86)/Microsoft Visual Studio 12.0/VSSDK/VisualStudioIntegration/Common/Inc)這兩個文件里定義了,而這兩個文件已經在vsct文件的開頭就已經使用Extern元素引入了,所以就不需要我們再去定義了。

三、如何獲取目標菜單的guid和id值

1、打開注冊表編輯器(打開運行窗口,輸入regedit),在[HKEY_CURRENT_USER/Software/Microsoft/VisualStudio/12.0/General]找到該路徑,右擊-新建-DWord(32-位)值(D),建立一個注冊文件,將其命名為EnableVSipLogging,并將其值改為1。按下Ctrl+Shift,用鼠標點擊VS里的菜單,就會彈出一個VSDebug Message窗口,如圖-6所示:

圖-7

其中Guid和CmdID值就是我們需要的,NameLoc表示我們點擊的菜單名稱。

四、設置命令只在xml文件的右鍵菜單里顯示

由于命令關聯的操作都是在點擊命令的時候才調用的,所以要實現此功能需要四個步驟才能實現:

1、在Button元素加入子元素<CommandFlag>DynamicVisibility</CommandFlag>

2、為Package類加入特性ProvideAutoLoad,該特性表示當滿足條件的時候,事先加載該類里的相關運行。而條件是由該特性的構造函數來設置的,相關的條件已經定義為UIContextGuids80抽象類的常量字段了。

3、將Initialize方法里的MenuCommand類改為OleMenuCommand類,并訂閱OleMenuCommand類實例的BeforeQueryStatus事件,如圖-8所示:

圖-8

4、在BeforeQueryStatus事件處理函數里顯示控制操作,如控制命令只在xml文件的右鍵菜單里才能顯示,代碼如下所示:

 1 private void menuItem_BeforeQueryStatus(object sender, EventArgs e) 2 { 3     OleMenuCommand menuCommand = sender as OleMenuCommand; 4     if (menuCommand != null) 5     { 6     IntPtr hierarchyPtr, selectionContainerPtr; 7        uint projectItemId; 8        IVsMultiItemSelect mis; 9        IVsMonitorSelection monitorSelection = (IVsMonitorSelection)Package.GetGlobalService(typeof(SVsShellMonitorSelection));10        monitorSelection.GetCurrentSelection(out hierarchyPtr, out projectItemId, out mis, out selectionContainerPtr);11 12        IVsHierarchy hierarchy = Marshal.GetTypedObjectForIUnknown(hierarchyPtr, typeof(IVsHierarchy)) as IVsHierarchy;13        if (hierarchy != null)14     {15       object value;16           hierarchy.GetProperty(projectItemId, (int)__VSHPROPID.VSHPROPID_Name, out value);17 18           if (value != null && value.ToString().EndsWith(".xml", StringComparison.OrdinalIgnoreCase))19           {20             menuCommand.Visible = true;21           }22           else23           {24             menuCommand.Visible = false;25           }26     }27  }28 }

到此,在xml文件的右鍵菜單里添加命令的功能已經實現。如圖-9所示:

圖-9

五、為命令添加關聯功能

添加功能可以在MenuItemCallBack事件處理函數里進行操作,需要判斷當前的xml文件是否是新建的,如果是需要加上根元素,為了防止用戶是在根元素所在行的后面點擊命令(這樣就找不到根元素),所以在開始查找操作之前需要將光標移到第一行,然后根據查找的結果判斷是否需要添加根元素。如果是新建的xml文件的話可以直接將xml元素信息添加到第一行后面,如果已經存在根元素,則將根元素的結束元素替換成xml元素信息,代碼如下所示:

DTE dte = ServiceProvider.GlobalProvider.GetService(typeof(DTE)) as DTE;if (dte == null)  return;TextSelection ts = dte.ActiveDocument.Selection as TextSelection;//防止用戶在</mappings>結束符后進行操作,在結束符后操作的的FindText方法返回的結果為falsets.MoveToLineAndOffset(1, 1);bool result = ts.FindText("</mappings>",(int)vsFindOptions.vsFindOptionsMatchWholeWord);if (!result){  if (ts.ActivePoint.Line == 1)  {    ts.EndOfLine();       ts.NewLine();  }  string str = "<mappings>/r/n" + sb.ToString();  ts.Insert(str);}else{  //需要添加此操作,否則不會替換成功  ts.SelectAll();  ts.ReplacePattern("</mappings>", sb.ToString(), (int)vsFindOptions.vsFindOptionsMatchWholeWord);}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美精品激情blacked18| 国产丝袜视频一区| 国产精品99一区| 亚洲综合精品一区二区| 最近中文字幕日韩精品| 亚洲自拍偷拍色图| 亚洲一区二区三区在线视频| 亚洲欧美中文字幕| 2025国产精品视频| 性欧美暴力猛交69hd| 视频一区视频二区国产精品| 欧美性生交xxxxx久久久| 91精品国产亚洲| 国产精品69精品一区二区三区| 国产精品美女主播| 国产成人在线精品| 黄色成人在线免费| 国产精品九九久久久久久久| 91午夜理伦私人影院| 最新国产精品亚洲| 91午夜在线播放| 亚洲影视九九影院在线观看| 亚洲精品第一页| 久久久久久91| 久久精视频免费在线久久完整在线看| 亚洲精品美女在线观看| 欧美亚洲日本网站| 热99久久精品| 国产精品旅馆在线| 国产欧亚日韩视频| 精品露脸国产偷人在视频| 欧洲s码亚洲m码精品一区| 亚洲老头老太hd| 欧美激情按摩在线| 日韩欧美在线中文字幕| 精品国模在线视频| 4438全国成人免费| 一区二区三区高清国产| 亚洲成人网在线观看| 国产精品专区第二| 欧美成人免费小视频| 亚洲免费av片| 在线精品91av| 国产精品自拍网| 色综合视频一区中文字幕| 欧美性xxxxx极品娇小| 日本免费在线精品| 欧美一区在线直播| 日韩av免费看| 欧美专区国产专区| 日本中文字幕成人| 久久久精品国产一区二区| 国产精品久久久久久久久久三级| 欧美激情一区二区久久久| 日韩av电影手机在线| 91极品视频在线| 久久成人av网站| 欧美激情视频一区二区| 91精品国产综合久久香蕉最新版| 日韩中文字幕第一页| 国产精品香蕉av| 国产精品一区二区在线| 国产91免费观看| 欧美高清视频一区二区| 久久久久久久91| 中文字幕精品一区久久久久| 亚洲国产三级网| 欧美人与性动交| 亚洲精品一区二三区不卡| 啊v视频在线一区二区三区| 欧美激情亚洲自拍| 色噜噜亚洲精品中文字幕| 亚洲品质视频自拍网| 精品中文字幕乱| 亚洲高清不卡av| 成人免费视频在线观看超级碰| 91久久久亚洲精品| 精品久久久久久国产91| 国产极品jizzhd欧美| 国内精品视频一区| 中文字幕精品av| 亚洲自拍偷拍第一页| 97香蕉超级碰碰久久免费软件| 久久伊人精品视频| 欧美精品xxx| 91精品中国老女人| 成人天堂噜噜噜| 久久精品一偷一偷国产| 国产视频在线观看一区二区| 亚洲精品综合久久中文字幕| 亚洲人成人99网站| 中文字幕久久亚洲| 久久中文字幕一区| 91精品国产综合久久男男| 国产91精品久久久| 国产日韩精品在线播放| 国产成人av在线播放| 亚洲精品视频久久| 欧美极品少妇xxxxⅹ喷水| 久久久成人精品视频| 亚洲免费视频观看| 91影院在线免费观看视频| 国产主播欧美精品| 色在人av网站天堂精品| 136fldh精品导航福利| 日本人成精品视频在线| 国产精品视频免费观看www| 亚洲视频在线观看视频| 久久99精品视频一区97| 97视频免费看| 91精品国产777在线观看| 久久综合久久八八| 色噜噜狠狠色综合网图区| 国产一区二区在线播放| 色偷偷偷综合中文字幕;dd| 91大神在线播放精品| 91久久精品一区| 红桃视频成人在线观看| 中文字幕在线精品| 91亚洲国产成人精品性色| 欧美电影电视剧在线观看| 最近中文字幕日韩精品| 性欧美视频videos6一9| 北条麻妃在线一区二区| xxxx性欧美| 激情久久av一区av二区av三区| 欧美国产日本在线| 午夜精品视频在线| 亚洲国产精品中文| 亚洲人成在线观看网站高清| 亚洲精品国精品久久99热| 国产精品一区二区三区毛片淫片| 欧美一区二粉嫩精品国产一线天| 欧美日韩精品国产| 91色p视频在线| 免费不卡欧美自拍视频| 超在线视频97| 久久不射电影网| 欧美另类99xxxxx| 日本免费久久高清视频| 热99精品只有里视频精品| 亚洲综合精品伊人久久| 日韩精品中文在线观看| 亚洲国产精品电影在线观看| 亚洲视频在线播放| 日韩在线视频线视频免费网站| 亚洲网址你懂得| 欧美中文字幕在线观看| 伦理中文字幕亚洲| 欧美亚洲视频一区二区| 91在线|亚洲| 日本精品久久电影| 亚洲第一av网站| 欧美极品少妇全裸体| 欧美日韩午夜视频在线观看| 欧美性感美女h网站在线观看免费| 中文字幕日韩免费视频| 日韩成人在线观看| 精品国产自在精品国产浪潮| 92国产精品久久久久首页| 国产中文欧美精品| 国产亚洲精品激情久久| 色妞久久福利网| 久久久精品影院|