我正在与具有4个输出(监视器)具有例如1280x1024像素的每个输出系统的工作。 我需要整个桌面的截图,并在其上所有打开的应用程序。
我试图GetDesktopWindow()
(MSDN) ,但它不能正常工作。 有些形式不上所拍摄的画面显示。
我正在与具有4个输出(监视器)具有例如1280x1024像素的每个输出系统的工作。 我需要整个桌面的截图,并在其上所有打开的应用程序。
我试图GetDesktopWindow()
(MSDN) ,但它不能正常工作。 有些形式不上所拍摄的画面显示。
我试图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.Forms
和System.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();
}
}