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

时间:2014-04-23 17:04:14

标签: c# windows screen rdp win32com

我正在尝试制作屏幕捕获服务。 我有一台物理PC,我想运行一个显示文档的程序(例如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);
}

只有连接了LCD屏幕才有效。 (或者,如果我通过RDP连接)。但每当我拔掉我的屏幕/从RDP断开连接。由于句柄无效,Win32Com会出现错误 - 屏幕不再存在。

我想问一下是否有办法强制Windows认为有一些显示器(虚拟/虚假)所以它可以截取屏幕截图?

1 个答案:

答案 0 :(得分:1)

当我第一次阅读你的问题时,我和罗伯特哈维的本能相同。我记得试图将机器设置为无头服务器并遇到各种麻烦。我可以在连接显示器的情况下将所有东西都放在工作台上,但是一旦我断开显示器,视频硬件就会完全停止工作,以至于我甚至无法远程连接到系统。我认为它与VGA同步信号有关。当视频硬件没有获得同步信号时,它会自动关闭。通过短接同步引脚可以简单地绕过它。如果您是电动倾斜的,可以查看VGA连接器的引脚规格并找出要做的事情。否则,您通常可以购买并连接一个VGA-to-DVI适配器,该适配器会欺骗硬件,使其认为显示器已连接。

但它听起来并不像你的问题,因为你说你仍然可以使用远程桌面连接到机器,即使没有连接屏幕。我怀疑显示器是否连接的问题是一个红色的鲱鱼。我的猜测是,如果你登录到机器然后断开显示器,一切都将继续正常工作。同样,如果你连接了一台显示器但没有登录,那么任何东西都不会起作用。

这意味着你的问题只是一个逻辑问题:当没有屏幕时,屏幕上没有任何内容可以拍摄照片,因此功能失败。为CopyFromScreen函数提供支持的代码是获取包含桌面的虚拟屏幕的句柄,然后将其图像blit到位图。如果您没有本地或远程登录,则表示没有桌面,也没有运行交互式应用程序,因此CopyFromScreen失败。

这个问题实际上更类似于the people who are trying to take screenshots from a service或ASP.NET应用程序。我不知道这些人期待会发生什么。同样在这里。谷歌搜索将揭示这个问题的一些解决方法,其中许多是posted here on Stack Overflow。一般来说,它们都归结为模仿特定用户,他们拥有可以截屏的桌面。但我不知道这对你有什么用。

如果我正确理解问题,解决方案非常简单。你不需要强迫Windows认为有一些监视器(虚拟/虚假),所以它可以截取屏幕截图"。您只需登录,启动Microsoft Word,然后运行您的代码。在启动时尝试setting your computer to automatically log in。当您使用远程桌面时,只需断开与虚拟会话的连接而不注销。