【问题标题】:Detect when Visual Studio Document Window is Closed检测 Visual Studio 文档窗口何时关闭
【发布时间】:2014-08-19 17:44:07
【问题描述】:

我已经构建了一个 VSPackage,它可以从 IVsInvisibleEditor 投射文本。此IVsInvisibledEditor 对应于用户在 Visual Studio 中打开并存在于Document Window 中的文件。

当用户关闭此文档窗口时,它会从底层ITextBuffer 中删除一些属性。特别是它会从源 ITextBuffer 中删除 ITextDocument 属性。

我想防止这种情况发生,因为用户可能正在使用我的扩展程序继续编辑文档。当主文档编辑器关闭时,删除这些属性会阻止在我的自定义编辑器中识别击键。

如何检测 Visual Studio 何时关闭文档窗口?我探索了 EnvDTE 类,并注意到 DocumentEvents 类,但它被标记为 Microsoft 内部。

是否有可以检测文档窗口何时关闭的公共 API?

【问题讨论】:

  • DocumentEvents 是一个公共 API。我一直不明白为什么它被标记为 Microsoft 内部。

标签: c# visual-studio visual-studio-2013 envdte vspackage


【解决方案1】:

了解文档窗口何时关闭的一种有效方法是使用 EnvDTE WindowEvents

WindowEvents _windowEvents;

// EnvDTE.Window _editorWindow=null;

_windowEvents = _vsObject.Events.get_WindowEvents(_editorWindow);
_windowEvents.WindowClosing += OnWindowClosing;

void OnWindowClosing(Window Window)
{
    /// your stuff here
}

另一个选项是通过 IVsWindowFrameNotify..IVsWindowFrameNotify3 接口

如果您有对文档 IVsWindowFrame 的有效引用,您可以使用 Advise 方法接收所有与帧相关的事件。

_iVsWindowFrame.Advise(hostWindowFrameNotify, out hostWindowFrameNotify_cookie);

记得调用 IVsWindowFrame.Unadvise 来清理钩子。

【讨论】:

  • 在这种情况下 _vsObject 代表什么?
  • 它是一个EnvDTE实例... EnvDTE _vsObject = (DTE)Package.GetGlobalService(typeof(DTE));
  • 如果您遵循IVsWindowFrameNotify 路线,请注意您需要将框架实例转换为IVsWindowFrame2 才能看到Advise 方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-14
  • 1970-01-01
相关资源
最近更新 更多