C# 桌面合成被禁用错误

C# 桌面合成被禁用错误,c#,wpf,C#,Wpf,在.NET4.0上的WPF应用程序中,我让用户报告两个错误,这两个错误似乎非常断断续续,我无法处理。下面,我发布了消息和堆栈跟踪的最上面一行。如果需要,我可以发布完整的堆栈跟踪 Message: {Desktop composition is disabled} The operation could not be completed because desktop composition is disabled. (Exception from HRESULT: 0x8026300

在.NET4.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()

谷歌并不是很有用,所以我希望你们以前见过谷歌。

第一个错误与WPF窗口中使用的Aero Glass样式有关。当用户关闭玻璃主题(并使用基本主题)时,这些玻璃方法(如
dwmextendframeintoclienterea
)将失败。因此,您需要检查是否:


第二个问题似乎是非托管bug。在另一个非常类似的问题上检查这个非常详细的答案:

我终于能够解决这个问题-图形适配器驱动程序

这个,还有这个帮我弄明白了。基本上,我有4个用户(大约600个)遇到了问题。他们还报告说,他们的屏幕会随机闪烁,一些人报告说“任务栏变为实心”。这将是导致DWM合成错误的原因,显然,如果他们有多个正在运行的程序大量使用图形卡,那么内存就会耗尽

我使用Geeks3d.com FurMark基准测试程序对图形卡进行了测试,然后启动了我的应用程序。它会在打开时崩溃并抛出outofmemory异常,所以我知道这不是内存泄漏

更新驱动程序后,我无法生成崩溃…即使有多个程序和FurMark全速运行


希望这对以后的人有所帮助。

我没有任何特定的Aero Glass风格,至少除了默认的WPF应用程序之外,我没有做过任何事情。从我所看到的,这是相当明确的,所以我会知道我是否使用了玻璃样式…或者这个玻璃样式在WPF中是默认的吗?你确定吗?您是否使用任何特殊的库或组件?该错误清楚地表明问题是由标准WPF窗口中未使用的
dwmextendframeintoclienterea
引起的。真正奇怪的是,我可以进入系统设置并禁用桌面合成,但完全无法按需复制。我必须确保我没有在某个地方的某个不知名的图书馆可以使用它。除此之外,这两个异常通常一起报告(看到其中一个的用户也看到了另一个)。您能否提供有关应用程序的上下文/用途/目的以及引发异常的时间的更多详细信息?该应用程序与一些web服务和数据库一起使用,以提供信息的“仪表盘”。我还使用Prism/Unity使其成为由各种模块组成的复合应用程序。崩溃似乎是在调整/移动窗口时发生的,但似乎是随机的。它们可以整日调整大小,但随后会突然崩溃,无法复制。有时,他们会离开电脑一段时间,回来调整窗口大小,然后电脑崩溃。它似乎与调整/移动窗口的大小无关。
[DllImport("dwmapi.dll", PreserveSig = false)] 
public static extern bool DwmIsCompositionEnabled();