1

アドオン (具体的には、Visual Studio 2008 SDK 1.1 を介した Visual Studio 2008 統合パッケージ) 内から Visual Studio の出力ウィンドウにテキストを追加する方法を説明するいくつかの記事を読みましたが、その方法の例はありません。出力ウィンドウからテキストを読み取ります。私の目標は、特定のアプリケーション (TRACE 出力および場合によっては stdin/stdout) のデバッグ中に、デバッグ出力ウィンドウからテキストを解析することです。IVsOutputWindowPane インターフェイスには、出力ウィンドウからテキストを読み取るためのメソッドがありません。ドキュメントはそれが可能であることを暗示しているようですが、例を提供していません:

http://msdn.microsoft.com/en-us/library/bb166236(VS.80).aspx

引用: さらに、OutputWindow および OutputWindowPane オブジェクトは、いくつかの高レベルの機能を追加して、出力ウィンドウ ペインの列挙とペインからのテキストの取得を容易にします。

できれば、StreamReader の非同期読み取りと同様に、テキストの新しい行が到着したときに発生するイベントをサブスクライブできるようにしたいと考えています。

4

4 に答える 4

4

それは可能です、それはそれに到達するための長い曲がりくねった道です:

ServiceProvider -> IVsOutputWindow -> GetPane( debugwindow ) -> IVsUserData -> GetData( wpftextviewhost ) -> IWpfTextViewHost -> IWpfTextView -> TextBuffer -> 変更されたイベント。

IServiceProvider別の場所 (vsix 拡張機能など、グローバル サービス プロバイダー) からの VS があり、エラー チェックを行わないとすると、次のようになります。

IVsOutputWindow outWindow = ServiceProvider.GetService(typeof(SVsOutputWindow)) as IVsOutputWindow;
Guid debugPaneGuid = VSConstants.GUID_OutWindowDebugPane;
IVsOutputWindowPane pane;
outWindow.GetPane(ref debugPaneGuid, out pane);
// from here up you'll find in lots of other stackoverflow answers, 

// the stuff from here down is interesting to this question
IVsUserData userData = (IVsUserData)pane;
object o;
Guid guidViewHost = DefGuidList.guidIWpfTextViewHost;
userData.GetData(ref guidViewHost, out o);

IWpfTextViewHost viewHost = (IWpfTextViewHost)o;
IWpfTextView textView = viewHost.TextView;
textView.TextBuffer.Changed += YourTextChangedHandlerHere;

テキスト変更ハンドラーは、出力ウィンドウがさらにデータを取得するたびに呼び出されます。必ずしも行ごとに取得できるとは限りませんが、自分で処理する必要がある大きなチャンクを取得する可能性が高いでしょう。

上記のいくつかは 2010 年の VS には存在していなかった可能性が高いですが、現在は存在しています!

于 2014-04-02T01:02:20.033 に答える
1

VS のデフォルトの動作 (リスナーを明示的に設定しない場合) は、デバッガーの出力ウィンドウにトレース メッセージを表示することです。これは、単純なソリューションが必要で、メッセージで他のアクションを実行しない場合に役立ちます。

残念ながら、これはあなたの場合ではありません。そのため、トレース メッセージを送信 (および保存) するために、トレース リスナーを定義して、それらを読み取ることができるようにする必要があります。トレース リスナはファイル (XML など) にすることも、追加のファイルに煩わされたくない場合は、基本クラス TraceListener からクラスを派生させてカスタム リスナを作成することもできます。

于 2010-03-07T11:10:32.867 に答える
1

あなたが求めることが可能かどうかはわかりません。ただし、アドインをアプリケーションのデバッガーとして登録して、トレース メッセージの出力を取得することができます。これらは通常、OutputDebugString にルーティングされ、次の記事で説明されているようにキャプチャできます: http://www.drdobbs.com/showArticle.jhtml?articleID=184410719。通常の出力は得られず、デバッグのみが行われますが、デバッグされたアプリケーションのテクノロジには依存しません。

于 2010-03-07T13:55:52.450 に答える
0

このページの解決策は、テキストを読むためにテキストを選択します。もっと良い方法があるといいのですが。 最初のコンパイルエラーでVisualC++ 2008ビルドを自動的に停止しますか?

Private Sub OutputWindowEvents_OnPaneUpdated(ByVal pPane As OutputWindowPane) Handles OutputWindowEvents.PaneUpdated
    pPane.TextDocument.Selection.SelectAll()
    Dim Context As String = pPane.TextDocument.Selection.Text
    pPane.TextDocument.Selection.EndOfDocument()
End Sub
于 2010-03-25T05:09:34.663 に答える