【问题标题】:Capturing virtual screen (all monitors)捕获虚拟屏幕(所有显示器)
【发布时间】:2011-03-31 12:55:43
【问题描述】:

我正在尝试获取整个虚拟屏幕的屏幕截图。这意味着,不仅是主屏幕的图像,而是连接到计算机的每个屏幕的图像。

有没有办法做到这一点?我试过用这个,但没有用:

Bitmap b = new Bitmap(SystemInformation.VirtualScreen.Width, SystemInformation.VirtualScreen.Height);
Graphics g = Graphics.FromImage(b);
this.Size = new Size(SystemInformation.VirtualScreen.Width, SystemInformation.VirtualScreen.Height);
g.CopyFromScreen(0, 0, 0, 0, b.Size);

【问题讨论】:

  • 究竟是什么不起作用?你有什么例外吗?
  • 它只捕获主屏幕...
  • 不知道“虚拟屏幕”,谢谢老兄

标签: c# virtual screenshot


【解决方案1】:

documentation 说:Graphics.CopyFromScreen(Int32, Int32, Int32, Int32, Size):执行颜色数据的位块传输,对应于像素的矩形,从屏幕到图形的绘图表面。”但是虚拟屏幕不一定是一个矩形:想象两个分辨率分别为 1920x1200 和 1280x1024 的显示器。所以你需要做的就是像你一样创建一个位图,然后枚举你的显示器并为每个显示器执行CopyFromScreen()

编辑:例如,如果您有两台显示器,一台分辨率为 1280x1024 的显示器位于 1920x1200 显示器的左侧,则前者的坐标为(-1280,0) - (0, 1024)。因此您需要执行memoryGraphics.CopyFromScreen(-1280, 0, 0, 0, s);,其中s 是Size(1280,1024)。对于第二个,您需要调用memoryGraphics.CopyFromScreen(0, 0, *1280*, 0, s);,s 将是Size(1920, 1200)。 希望这会有所帮助。

【讨论】:

    【解决方案2】:

    就像 Igor 和 Hans 所说,你必须指出源坐标:

    Bitmap screenshot = new Bitmap(
        SystemInformation.VirtualScreen.Width, 
        SystemInformation.VirtualScreen.Height, 
        PixelFormat.Format32bppArgb);
    
    Graphics screenGraph = Graphics.FromImage(screenshot);
    
    screenGraph.CopyFromScreen(
        SystemInformation.VirtualScreen.X, 
        SystemInformation.VirtualScreen.Y, 
        0, 
        0, 
        SystemInformation.VirtualScreen.Size, 
        CopyPixelOperation.SourceCopy);
    

    【讨论】:

      【解决方案3】:

      Igor 是对的,为 SourceX/Y 参数传递 0、0 是不正确的。迭代 Screen.AllScreens 属性中的 Screen 实例以找到边界矩形。请注意CopyFromScreen() 有一个错误,它无法捕获分层窗口(设置了TransparencyKeyOpacity 的那种)。检查我在this thread 中的答案以获取解决方法。

      请注意,捕获整个桌面并不总是可行的,如果屏幕不是以完美的矩形排列并且OutOfMemory 异常在高分辨率的 32 位计算机上并不少见,您会得到很多黑色显示。

      【讨论】:

      • 如果大量的黑色适用于 Print Scrn,我认为它应该对 OP 来说足够好。
      • 嗯,黑色当然只出现在他客户的机器上。
      猜你喜欢
      • 1970-01-01
      • 2014-09-28
      • 2014-04-30
      • 2016-12-11
      • 2014-03-12
      • 1970-01-01
      • 2016-08-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多