C# 安全桌面截图

C# 安全桌面截图,c#,screenshot,C#,Screenshot,我正在使用屏幕共享项目。我正在使用下面的功能捕获桌面屏幕。它工作正常。但无论何时。它返回黑色/空图像 但当我从当地的安全政策那里得到消息时,效果很好 是否有任何方法可以在不禁用本地安全策略的情况下捕获安全桌面 static Bitmap CaptureDesktop() { SIZE size; Bitmap printscreen = null; size.cx = Win32Stuff.GetSystemMetrics (W

我正在使用屏幕共享项目。我正在使用下面的功能捕获桌面屏幕。它工作正常。但无论何时。它返回黑色/空图像

但当我从当地的安全政策那里得到消息时,效果很好

是否有任何方法可以在不禁用本地安全策略的情况下捕获安全桌面

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;
}
编辑

  • Exe安装在安全位置
  • Exe是数字签名的

  • 为了获得安全桌面的屏幕内容,您的应用程序需要满足一些特殊条件:

    • 它必须在系统帐户下运行,而不是在登录的用户帐户下运行
    • 它必须在Winlogon桌面上运行,而不是在用户桌面上运行
    • 它应该作为服务运行
    要对其进行测试,例如,您可以使用在该模式下运行应用程序:

    PsExec /h /x /d /s "path_to\your_application.exe"
    
    /x
    /s
    开关非常重要:它们在系统帐户和Winlogon桌面上运行进程

    如果希望避免使用第三方工具,则需要创建自己的Windows服务,该服务将执行安全桌面的屏幕捕获


    没有可用的
    PsExec
    源代码,但是您可以查看
    PAExec
    工具-它是一个开源的替代方案。

    这不是一个解决方案,而是一个建议。我尝试了同样的方法,用输入音频捕捉屏幕并创建一个mpeg文件。第一个问题是这种捕获屏幕的方式有点慢,并且消耗了太多的cpu。其次,通过这种方式可以从视频内存中获取的内容存在局限性。那次,我在互联网上搜索了屏幕截图,发现成功的应用程序为此目的钩住了Windows的绘图API。检查OBS的屏幕/窗口捕获插件可能会有所帮助。感谢@NthDeveloper我将检查此链接是否有帮助:@KamalaHB感谢此链接。它的视频录制对我来说不起作用。我尝试过,但很难实现。我想知道team viewer如何在不在计算机中安装软件的情况下完成这一切。您不需要安装任何东西。您可以像PsExec一样直接运行服务。没有可用的
    PsExec
    源代码,但是您可以查看-这是一个开源的替代方案。谢谢它帮助我检查这个。你知道吗?