2017-10-30 55 views
1

私はWindows 10マシンですべての画面のスクリーンショットを撮ろうとしています。 私のシステムには、複数のDPIで構成されるモニタが2つあります。スケーリング付きWindowsスクリーンショット

  • 私のプライマリモニタには、「縮尺とレイアウト」が200%に設定されています。
  • 私のセカンダリ には、「縮尺とレイアウト」が100%に設定されています。 enter image description here

私はすべての単一モニタのスクリーンショットを撮るために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に設定すると、セカンダリモニタの境界が2倍になります(スクリーンショットに黒い部分が残っています)。

+0

コンソールアプリケーション(.NET 4.7)でコードを実行すると、期待通りの結果が得られます(両方のモニターの正しいスクリーンショット)。 – Evk

+0

ありがとう@Evk、どのモニタがDPIのスケールを調整しましたか?プライマリまたはセカンダリ?私は、プライマリがスケーリングされたものであることが重要かもしれないと思う。それが拡張されたプライマリである場合は、 ""のマニフェストを使用していますか? – eshalev

+0

私はデフォルトを使用しています。私のプライマリは150%に、セカンダリは100%になります(アプリケーションはコンソールアプリケーションであり、winformsは問題ありません)。 – Evk

答えて

0

コメントに記載されているように、解決策は、"true/pm"にapp.manifest dpiAwareタグを設定することです。その効果は、それを真に設定するだけとは異なります。

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