带有缩放的 Windows 屏幕截图

Posted

技术标签:

【中文标题】带有缩放的 Windows 屏幕截图【英文标题】:Windows screenshot with scaling 【发布时间】:2018-04-11 11:17:42 【问题描述】:

我正在尝试截取我的 Windows 10 机器上的每个屏幕的屏幕截图。 我的系统有 2 个具有多个 DPI 的显示器。

我的主显示器的“比例和布局”设置为 200%。 我的中学 将“比例和布局”设置为 100%。

我正在尝试使用 C# 为每个监视器截取屏幕截图。 但是我的缩放监视器报告了错误的坐标: 一切都减半了。 结果,主显示器的屏幕截图只有屏幕区域的 1/4(宽/2,高/2)。

这是我的代码:

    using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
using System.Drawing.Imaging;

namespace CsSourceClient

    class Program
    
        static void Main(string[] args)
        
            Screen[] screens;
            screens = Screen.AllScreens;


            int i = 0;

            foreach (var screen in System.Windows.Forms.Screen.AllScreens)
            
                var savePath = "monitor" + i+".jpg";
                var x = screen.Bounds.Location.X;
                var y = screen.Bounds.Location.Y;
                var w = screen.Bounds.Width;
                var h = screen.Bounds.Height;
                Console.Out.WriteLine("Monitor: " + i + " extents:" + x + "," + y + " " + w + "," + h);
                using (Bitmap bmp = new Bitmap(w, h))
                
                    using (Graphics g = Graphics.FromImage(bmp))
                    
                        g.CopyFromScreen(x, y, 0, 0, bmp.Size);
                    

                    bmp.Save(savePath, ImageFormat.Jpeg);
                    Console.Out.WriteLine("saved: " + savePath);
                
                i++;
            



        
    

PS:根据我在清单文件中设置的“dpiaware”,我得到不同的值:https://social.msdn.microsoft.com/Forums/en-US/054c1d49-9f24-4617-aa83-9bc4f1bb4a5d/use-appmanifest-file-to-make-winforms-application-dpi-aware?forum=vbgeneral

如果我不设置 dpiaware,那么主监视器的边界将减半(裁剪掉 3/4 的屏幕)。 如果我将 dpiaware 设置为 true,则辅助监视器的边界会加倍(在屏幕截图中留下大的黑色区域)。

【问题讨论】:

如果在控制台应用程序中运行您的代码(在 .NET 4.7 上)我会得到预期的结果(两个监视器的正确屏幕截图)。 感谢@Evk,您设置中的哪个显示器已缩放 DPI?初级还是次级?我认为主要是按比例缩放的可能很重要。如果它是缩放的主要,您是使用带有“”的清单,还是只使用默认值? 我使用默认值(未触及清单),我的主要缩放为 150%,次要(较小)为 100%(请注意,应用程序是控制台应用程序,而不是 winforms,如果这很重要)。 我真的很困惑为什么有人会问这个问题,知道清单很重要,但认为不显示他使用的清单是个好主意。这是错误的。 @Evk 我的应用程序也是一个控制台应用程序。我尝试将较大的主节点缩放到 150%(而不是 200%),并得到了同样的错误。还有一个问题:我的主要在左边(x=0),我的次要在右边(x=2880)。你的设置是一样的吗? 【参考方案1】:

如cmets中所说,解决方法是将app.manifest dpiAware标签设置为"true/pm"。效果与仅将其设置为 true 不同。

<application xmlns="urn:schemas-microsoft-com:asm.v3">
    <windowsSettings>
      <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true/pm</dpiAware>
    </windowsSettings>
  </application>

【讨论】:

这是唯一适用于 CopyFromScreen 的解决方案,恕我直言,应将其标记为正确答案。【参考方案2】:

你可以试试:How to get Windows Display settings?

这种方法对我有用

【讨论】:

以上是关于带有缩放的 Windows 屏幕截图的主要内容,如果未能解决你的问题,请参考以下文章

Autodesk Forge 获取带有标记的屏幕截图

sh 调试应用时的屏幕截图Sergei Shvetsov想出了一个漂亮的衬垫,它带有一个带有屏幕掩模的屏幕截图并将其输出到

拍摄 UIWebView 的快照/屏幕截图

App Store 显示错误手机的错误屏幕截图

Shutter - 带有众多功能的屏幕截图工具

Python调用windows API实现屏幕截图