2016-12-15 193 views
1

我试图做使用代码的屏幕截图如下的屏幕捕捉

Dim area As Rectangle = FormPrintArea.Bounds 
    Dim areaWidth As Integer = CInt(area.Width * ScaleFactor) 
    Dim areaHeight As Integer = CInt(area.Height * ScaleFactor) 
    Dim capture As Bitmap = New Bitmap(areaWidth, areaHeight, PixelFormat.Format32bppArgb) 
    Dim graph As Graphics = Graphics.FromImage(capture) 
    Dim ScaledSize As New Size With { 
     .Height = areaHeight, 
     .Width = areaWidth 
    } 
    graph.CopyFromScreen(area.X, area.Y, 0, 0, ScaledSize, CopyPixelOperation.SourceCopy) 
    PictureBox1.Image = capture 

`` 问题是我无法找到比例因子VB规模形式,一切都运行完美,只要“更改文本,应用程序和其他项目的大小:100%“,但如果它设置的不同,如125%(建议),则会丢失大约20%的图像。它看起来像LanguageFont类中有一个ScaleFactor,但我似乎无法从VB(或C#)访问它。

该应用程序具有用户用来定义打印区域的VB Form(FormPrintArea)。如果我在设置为125%(建议)的系统上将ScaleFactor设置为1.25,则一切正常。有没有什么办法通过API从Windows获取价值? ScaleFactor 1

ScaleFactor 1.25

+0

什么是ScaleFactor?为什么你需要它?你可以发布图片进行比较吗? –

+0

在Windows 10中,自定义您的显示器,第一个设置允许用户制作更大或更小的东西(文本,应用程序和其他项目)。在高清显示器(1920x1024)上,默认值为125%。在上面的代码中,如果设置为100%,则应用程序可以正常工作,FormPrintArea的大小= Graphics.FromImage(capture)捕获的内容。如果将此值设置为其他值(默认值为125%),则捕获的屏幕更少,如果将ScaleFactor设置为1.25,则所有内容都可以正确捕获。我想要的是通过API从Windows获取此值(ScaleFactor)。 –

+0

在上面的两张照片FormPrintArea的形式没有改变大小或移动。在屏幕上可视化看起来像第二个图像,当ScaleFactor = 1时将显示设置设置为125%时,您会看到第一个图像。将显示设置设置为100%并且ScaleFactor = 1时,您将获得第二个(正确的图像)。 –

回答

0

我需要声明我的应用程序DPIaware作为@Hans帕桑特说,最简单的方法是将行添加下面的部分类启动窗体(Form1)。

<DllImport("User32.dll")> Private Shared Sub SetProcessDPIAware() End Sub

然后改变新亚在启动窗体的结尾呼吁SetProcessDPIAware

Public Sub New() SetProcessDPIAware() InitializeComponent() End Sub

一旦你这样做,你可以得到尺度因子在Form1.Load如下 DPIScalingX = Me.CreateGraphics().DpiX/96 DPIScalingY = Me.CreateGraphics().DpiY/96