屏幕截图安全桌面

13
我正在与屏幕共享项目合作。我使用下面的函数捕获桌面屏幕,它运行良好。但是每当安全桌面提示提升权限时,它会返回黑色/空白图像。
但是当我从本地安全策略关闭安全桌面时,它可以正常工作。
有没有办法在不禁用本地安全策略的情况下捕获安全桌面?
static Bitmap CaptureDesktop()
{
    SIZE size;
    Bitmap printscreen = null;

    size.cx = Win32Stuff.GetSystemMetrics
                     (Win32Stuff.SM_CXSCREEN);

    size.cy = Win32Stuff.GetSystemMetrics
              (Win32Stuff.SM_CYSCREEN);

    int width = size.cx; int height = size.cy;

    IntPtr hWnd = Win32Stuff.GetDesktopWindow();
    IntPtr hDC = Win32Stuff.GetDC(hWnd);
    if (hDC != IntPtr.Zero)
    {
        IntPtr hMemDC = GDIStuff.CreateCompatibleDC(hDC);
        if (hMemDC != IntPtr.Zero)
        {
            IntPtr m_HBitmap = GDIStuff.CreateCompatibleBitmap(hDC, width, height);
            if (m_HBitmap != IntPtr.Zero)
            {
                IntPtr hOld = (IntPtr)GDIStuff.SelectObject(hMemDC, m_HBitmap);
                GDIStuff.BitBlt(hMemDC, 0, 0, width, height, hDC, 0, 0, GDIStuff.SRCCOPY);
                GDIStuff.SelectObject(hMemDC, hOld);
                GDIStuff.DeleteDC(hMemDC);
                printscreen = System.Drawing.Image.FromHbitmap(m_HBitmap);
                GDIStuff.DeleteObject(m_HBitmap);
            }
        }
    }
    Win32Stuff.ReleaseDC(hWnd, hDC);

    return printscreen;
}

编辑:

  1. 应将Exe安装在安全位置
  2. Exe应进行数字签名

这不是解决方案,而是建议。我尝试了同样的方法来捕获带有输入音频的屏幕并创建MPEG文件。第一个问题是这种方式捕获屏幕有点慢且消耗太多CPU。其次,以这种方式可以从视频内存中抓取的内容有限。那时,我在互联网上搜索了关于屏幕捕获的信息,并发现成功的应用程序钩取了Windows的绘图API以实现此目的。检查OBS的屏幕/窗口捕获插件可能会有所帮助。https://github.com/obsproject/obs-studio/tree/master/plugins/win-capture - NthDeveloper
谢谢@NthDeveloper,我会检查的。 - Azar Shaikh
希望这个链接能够帮到你:https://www.c-sharpcorner.com/article/capture-desktop-activities-as-a-movie/ - xoxo
@KamalaHB 感谢您提供的链接。对我来说不适用,因为它是视频记录。 - Azar Shaikh
1个回答

7
为了获取安全桌面的屏幕内容,您的应用程序需要满足一些特殊条件:
  • 它必须在SYSTEM帐户下运行,而不是已登录的用户帐户下运行
  • 它必须在Winlogon桌面上运行,而不是用户桌面上运行
  • 最好作为服务运行
您可使用SysInternals PsExec工具以该模式运行您的应用程序进行测试。
PsExec /h /x /d /s "path_to\your_application.exe"
/x/s开关很重要:它们可以在SYSTEM帐户下运行进程并在Winlogon桌面上运行。
如果您想避免使用第三方工具,您需要创建自己的Windows服务来执行安全桌面的屏幕截图。
没有PsExec的源代码可用,但是您可以查看PAExec工具的源代码 - 这是一个开源的替代方案。

我尝试过,但实现起来非常困难。我想知道 TeamViewer 是如何在不安装软件的情况下完成所有操作的。 - Azar Shaikh
您无需安装任何东西。您可以像PsExec一样直接运行您的服务。PsExec没有源代码可用,但是您可以查看PAExec工具源代码 - 这是一个开源替代品。 - dymanoid
谢谢,它帮了我很多。 - Azar Shaikh
请检查此链接 https://stackoverflow.com/questions/53101802/c-sharp-screenshot-winlogon-as-well-as-user-desktop。如果您有任何想法,请告诉我。 - Azar Shaikh

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