2016-12-15 159 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