为啥在调试过程中有时窗口标题为黑色和按钮无框

Posted

技术标签:

【中文标题】为啥在调试过程中有时窗口标题为黑色和按钮无框【英文标题】:Why are Window Captions Black and Buttons frameless sometimes during debugging为什么在调试过程中有时窗口标题为黑色和按钮无框 【发布时间】:2011-08-06 10:48:05 【问题描述】:

在调试我的 Win32 应用程序窗口和对话框时,有时(很少)不会出现在所选的 Windows 方案中,而是减少或损坏:

窗口标题全是黑色(而不是蓝色或银色)并且没有任何阴影。按钮没有任何按钮形状(屏幕截图中的“Abbrechen”)。下半部分的黑色条是窗口进度条。发生这种情况时,它不会显示任何进展。

屏幕截图(中间的细节显示为灰色)取自在 XP SP3 x64 和 10 GB 机器上在 Visual Studio 2010 下调试的 64 位应用程序。有足够的 RAM(一些 GB)备用。

有人知道原因吗?我从不做非客户区绘图之类的。

编辑: 仅当 Visual Studio 调试器已附加到程序时才会出现此症状。但即使应用程序已与调试器分离,问题仍然存在。不调试就启动程序不会出现这种情况。

【问题讨论】:

这是 C# 还是 C++ 应用程序? 这是一个 Win32 非托管 C++ 应用程序。 在调试过程中,我从未在 MFC 应用程序中看到过像这样的黑色区域,尤其是在非客户区(标题为“waugs wird gelesen”的部分)。该部分通常由 Windows 本身呈现,而不是 MFC 或您的代码。这就是为什么我想知道您是否使用了一些“花哨”主题的东西。 这不是 MFC 项目。它是一个 win32 C++ 项目。我们只进行 Win32 API 调用。所有课程都是定制的。 您的 C++ 类是否有一些时髦的自定义非客户端绘制处理程序?见msdn.microsoft.com/en-us/library/dd145212(v=vs.85).aspx 【参考方案1】:

至少有两种可能性。

    除了 XP 原生之外,您还使用了其他一些“主题引擎”,例如 Clearlooks 等。这些引擎可能并不总是符合调试器想要的所有东西,它们可能会在某些隐含假设(在调试器)点,然后绘图就停止了。在 windows 上使用一些虚拟桌面管理器时经常会发生同样的事情,windows 窗口管理器实在是太硬了..

    即使是 32 位窗口中的 32 位程序也可能会用完句柄,这通常会导致窗口开始以“Fixedsys”字体呈现。您的应用程序仅显示主题处理部分的症状,这表明再次出现 nr.1 的可能性。

尝试使用 WinSpy 和 Process Explorer 检查相关窗口,分配的资源数量不合理可能暗示正在发生何种饥饿。

【讨论】:

感谢您的回答,但我也想过这样的可能性。该问题仅在程序启动期间有时会发生。 GDI 句柄的短缺不太可能 - 但请检查一下。我也不使用其他主题引擎。 @RED SOFT ADAIR 尝试调试(并从)windbg 程序。我们曾经让我们的程序崩溃,因为 Logitech SetPoint 软件在我们的程序启动时注入了一些关键的监控 dll,并且它以我们(非常旧的)登录系统无法处理的方式搞砸了(可能是堆栈)。 windbg 相当清楚地显示了加载的内容(比 VS 的 Modules 视图显示得更清楚)。【参考方案2】:

您是否为 Visual Studio 2010 安装了 SP1?我还没有遇到过这个问题,但是知道SP1修复了VS2010的很多问题。

我知道的另一件事是 WinXP x64(仍然是 sp2 而不是 3 btw)并不总是很好玩。它不像 x86 版本那样受支持。 Win Vista 和 7 x64 允许更流畅的操作。 (我自己在 XP x64 上也有过一些不好的经历)

【讨论】:

是的,我已经为 VC 2010 安装了 SP1。这不是问题。【参考方案3】:

我们遇到了这种麻烦。事实上,这是由于我们的抗病毒药物(不确定,但我认为目前是 McAfee Viruscan)。

【讨论】:

您是否看到过类似的行为?缺少 GUI 元素、缩小字体等? 是的。我们花了很多时间来检测我们的代码(用 .NET 编写)。最后,我们构建了一个带有输入字段和按钮的简单 Windows 窗体程序,当问题发生时,简单程序的按钮消失了。一旦杀毒软件被禁用,它就再也不会发生了。也许这不是你的情况,但只是测试它。【参考方案4】:

我(不久前)读到了这样的症状,所以我再次用谷歌搜索并找到了论坛。 WinXP-64 上的某些 NVIDIA 驱动程序似乎存在问题。还有一些人可以通过减少硬件加速来解决这个问题。

您可以自己阅读以下论坛(5 页)并确定它是否适用于您的情况。

http://forums.nvidia.com/index.php?showtopic=67608

【讨论】:

【参考方案5】:

要在应用程序中强制执行视觉样式,请确保在运行窗口之前调用它,如下所示:

static void Main()  
  
    Application.EnableVisualStyles();  
    Application.Run(new Form1());  
  

我之前也遇到过同样的问题,尤其是在使用使用自己的样式方法(如 Infragistics 或 ComponentOne)的 3rd 方组件时

【讨论】:

RedSoft 谈论的是 Win32 而不是 .NET。您已发布 C# 答案。 公平地说,直到最近,在 Michel 试图提供帮助很久之后,OP 才真正告诉我们。我希望有一个特定的 downvote-for-not-trying-to-tag-my-question-with-languages 功能。

以上是关于为啥在调试过程中有时窗口标题为黑色和按钮无框的主要内容,如果未能解决你的问题,请参考以下文章

NavigationBar 标题为黑色

调试显示更多显示更少按钮 - 缺少文本段落

C# WinForm窗体界面设置问题

为啥运行程序的时候不能干别的

“喜欢它”后弹出窗口中的内容错误

为啥我的引导 btn 反转按钮显示为灰色而不是黑色渐变?