Windows:如何通过VGA模拟连接屏幕

本文关键字:模拟 连接 屏幕 VGA 何通过 Windows | 更新日期: 2023-09-27 17:59:45

我正在尝试制作一个屏幕捕获服务。我有一台实体电脑,我想运行一个显示文档的程序(例如MSWord),然后截图。问题是如果我使用

using (var bitmap = new Bitmap(p.EndX - p.StartX, p.EndY - p.StartY))
{
    using (Graphics g = Graphics.FromImage(bitmap))
    {
        g.CopyFromScreen(p.StartX, p.StartY, 0, 0,
            p.EndX,p.EndY,new Size(p.EndX - p.StartX,
                                    p.EndY - p.StartY));
    }
    bitmap.Save("result.png", ImageFormat.Png);
}

它只有在我连接了液晶屏幕的情况下才能工作。(或者如果我是通过RDP连接的)。但每当我拔下屏幕/断开与RDP的连接时。Win32Com由于无效句柄而更正错误-屏幕不再存在。

我想问一下,是否有一种方法可以强迫窗口认为有一些监视器(虚拟/假的),这样它就可以截图了?

Windows:如何通过VGA模拟连接屏幕

当我第一次读到你的问题时,我和Robert Harvey有着同样的直觉。我记得我试图将机器设置为无头服务器,但遇到了各种各样的麻烦。我可以在连接了显示器的情况下让所有东西都在长椅上工作,但一旦我断开显示器的连接,视频硬件似乎就完全停止了工作,所以我甚至无法远程连接到系统。我认为这与VGA同步信号有关。当视频硬件没有得到同步信号时,它会自动关闭。它会被短路的同步引脚绕过。如果你有电学倾向,你可以查找VGA连接器的引脚规格,然后想办法。否则,你通常可以购买并连接VGA到DVI适配器,这会欺骗硬件,让硬件认为显示器已经连接。

但这听起来并不是你的问题,因为你说过即使没有连接屏幕,你仍然可以使用远程桌面连接到机器。我怀疑监视器是否连接的问题是转移注意力。我想,如果你登录机器,然后断开显示器,一切都会继续正常工作。同样,如果你连接了显示器但没有登录,那么也不会有任何工作。

因此,这意味着你的问题只是一个合乎逻辑的问题:当没有屏幕时,屏幕上没有任何可以拍照的东西,所以功能失败了。为CopyFromScreen函数提供动力的代码是获取包含桌面的虚拟屏幕的句柄,然后将其图像闪电传输到位图中。如果您没有在本地或远程登录,则没有桌面,也没有交互式应用程序在其上运行,因此CopyFromScreen会失败。

这个问题实际上更类似于那些试图从服务或ASP.NET应用程序中截屏的人。我不知道这些人期望发生什么。这里也是如此。谷歌搜索会发现一些解决这个问题的方法,其中许多都发布在Stack Overflow上。一般来说,它们都可以归结为模仿一个特定的用户,这个用户有一个可以截屏的桌面。但我看不出这对你有什么好处。

如果我正确理解这个问题,解决办法就很简单。你不需要"强迫窗口认为有一些监视器(虚拟/假的),这样它就可以截图"。你只需要登录,启动Microsoft Word,然后运行你的代码。请尝试将计算机设置为在启动时自动登录。当您使用远程桌面时,只需断开与虚拟会话的连接,而无需注销。