由于输出窗口文本在写入后是只读的,因此没有一种简单的方法可以准确地完成您想做的事情。但是,很容易做类似的事情:在将新文本写入输出窗口后附加一个时间戳行。这将使输出窗口更加混乱,但你会得到你的时间。
下面是它的工作原理:首先,创建一个 Visual Studio 加载项或宏来挂钩Outlook 窗口的活动窗格的PaneUpdated事件。(有关如何使用宏方法执行此操作,请参阅此线程)。确保在事件处理程序中检查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");
}
也可以为每一行预先添加时间戳,但这要困难得多。您无法更改“输出”窗口中的文本(它是只读的),但您可以清除窗口并添加文本。因此,您可以使用上面相同的事件处理程序方法来检测文本更改,但您可以复制当前文本,而不是附加,将时间戳添加到任何还没有时间戳的行,清除窗口,然后重新添加现在- 带有时间戳的文本。一旦输出窗口变大,问题就是性能。因此,您可能必须实现一种“延迟标记”,它会在后台清除并插入,以避免在(通常)100 行调试输出在短时间内发出时杀死您的 IDE . 此外,当您清除并重新添加时,如果您
就个人而言,我只是做简单的事情并附加时间戳行,而不是更难的前置方法。由于如果不滚动就很难看到行尾的内容,我可能会确保在时间戳之前有一个换行符,因此用户会看到每批一个或多个输出行后跟一个时间戳行。
可能有一种方法可以在显示文本之前挂钩输出窗口,但我在 VS 可扩展性 API 中找不到任何这样的可扩展点。
还有一个想法:你总是可以滚动你自己的工具窗口,例如“Ivan's Debug Output”,它监听来自真实输出窗口的事件,并将新行(带有时间戳)回显到你自己的工具窗口。这可能是最难的选择,但应该完全按照您的意愿行事。