第二个监视器/电视下主 WPF 窗口的屏幕截图

本文关键字:WPF 窗口 屏幕截图 监视器 电视 第二个 | 更新日期: 2023-09-27 18:30:50

我在第二台显示器上使用我的应用程序,有时在计算机的主显示器上使用我的应用程序。

如何获取第二台显示器的屏幕截图?

以下代码不适用于第二个监视器...

Graphics gfx;
Bitmap bmp = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
gfx = Graphics.FromImage(bmp);
gfx.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y, 0, 0, Screen.PrimaryScreen.Bounds.Size, CopyPixelOperation.SourceCopy);
MemoryStream ms = new MemoryStream();
bmp.Save(ms, ImageFormat.Jpeg);
byte[] bitmapData = ms.ToArray();

第二个监视器/电视下主 WPF 窗口的屏幕截图

使用Screen.AllScreens[1].Bounds不是Screen.PrimaryScreen.Bounds

或者更可靠地获取第一个非主屏幕。

var secondScreen = Screen.AllScreens.Where(screen => !screen.Primary).FirstOrDefault();

检查secondScreen == null以了解您是否有第二个屏幕。

编辑
您可能还对提供应用程序当前正在运行的屏幕的Screen.FromControl感兴趣。

该代码不适用于您的第二个屏幕,因为它显式使用 Screen.PrimaryScreen

如果您想显式地从第二个显示器中提取(忽略您有 3...n 显示),您可以将PrimaryScreen替换为 AllScreens[1]

请记住,如果您断开第二个显示器的连接,这将中断。

听起来您可能希望捕获应用程序窗口而不是屏幕,以防应用程序没有占据整个屏幕或跨越两个屏幕。WPF 本身具有此功能:使用 VisualBrush 获取 WPF 区域的 System.Drawing.Bitmap