【问题标题】:WindowState change event in Visual Studio extensionVisual Studio 扩展中的 WindowState 更改事件
【发布时间】:2014-02-13 21:09:02
【问题描述】:

我正在寻找一个在 Visual Studio 扩展包中最小化和恢复主窗口时通知我的事件。

我查看了 DTE2.Events,以及 IVsWindowFrame 和 IVsWindowFrameNotify 接口,但没有看到任何可以满足我需要的东西。

【问题讨论】:

  • 你为什么要这个?
  • @JasonMalinowski 我实际上想知道 VS 何时处于非活动状态,以便我可以抵消时间敏感变量。我尝试使用IVsLongIdleManager,但它似乎并没有持续触发。我的下一个想法是检测 VS 何时被最小化(不是完美的解决方案,因为 VS 可以在另一台显示器中闲置,等等)。对这种情况有什么建议吗?
  • 也许检查它是否有焦点或处于活动状态?
  • 您的方案是否确定您或开发人员打开 VS 的时间以及根据某种定义“工作”以记录时间(例如合同)?然后,您可能必须获取 HWND 并从那里开始使用 Win32 API。如果这是一个不同的场景......好吧,请澄清。这是 XY 问题的一个很好的例子:在不知道你实际想要做什么的情况下,我们可以推荐 10 种不同的解决方案,但没有一个对你有用。
  • 此时应用程序的目标与最初的问题不同。

标签: c# visual-studio visual-studio-extensions envdte


【解决方案1】:

【讨论】:

  • 感谢您的建议,但似乎不支持从 VS 扩展捕获 Windows 消息
  • 我认为它比您想象的更受支持。它是一个记录在案的 Windows 基础 API,对 .NET 的本机挂钩也得到了很好的记录和支持。在未来的 VS 版本中,MS 采取措施破坏它的风险几乎为零。
  • 正确,我应该更具体。 Application.AddMessageFilter 不是受支持的场景。所以您确实需要使用链接中详述的方法。
  • VS 扩展 API 不支持它,但它由 Win32 API 支持,它本身与 VS 兼容(虽然可能没有通过技术援助正式“支持”,但永远不会中断) .
【解决方案2】:

EnvDTE80.DTE2.Events.WindowEvents.WindowMoved 事件在主窗口最小化和还原时触发。

【讨论】:

  • 感谢您的建议,但似乎没有办法确定窗口或 VS 是否可见
  • VS最小化时Top参数为-32000。试试看:private void OnWindowMoved(EnvDTE.Window w, int Top, int Left, int Width, int Height) { if (w == DTE.MainWindow) System.Windows.MessageBox.Show(Top.ToString()); }
  • 不幸的是,在我的 VS 2010 上,当从最大化状态最小化 VS 时,不会触发 WindowMoved。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-01
  • 2013-09-30
  • 2015-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多