采取的所有可见的应用程序和形式的多个桌面的屏幕截图(Take screenshot of multi

2019-08-20 00:40发布

我正在与具有4个输出(监视器)具有例如1280x1024像素的每个输出系统的工作。 我需要整个桌面的截图,并在其上所有打开的应用程序。

我试图GetDesktopWindow() (MSDN) ,但它不能正常工作。 有些形式不上所拍摄的画面显示。

Answer 1:

我试图GetDesktopWindow()函数,但它不能正常工作。

当然不是。

GetDesktopWindow函数返回的句柄桌面窗口。 它没有任何与捕获窗口的图像。

此外,桌面窗口是不一样的东西“整个屏幕”。 它专指桌面窗口。 请参见本文的详细信息和可能出现的错误,当你滥用此函数返回的句柄。

我正在与具有4个输出(监视器)与1280×1024(例如)对于每个输出系统的工作。 我需要从整个桌面和所有打开的应用程序的屏幕截图。

这是比较简单的使用.NET框架做Graphics.CopyFromScreen方法。 你甚至都不需要做任何的P / Invoke!

在这种情况下,唯一的问题是确保您通过适当的尺寸。 既然你有4个显示器,只通过主屏幕的尺寸将无法正常工作。 您需要将整个虚拟屏幕,其中包含所有显示器的尺寸。 通过查询检索此SystemInformation.VirtualScreen属性,它返回虚拟屏幕的边界。 由于文档表明,这是一个多显示器系统的整个桌面的边界。

示例代码:

// Determine the size of the "virtual screen", which includes all monitors.
int screenLeft   = SystemInformation.VirtualScreen.Left;
int screenTop    = SystemInformation.VirtualScreen.Top;
int screenWidth  = SystemInformation.VirtualScreen.Width;
int screenHeight = SystemInformation.VirtualScreen.Height;

// Create a bitmap of the appropriate size to receive the screenshot.
using (Bitmap bmp = new Bitmap(screenWidth, screenHeight))
{
    // Draw the screenshot into our bitmap.
    using (Graphics g = Graphics.FromImage(bmp))
    {
        g.CopyFromScreen(screenLeft, screenTop, 0, 0, bmp.Size);
    }

    // Do something with the Bitmap here, like save it to a file:
    bmp.Save(savePath, ImageFormat.Jpeg);
}

编辑:

请与主题中的WPF应用程序,是不是你的主线程解决方案。 我尝试过这个。 这是行不通的!

嗯,我没有看到关于这个问题的WPF标签或在身体的任何地方提及。

不管了,虽然。 该代码我张贴的作品只是在WPF应用程序很好,只要你添加适当的引用和使用的声明。 您将需要System.Windows.FormsSystem.Drawing 。 有可能是这样做不需要这些的WinForms组件的依赖更WPF式的方式,但我不知道它是什么。

它甚至在另一个线程。 这里没有什么是需要的UI线程。

是的,我测试了它。 这里是我完整的测试代码:

using System.Windows;
using System.Windows.Forms;   // also requires a reference to this assembly
using System.Drawing;         // also requires a reference to this assembly
using System.Drawing.Imaging;
using System.Threading;

public partial class MainWindow : Window
{
   public MainWindow()
   {
      InitializeComponent();
   }

   private void button1_Click(object sender, RoutedEventArgs e)
   {
      // Create a new thread for demonstration purposes.
      Thread thread = new Thread(() =>
      {
         // Determine the size of the "virtual screen", which includes all monitors.
         int screenLeft   = SystemInformation.VirtualScreen.Left;
    int screenTop    = SystemInformation.VirtualScreen.Top;
    int screenWidth  = SystemInformation.VirtualScreen.Width;
    int screenHeight = SystemInformation.VirtualScreen.Height;

         // Create a bitmap of the appropriate size to receive the screenshot.
         using (Bitmap bmp = new Bitmap(screenWidth, screenHeight))
         {
            // Draw the screenshot into our bitmap.
            using (Graphics g = Graphics.FromImage(bmp))
            {
               g.CopyFromScreen(screenLeft, screenTop, 0, 0, bmp.Size);
            }

            // Do something with the Bitmap here, like save it to a file:
            bmp.Save("G:\\TestImage.jpg", ImageFormat.Jpeg);
         }
      });
      thread.SetApartmentState(ApartmentState.STA);
      thread.Start();
   }
}


文章来源: Take screenshot of multiple desktops of all visible applications and forms