答えが見つからないように見える小さな問題があります。特定のプロセスを取得し、そのウィンドウ サイズを取得するアプリケーションがあります。唯一の問題は、実際の画面サイズ (ユーザーに表示される) のパーセンテージを占めることです。
アプリケーションのスクリーンショットを撮りたいのですが、ウィンドウの Rect を使用すると、解像度が 125% になるため、実際よりも小さい画面が表示されます。これは、出力される元の解像度 ( 1280 * 800
) が画面の解像度 ( 1600 * 1000
) よりも小さいことを意味します。私の質問は、これを修正する方法ですか?
DPIAware
trueに設定したマニフェストを作成しました。また、デバッグで Visual Studio ホスティングを無効にしました。しかし、それは役に立ちません。私はまだ同じ値と同じ問題を抱えています。実際のスクリーンショットのコードスニペットは次のとおりです。
RECT Rect = new RECT();
System.Diagnostics.Process[] p = System.Diagnostics.Process.GetProcessesByName("Process");
ShowWindow(p[0].MainWindowHandle, 9);
SetForegroundWindow(p[0].MainWindowHandle);
if (GetWindowRect(p[0].MainWindowHandle, ref Rect))
{
var bmp = new Bitmap(Rect.Width, Rect.Height);
var graphics = Graphics.FromImage(bmp);
graphics.CopyFromScreen(Rect.Left, Rect.Top, 0, 0, new Size(Rect.Width, Rect.Height), CopyPixelOperation.SourceCopy);
bmp.Save(@"C:\Screenshots\temp1.png");
}
これにより、 のスクリーンショットが得られますが、1280 * 800
プロセス全体をカバーするには不十分であり、1600 * 1000
. 画面座標が正しくないため、すべてがオフになっています。すべてに 1.25 を掛ければ問題ありませんが、他の PC の DPI 設定がわからないため、これは解決策ではありません。
編集3:
RECT を含む完全なコードを投稿します。
RECT Rect = new RECT();
System.Diagnostics.Process[] p = System.Diagnostics.Process.GetProcessesByName("LoLPatcherUx");
ShowWindow(p[0].MainWindowHandle, 9);
SetForegroundWindow(p[0].MainWindowHandle);
if (GetWindowRect(p[0].MainWindowHandle, ref Rect))
{
int processH = Rect.Bottom - Rect.Top;
int processW = Rect.Right - Rect.Left;
float processWidth;
float processHeight;
SizeF dpi = GetCurrentDpi();
// Calc the scale.
SizeF scale = new SizeF()
{
Width = dpi.Width / 96f,
Height = dpi.Height / 96f
};
// Scale the rectangle.
processWidth = Rect.Width * scale.Width;
processHeight = Rect.Height * scale.Height;
var bmp = new Bitmap(lolPatcherBreedte, lolPatcherHoogte);
Graphics graphics = Graphics.FromImage(bmp);
graphics.CopyFromScreen(Rect.Left, Rect.Top, 0, 0, new Size(processW, processH));
bmp.Save(@"C:\Screenshots\temp1.png");
}
public struct RECT
{
private int _Left;
private int _Top;
private int _Right;
private int _Bottom;
public RECT(RECT Rectangle)
: this(Rectangle.Left, Rectangle.Top, Rectangle.Right, Rectangle.Bottom) { }
public RECT(int Left, int Top, int Right, int Bottom)
{
_Left = Left;
_Top = Top;
_Right = Right;
_Bottom = Bottom;
}
public int X
{
get { return _Left; }
set { _Left = value; }
}
public int Y
{
get { return _Top; }
set { _Top = value; }
}
public int Left
{
get { return _Left; }
set { _Left = value; }
}
public int Top
{
get { return _Top; }
set { _Top = value; }
}
public int Right
{
get { return _Right; }
set { _Right = value; }
}
public int Bottom
{
get { return _Bottom; }
set { _Bottom = value; }
}
public int Height
{
get { return _Bottom - _Top; }
set { _Bottom = value + _Top; }
}
public int Width
{
get { return _Right - _Left; }
set { _Right = value + _Left; }
}
public Point Location
{
get { return new Point(Left, Top); }
set
{
_Left = value.X;
_Top = value.Y;
}
}
public Size Size
{
get { return new Size(Width, Height); }
set
{
_Right = value.Width + _Left;
_Bottom = value.Height + _Top;
}
}
public static implicit operator Rectangle(RECT Rectangle)
{
return new Rectangle(Rectangle.Left, Rectangle.Top, Rectangle.Width, Rectangle.Height);
}
public static implicit operator RECT(Rectangle Rectangle)
{
return new RECT(Rectangle.Left, Rectangle.Top, Rectangle.Right, Rectangle.Bottom);
}
public static bool operator ==(RECT Rectangle1, RECT Rectangle2)
{
return Rectangle1.Equals(Rectangle2);
}
public static bool operator !=(RECT Rectangle1, RECT Rectangle2)
{
return !Rectangle1.Equals(Rectangle2);
}
public override string ToString()
{
return "{Left: " + _Left + "; " + "Top: " + _Top + "; Right: " + _Right + "; Bottom: " + _Bottom + "}";
}
public override int GetHashCode()
{
return ToString().GetHashCode();
}
public bool Equals(RECT Rectangle)
{
return Rectangle.Left == _Left && Rectangle.Top == _Top && Rectangle.Right == _Right && Rectangle.Bottom == _Bottom;
}
public override bool Equals(object Object)
{
if (Object is RECT)
{
return Equals((RECT)Object);
}
else if (Object is Rectangle)
{
return Equals(new RECT((Rectangle)Object));
}
return false;
}
}