当屏幕关闭时捕获窗口

5

我正在使用本机GDI+来捕获屏幕上的窗口。当屏幕关闭时,它无法正常工作(生成黑色图像)。我该怎么解决?(我正在使用.NET 4.5)

public static Image CaptureWindow(IntPtr handle)
{
        IntPtr hdcSrc = User32.GetWindowDC(handle);

        RECT windowRect = new RECT();
        User32.GetWindowRect(handle, ref windowRect);

        int width = windowRect.right - windowRect.left;
        int height = windowRect.bottom - windowRect.top;

        IntPtr hdcDest = Gdi32.CreateCompatibleDC(hdcSrc);
        IntPtr hBitmap = Gdi32.CreateCompatibleBitmap(hdcSrc, width, height);

        IntPtr hOld = Gdi32.SelectObject(hdcDest, hBitmap);
        Gdi32.BitBlt(hdcDest, 0, 0, width, height, hdcSrc, 0, 0, SRCCOPY);
        Gdi32.SelectObject(hdcDest, hOld);
        Gdi32.DeleteDC(hdcDest);
        User32.ReleaseDC(handle, hdcSrc);

        Image image = Image.FromHbitmap(hBitmap);
        Gdi32.DeleteObject(hBitmap);

        return image;
 }

1
你正在测试哪个版本的Windows?这个系统是否使用通过显示端口连接的监视器?我问这个问题是因为显示端口的工作方式很像USB。系统将监视器视为附加设备,一旦监视器进入睡眠状态,系统就会将监视器视为“已分离”,并从Windows中删除该“屏幕”。除此之外,关闭屏幕实际上不应该有任何影响,因为即使屏幕没有显示图像,视频卡仍在生成(甚至传输)图像。 - Mike U
我有Windows 10和笔记本电脑。 - v0id
1
嗯...完全有可能屏幕是通过显示端口风格的接口连接的,在笔记本电脑上这样做甚至很有意义,因为当屏幕关闭时,可以指示显卡停止渲染图像,从而节省电力。也许,作为一个实验,可以让某些东西进行轮询,并查看当屏幕关闭时,显示设备的IntPtr(或设备功能)是否发生任何变化。 - Mike U
1个回答

0
据我所知,图形驱动程序在没有接收者时会停止生成图像以节省电力。这可能是为什么当屏幕“关闭”时无法捕获图像的原因。当没有人接收图像时,使用CPU、GPU和总线功率来生成图像是没有意义的。

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