内容简介:翻译自:https://stackoverflow.com/questions/15847637/take-screenshot-of-multiple-desktops-of-all-visible-applications-and-forms
我试过
GetDesktopWindow()
(MSDN)
,但它无法正常工作.某些表单未显示在捕获的图片上.
i tried GetDesktopWindow() function but it doesn’t work properly.
当然不是.
GetDesktopWindow
函数返回桌面窗口的句柄.它与捕获该窗口的图像没有任何关系.
此外,桌面窗口与“整个屏幕”不同.它特指桌面窗口.有关更多信息,请参阅 this article ,以及滥用此函数返回的句柄时可能出现的问题.
i’m working with a system that have 4 outputs (monitors) with 1280×1024(e.g) for each output. i need a screenshot from whole desktop and all open applications on it.
使用
Graphics.CopyFromScreen
方法在.NET Framework中执行此操作相对简单.你甚至不需要做任何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); }
编辑:
please check your solution with a wpf application in a thread that is not your main thread. i tried it. it doesn’t work!
嗯,我没有在问题上看到WPF标签或在身体的任何地方提到过.
不过,无论如何.我发布的代码在WPF应用程序中运行得很好,只要添加适当的引用并使用声明即可.您将需要System.Windows.Forms和System.Drawing.可能有更多的WPF方式这样做,不需要依赖这些WinForms程序集,但我不知道它是什么.
它甚至适用于另一个线程.这里没有任何东西需要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(); } }
翻译自:https://stackoverflow.com/questions/15847637/take-screenshot-of-multiple-desktops-of-all-visible-applications-and-forms
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
.NET本质论 第1卷:公共语言运行库
博克斯 (BoxDon) / 张晓坤 / 中国电力出版社 / 2004-1 / 48.00元
本书由10章组成,探讨了CLR即公共语言运行库,涵盖了基本类型、实例、方法调用和消息、AppDomain、安全、以及CLR外部世界。一起来看看 《.NET本质论 第1卷:公共语言运行库》 这本书的介绍吧!