【问题标题】:Visual Studio: How to stop breakpoint hit from stealing focus?Visual Studio:如何阻止断点命中窃取焦点?
【发布时间】:2011-03-15 04:53:30
【问题描述】:

断点 在 Visual Studio 中被命中时,它从程序员的任何其他应用程序中窃取焦点正在查看/输入那一刻。这可能会很烦人,因为 VS 会抓取程序员当时正在其他应用程序中输入的任何键盘输入,并将该输入作为自己的输入。

你们使用什么技巧来防止这种焦点窃取?

(我在 Visual C++ 2008 和 2010 上遇到过这个问题。我猜这对于 Visual Studio 和所有最新版本来说都是一个问题。)

【问题讨论】:

  • 这不是 Visual Studio 问题。这是 Windows 操作系统的一项功能。
  • 我仍在等待一个可用的解决方案。我在白天不断地打开和关闭断点。到目前为止,没有一个答案有帮助。

标签: visual-studio debugging focus breakpoints


【解决方案1】:

这最终在 VS2019 中得到修复。转到工具->选项->调试->常规,底部是“在调试器中断时将 Visual Studio 置于前台。”
只需取消选择它,您在多任务处理时将不再被打断。

【讨论】:

  • 这很棒,但现在我很恼火的是,当断点被击中时任务栏项目不再亮起......
  • 是的,我有时会忘记我在调试,然后必须打开 VS 才能看到我在断点上。但这比在打字时被随机打断要好得多!
  • 我决定为 Visual Studio 创建一个关于突出显示任务栏的功能请求:developercommunity.visualstudio.com/idea/790650/…
  • 有谁知道我们是否可以让它停止闪烁任务栏?这让我很焦虑!
  • 文件 > 首选项 > 设置。输入搜索:“Debug: Focus Window On Break”
【解决方案2】:

这是一个注册表设置。请参阅ForegroundLockTimeouthttp://technet.microsoft.com/en-us/library/cc957208.aspx。零允许应用程序窃取焦点。 TweakUI 在选中“防止应用程序窃取焦点”时将此值设置为 200000。

如需更多控制,请下载 Powertoys for Windows XPTweak UI 实用程序。在“常规”选项卡中,选择“焦点”并勾选“防止应用程序窃取焦点”。

【讨论】:

  • 我在 Windows 7 上的注册表中 ForegroundLockTimeout 的值已经是 0x30d40 (200000),但我看到 VStudio 在断点被命中时窃取焦点。
  • 我确认这个答案解决了除 Visual Studio 之外的几乎所有应用程序的焦点窃取行为。
  • 不幸的是,Visual Studio 似乎并不关心这个设置。
  • 微软的爱好是绕过自己的功能。他们认为他们拥有这个地方。真烦人。
  • 它利用了微软“认为他们拥有这个地方”这一事实;-)
【解决方案3】:

右键单击断点并选择When hit ... 这将允许您在断点被命中时运行函数。您可以使用它来将状态消息打印到输出窗口。您的应用程序将保持焦点。

【讨论】:

  • 这非常有用——我经常使用这种技术(尽管它确实会降低应用程序的速度)
  • 是的,这非常有用!我正在测试一些涉及Focus 的 WinForms 行为,而 VS 把我搞砸了。这种方法解决了我的问题(因为标记为答案的修复/破解不是 Win 7)。
【解决方案4】:

我偶然发现了一种解决方法,我已经使用了几年了,虽然我在 2008 年和 2010 年没有测试过它,但它在 2013 年、'15 和 '17 年以及至少在 Windows 7 中确实有效& 10.

它依赖于这样一个事实:如果另一个 Visual Studio 实例在执行中暂停,Visual Studio 将不会窃取焦点。 显然,与 VS 一样特别的东西是另一个 VS。 :-/

用一个简单的项目打开第二个 VS 实例。随意暂停项目的执行(例如,在执行和调试的第一行放置一个断点),然后您可以简单地最小化该 VS,并且您实际使用的 VS 实例都不会窃取焦点。

这显然是一个重量级的解决方案,但如果你有足够的 RAM(空闲 VS 的 CPU 使用率甚至没有为我注册),它工作得很好。我没有尝试过跨版本实例(例如在 '13 中暂停以使 '17 正常运行),但如果可行,您可能希望选择使用旧版本实例作为“虚拟”VS 来减少关于资源使用。

【讨论】:

  • 这是唯一可行的建议解决方案,但它对我来说太重了。
【解决方案5】:

一种解决方法是使用OutputDebugString() 函数将当前状态输出到调试器输出窗口。您只需将 Visual Studio 置于后台,定位已调试的程序窗口,以便“输​​出”窗口可见 - 并且不会发生焦点转换。

您可能希望使用宏进行条件编译,以便跟踪代码不包含在发布版本中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-04
    • 1970-01-01
    • 2011-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-13
    • 2016-04-09
    相关资源
    最近更新 更多