Visual Studio:如何防止断点打中窗口抢占焦点?

65

当在Visual Studio中触发断点时,它会从程序员此刻正在查看/输入的其他应用程序中抢占焦点。这可能非常令人恼火,因为VS会获取程序员此刻在其他应用程序中所输入的任何键盘输入,并将其作为自己的输入。

你们有什么诀窍可以防止这种焦点失窃吗?

(我在Visual C++ 2008和2010上遇到了这个问题。我猜这是Visual Studio的普遍问题,适用于所有最近的版本。)


这不是 Visual Studio 的问题。这是 Windows 操作系统的一个功能。 - AMissico
我仍在等待一个可用的解决方案。我整天不断地打开和关闭断点。到目前为止,没有任何答案能够帮助我。 - Daniel Williams
5个回答

33

这个问题在VS2019中终于得到了修复。转到“工具”->“选项”->“调试”->“常规”,在底部找到“当调试器中断时将Visual Studio置于前台”。

取消选择它,就再也不会在多任务处理时被打扰了。

输入图像说明


这个很好用,但是现在我很烦恼的是当断点命中时任务栏上的项目不再高亮显示了... - Corstian Boerman
2
是的,有时候我会忘记自己正在调试,然后不得不打开VS来查看自己是否处于断点状态。但这比在打字时随机中断要好得多! - Daniel Williams
我决定为Visual Studio创建一个功能请求,关于突出显示任务栏:https://developercommunity.visualstudio.com/idea/790650/highlight-the-task-bar-item-when-a-breakpoint-is-h.html - Corstian Boerman
有人知道我们是否可以停止闪烁任务栏吗?这让我很焦虑! - Daniel Williams
文件 > 首选项 > 设置。在搜索框中输入:“Debug: Focus Window On Break”。 - Brent Sandstrom

17

这是一个注册表设置。请参阅ForegroundLockTimeout。零值允许应用程序窃取焦点。当选中“防止应用程序窃取焦点”时,TweakUI会将该值设为200000。

如果需要更多控制,请下载PowerToys for Windows XPTweak UI工具。在“常规”标签中,选择“焦点”并选中“防止应用程序窃取焦点”。


8
在我的Windows 7注册表中,ForegroundLockTimeout的值已经是0x30d40(200000),但当断点被触发时,我仍然看到VStudio窃取了焦点。 - Ashwin Nanjappa
5
我确认这个答案涉及几乎所有应用程序但不包括Visual Studio的窃取焦点行为。 - sam hocevar
3
不幸的是,Visual Studio似乎并不关心这个设置。 - Ryan Ternier
7
微软的爱好就是绕过他们自己的功能。他们认为自己是老大,这真的很烦人。 - jcarpenter2
1
它利用了微软“认为他们拥有这个地方”的事实;-) - Jools
显示剩余5条评论

9

右键单击断点,选择“命中时执行...”,这将允许您在断点被命中时运行一个函数。您可以使用此功能将状态消息打印到输出窗口。您的应用程序将保持焦点。


1
这非常有用 - 我经常使用这种技术(尽管它可能会使应用程序变得非常缓慢) - the_mandrill
1
是的,这非常有用!我正在测试涉及“焦点”和VS的WinForms行为,但VS让我很困扰。这种方法解决了我的问题(因为被标记为答案的修复/黑客在Win 7上无效)。 - Jeff B

3
偶然间我发现了一个解决方法,我已经使用了几年,虽然我没有在2008和2010中测试过它,但它在2013、'15和'17中肯定有效,并且至少适用于Windows 7和10。
这依赖于这样一个事实:如果另一个Visual Studio实例处于执行暂停状态,则Visual Studio不会窃取焦点。显然,唯一与VS一样特殊的就是另一个VS。:-/
打开第二个VS实例并创建一个简单的项目。以任何你喜欢的方式暂停项目的执行(例如,在执行的第一行上设置断点并进行调试),然后你可以将该VS简单地最小化,这样你实际使用的所有VS实例都不会窃取焦点。
这显然是一种重量级的解决方案,但如果你有足够的RAM(对我来说,空闲VS的CPU使用率甚至不会注册),它能很好地工作。我还没有尝试过使用不同版本的实例(例如,在“13”中暂停以使“17”正常运行),但如果这样做有效,你可能希望选择使用旧版本实例作为你的“虚拟”VS以减少资源使用。

这是唯一可行的建议解决方案,但对我来说太重了。 - Daniel Williams

0
一个解决方法是使用OutputDebugString()函数将当前状态输出到调试器输出窗口。您只需将Visual Studio置于后台,将被调试的程序窗口定位到“输出”窗口可见 - 并且不会发生焦点转移。
您可能希望使用宏进行条件编译,以便跟踪代码不包含在发布版本中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接