桌面组合被禁用错误

10
在我的.NET 4.0的WPF应用程序中,用户报告了两个看似非常间歇性的错误,我无法掌握。下面,我将发布消息和堆栈跟踪的顶部行。如果需要,我可以发布完整的堆栈跟踪。
Message:       {Desktop composition is disabled} The operation could not be completed because desktop composition is disabled. (Exception from HRESULT: 0x80263001)
StackTrace:    at Standard.NativeMethods.DwmExtendFrameIntoClientArea(IntPtr hwnd, MARGINS& pMarInset)

Message:       Insufficient memory to continue the execution of the program.
StackTrace:    at System.Windows.Media.Composition.DUCE.Channel.SyncFlush()

谷歌提供的帮助并不是很有用,所以我希望你们之中可能见过这些。

2个回答

15
我终于找到了问题的根源——显卡驱动程序。
这篇帖子和这篇帖子帮助我解决了这个问题。基本上,我的情况是有4个用户(大约600个)遇到了问题。他们还报告说屏幕会在随机时间闪烁,一些人则报告“任务栏变成实心”。这就是导致DWM组合错误的原因,如果他们运行多个强烈使用显卡的程序,它会耗尽内存。
我使用Geeks3d.com FurMark基准测试程序进行了测试,以使显卡达到最大值,然后启动了我的应用程序。它会在打开时崩溃并抛出outofmemory异常,所以我知道这不是内存泄漏。
更新驱动程序后,我无法生成崩溃……即使有多个程序和FurMark全速运行。
希望这能帮到日后的某个人。

6

第一个错误与您在WPF窗口中使用的Aero Glass样式有关。当用户关闭玻璃主题(并使用基本主题)时,这些Glass方法(如DwmExtendFrameIntoClientArea)会失败。因此,您需要检查桌面窗口管理器(DWM)合成是否已启用

[DllImport("dwmapi.dll", PreserveSig = false)] 
public static extern bool DwmIsCompositionEnabled(); 

第二个问题似乎是一个未被管理的错误。请查看另一个非常相似的问题的详细答案:https://dev59.com/q3I-5IYBdhLWcg3wQV8Z#1965382

我没有特定的Aero Glass样式,至少除了默认的WPF应用程序之外,我没有做任何其他事情。从我所看到的来看,这是相当明确的,所以如果我使用玻璃样式,我会知道...或者这个玻璃样式在WPF中是默认的吗? - TrialAndError
你确定吗?你使用了任何特殊的库或组件吗?错误明确指出问题是由DwmExtendFrameIntoClientArea引起的,而这在标准的WPF窗口中并没有使用。 - dsfgsho
真正奇怪的是,我可以进入系统设置并禁用桌面组合,但完全无法按需复制。我必须确保我没有某个可能在使用它的晦涩库。除此之外,这两个异常通常一起报告(看到其中一个异常的用户也会看到另一个异常)。 - TrialAndError
你能否提供一些关于应用程序的上下文/用途/目的的更多细节,以及异常何时被抛出的信息? - dsfgsho
该应用程序与几个网络服务和数据库一起使用,以提供信息“仪表盘”。我还使用Prism / Unity使其成为由各种模块组成的复合应用程序。崩溃似乎发生在调整窗口大小/移动窗口时,但看起来是随机的。他们可以整天调整大小,但突然它会崩溃,他们无法重现。有时,他们会离开电脑一段时间,回来后,调整窗口大小并崩溃。它似乎局限于调整/移动窗口。 - TrialAndError

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