当桌面被阻止时,如何在c#中进行屏幕截图(可能是低级别的)

本文关键字:屏幕截图 桌面 | 更新日期: 2023-09-27 18:00:35

我尝试用代码获取屏幕截图(windows 8),并在桌面被阻止时获得黑屏:

    public static Bitmap ImageFromScreen()
    {
        Graphics gr;
        Bitmap bmp = new Bitmap(Screen.PrimaryScreen.Bounds.Width, 
            Screen.PrimaryScreen.Bounds.Height,PixelFormat.Format32bppRgb);
        gr = Graphics.FromImage(bmp);
        gr.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y,
            0, 0, Screen.PrimaryScreen.Bounds.Size, CopyPixelOperation.SourceCopy);
        return bmp;
    }

当桌面被阻止时,如何在c#中进行屏幕截图(可能是低级别的)

您没有。

除了窗口缓存(它不可访问,也不必存在),数据根本不存在。你必须伪造WM_PAINT消息,并迫使应用程序绘制到你的表面(大多数控件将从wParam中获取HDC;这仍然排除了大量写得不好(或不是Windows本机)的应用程序——即使这样,这在大多数情况下也不会起作用,比如当窗口最小化或桌面锁定时。

实际上想做什么

编辑:

好吧,很明显,你是在明确地谈论"锁定屏幕"的情况——在这种情况下,无法获得桌面的屏幕截图——它并不真的存在。锁定屏幕存在于另一个会话中,因此您不再与"隐藏"用户会话有任何连接。这类似于在断开远程桌面连接后尝试在服务器应用程序上截屏-没有什么可拍的。可能会强制一些应用程序绘制到您的上下文中,但这些都不起作用。