我已经阅读了几篇文章,告诉你如何在附加组件(特别是visual studio 2008集成包,通过visual studio 2008 SDK 1.1)中将文本添加到visual studio的输出窗口中,但是没有如何从输出窗口中读取文本的示例。我的目标是在调试某个应用程序(TRACE输出和可能的stdin / stdout)时解析调试输出窗口中的文本。 IVsOutputWindowPane接口没有从输出窗口读取文本的方法。文档似乎暗示它是可能的,但它没有提供一个例子:
http://msdn.microsoft.com/en-us/library/bb166236(VS.80).aspx
Quote:此外,OutputWindow和OutputWindowPane对象添加了一些更高级别的功能,以便更容易枚举“输出”窗口窗格并从窗格中检索文本。
我希望能够订阅一个新文本到达时触发的事件,类似于StreamReader的异步读取。
答案 0 :(得分:4)
这是可能的,它只是一个漫长的蜿蜒路径:
ServiceProvider - > IVsOutputWindow - > GetPane(debugwindow) - > IVsUserData - > GetData(wpftextviewhost) - > IWpfTextViewHost - > IWpfTextView - > TextBuffer - >改变了事件。
假设您有来自其他地方的VS IServiceProvider
(vsix扩展/无论如何,全球服务提供商),并且没有任何错误检查,它看起来像这样:
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中都不存在。但现在它已经存在了!
答案 1 :(得分:1)
VS的默认行为(当你没有明确设置监听器时)是在调试器输出窗口中显示跟踪按摩,如果你想要一个简单的解决方案并且没有其他的按摩操作,你会感激。
不幸的是,这不是你的情况。因此,您必须定义跟踪侦听器以发送(并存储)您的跟踪按摩,然后您将能够阅读它们。跟踪侦听器可以是文件(例如XML),也可以通过从基类TraceListener派生类来创建自定义侦听器,如果您不想使用其他文件来打扰自己。
答案 2 :(得分:1)
我不知道你问的是可能的。但是,您可以将加载项注册为应用程序的调试器,以便获得跟踪消息的输出。这些通常被路由到OutputDebugString,并且可以按照本文所述捕获:http://www.drdobbs.com/showArticle.jhtml?articleID=184410719。它不提供正常输出,只提供调试,但它不依赖于已调试应用程序的技术。
答案 3 :(得分:0)
此页面上的解决方案选择文本以便阅读。我希望有更好的方法。 Automatically stop Visual C++ 2008 build at first compile error?
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