出力ウィンドウのテキストは一度書き込まれると読み取り専用になるため、やりたいことを正確に行う簡単な方法はありません。ただし、同様のことを行うのは簡単です。新しいテキストが出力ウィンドウに書き込まれた後にタイムスタンプ行を追加します。これにより、出力ウィンドウがさらに乱雑になりますが、タイミングはわかります。
これがどのように機能するかを次に示します。まず、 Outlook ウィンドウのアクティブ ペインのPaneUpdatedイベントをフックする Visual Studio アドインまたはマクロを作成します。(マクロ アプローチでこれを行う方法については、このスレッドを参照してください)。イベントハンドラーでそれを確認し、pane.Name == "Debug"
他のペインを無視してください。次に、デバッグ出力ペインで新しいテキストを検出したら、次のようにタイムスタンプ行を追加します。
public void AddTimestamp(DTE2 dte)
{
// Retrieve and show the Output window.
OutputWindow outWin = dte.ToolWindows.OutputWindow;
pane = outWin.OutputWindowPanes.Item("Debug");
}
catch
{
pane = outWin.OutputWindowPanes.Add("Debug");
}
pane.OutputString("[timestamp: " + DateTime.Now.ToString() + "]\n");
}
各行の前にタイムスタンプを追加することもできますが、それははるかに困難です。出力ウィンドウ (読み取り専用) に既にあるテキストを変更することはできませんが、ウィンドウをクリアしてテキストを追加することはできます。したがって、上記と同じイベント ハンドラー アプローチを使用してテキストの変更を検出できますが、追加する代わりに、現在のテキストをコピーし、タイムスタンプがまだない行にタイムスタンプを追加し、ウィンドウをクリアして、現在を再度追加することができます。 -with-timestamps テキスト。これに伴う問題は、出力ウィンドウが大きくなった後のパフォーマンスです。そのため、(よくあることですが)数百行のデバッグ出力が短時間で出力されたときに IDE を強制終了しないようにするために、バックグラウンドでクリアと挿入を行う一種の「遅延スタンプ」を実装する必要があるでしょう。 . また、クリアして再追加する場合、
個人的には、前保留の難しいアプローチではなく、簡単なことをしてタイムスタンプ行を追加するだけです。行末のものはスクロールしないと見にくいので、おそらくタイムスタンプの前に改行があることを確認して、ユーザーが 1 つ以上の出力行の各バッチとそれに続く 1 つのタイムスタンプ行を確認できるようにします。
テキストが表示される前に出力ウィンドウをフックする方法がある可能性がありますが、VS Extensibility API でそのような拡張ポイントを見つけることができませんでした。
もう 1 つのアイデア: 常に独自のツール ウィンドウをロールすることができます。たとえば、実際の出力ウィンドウからのイベントをリッスンし、新しい行 (タイムスタンプ付き) を独自のツール ウィンドウにエコーする「Ivan's Debug Output」などです。これはおそらく最も難しいオプションですが、希望どおりに動作するはずです。