私はWindows 10マシンですべての画面のスクリーンショットを撮ろうとしています。 私のシステムには、複数のDPIで構成されるモニタが2つあります。スケーリング付きWindowsスクリーンショット
私はすべての単一モニタのスクリーンショットを撮るために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倍になります(スクリーンショットに黒い部分が残っています)。
コンソールアプリケーション(.NET 4.7)でコードを実行すると、期待通りの結果が得られます(両方のモニターの正しいスクリーンショット)。 – Evk
ありがとう@Evk、どのモニタがDPIのスケールを調整しましたか?プライマリまたはセカンダリ?私は、プライマリがスケーリングされたものであることが重要かもしれないと思う。それが拡張されたプライマリである場合は、 ""のマニフェストを使用していますか? –
eshalev
私はデフォルトを使用しています。私のプライマリは150%に、セカンダリは100%になります(アプリケーションはコンソールアプリケーションであり、winformsは問題ありません)。 – Evk