C# 为什么EnumerateMetafile只能在启用Aero的情况下工作

C# 为什么EnumerateMetafile只能在启用Aero的情况下工作,c#,gdi+,system.drawing.imaging,C#,Gdi+,System.drawing.imaging,我的代码是元文件: private void Parse() { Graphics graphics = Graphics.FromHwnd(IntPtr.Zero); PointF pointf = new PointF(); graphics.EnumerateMetafile(_metafile, pointf, ParseCallback); } private bool ParseCallback(EmfPlusRecordType recordType,

我的代码是元文件:

private void Parse()
{
    Graphics graphics = Graphics.FromHwnd(IntPtr.Zero);
    PointF pointf = new PointF();
    graphics.EnumerateMetafile(_metafile, pointf, ParseCallback);
}

private bool ParseCallback(EmfPlusRecordType recordType, 
    int flags, int dataSize, IntPtr data, PlayRecordCallback callbackData)
{
    // do stuff
}
我的开发机器是Ubuntu主机上的Windows7
VirtualBox
guest

过去的代码工作得很好。然而,当我关闭Aero时,代码停止工作:永远不会调用
ParseCallback

只有当我重新打开Aero时,
ParseCallback
才再次执行


为什么以及如何使此代码在非Aero启用的机器上工作?

对于“为什么?”问题,我没有完整的答案,但它不起作用,因为您正在从窗口句柄获取
图形
GDI+对象。相反,您希望从GDI DC获取它,如下所示:

private void Parse()
{
    IntPtr hdc = GetDC(IntPtr.Zero); // get entire screen dc
    Graphics graphics = Graphics.FromHdc(hdc));
    PointF pointf = new PointF();
    graphics.EnumerateMetafile(_metafile, pointf, ParseCallback);
    ReleaseDC(IntPtr.Zero, hdc);
}

[DllImport("user32.dll")]
static extern IntPtr GetDC(IntPtr hWnd);

[DllImport("user32.dll")]
static extern IntPtr ReleaseDC(IntPtr hwnd, IntPtr hdc);

注意:您也可以使用表单
OnPaint(PaintEventArgs e)
方法中的图形对象,它也应该可以工作,就像这里EnumerateMetafile方法的官方示例代码一样:

这是一个非常模糊的问题。您必须使该图元文件可供任何人使用,以便有机会诊断问题。问题发生在各种EMF+文件中。这里有一条(简单的对角线):--但你是对的,问题是模糊的,我开始认为我更愿意实现自己的元文件读取器来枚举记录。我建议在解析方法的末尾添加graphics.Dispose(),但我怀疑这是否是主要问题。@Aron Nice!但事实上,我故意决定不启用Aero——我不喜欢玻璃设计。另外,我想我在执行pc.Install(GeForce.FromStore())时会遇到困难在虚拟机上;-)@bovender你的意思肯定是
pc.Install(nVidiaFactory.BuildLatestGfxCard())