VisualStudio 擴充套件開發 獲得輸出視窗內容
本文告訴大家如何拿到 VisualStudio 輸出視窗的內容
在上一篇告訴大家如何開發 新增選單 點選的時候可以使用方法,如果需要拿到 VisualStudio 的輸出視窗的內容,如想要開發一個外掛,通過這個工具可以過濾輸出
有很多小夥伴在輸出的時候,想要將所有的內容輸出,然後我就很難看到自己想要看的內容
while (true) { Debug.WriteLine("林德熙是逗比"); }
我想要做一個工具,需要在輸出新增開發者同時只看到自己的輸出,如修改一點輸出的程式碼,判斷如果使用 lindexi:
開始的,就輸出,如果不是就不輸出
while (true) { Debug.WriteLine("lindexi: 林德熙是逗比"); }
現在的問題就是如何拿到 Debug.WriteLine 輸出到 VisualStudio 視窗,於是我就開始研究這個方法
在上一篇部落格的方法通過 Package.GetGlobalService 拿到 DTE 在 VisualStudio 使用了很多事件,輸出到視窗就是一個 OutputWindowEvents 方法,這些沒有直接在文件說到
先建立一些欄位
private DTE _dte; private Events _dteEvents; private OutputWindowEvents _documentEvents;
通過下面的程式碼就可以拿到輸出視窗
private void Execute(object sender, EventArgs e) { ThreadHelper.ThrowIfNotOnUIThread(); _dte = (DTE) Package.GetGlobalService(typeof(SDTE)); _dteEvents = _dte.Events; _documentEvents = _dteEvents.OutputWindowEvents; _documentEvents.PaneUpdated += GetText; } private void GetText(OutputWindowPane pane) { // 這裡的 OutputWindowPane 就是輸出視窗 ThreadHelper.ThrowIfNotOnUIThread(); TextDocument document = pane.TextDocument; EditPoint point = document.StartPoint.CreateEditPoint(); var str = point.GetText(document.EndPoint); }
這裡通過 PaneUpdated 可以拿到有 Pane 更新的事件,於是在 GetText 方法的 GetText 返回的值就是輸出窗口裡面的
這裡為什麼不是輸出視窗而是輸出視窗的 Pane 因為一個輸出視窗是有很多 Pane 的,如原始碼管理,除錯等
這裡的一個就是一個 Pane 都是在輸出窗口裡面
那麼如何確定監聽的是除錯視窗?拿到的每個 Pane 都有一個 GUID 可以通過 IDE GUID 找到除錯視窗的 GUID 判斷當前是除錯視窗
微軟在 VisualStudio 開發大量使用 GUID 的注入方式,通過這個方式的優點是需要知道有這個 GUID 才能拿到介面,同時可以在任意的地方拿到。
在想要通過判斷當前的視窗是除錯的時候,但是小夥伴告訴我,現在有這樣的外掛 Filter Debug Window 我用了一下,發現我需要的功能剛好就是這個工具