hWndからモニター画面の解像度を取得するにはどうすればよいですか?
ウィンドウは複数のモニターのいずれかに配置される可能性があるため、hWndを使用しています。
つまり、hWndの左上の座標は、画面解像度が800x600のモニター上にあります。
PL / Bという言語でプログラムしているので、WindowsAPIを呼び出すことができます。
どのウィンドウAPIを使用できますか?
hWndからモニター画面の解像度を取得するにはどうすればよいですか?
ウィンドウは複数のモニターのいずれかに配置される可能性があるため、hWndを使用しています。
つまり、hWndの左上の座標は、画面解像度が800x600のモニター上にあります。
PL / Bという言語でプログラムしているので、WindowsAPIを呼び出すことができます。
どのウィンドウAPIを使用できますか?
これが私のために働くC++コード例です:
HMONITOR monitor = MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST);
MONITORINFO info;
info.cbSize = sizeof(MONITORINFO);
GetMonitorInfo(monitor, &info);
int monitor_width = info.rcMonitor.right - info.rcMonitor.left;
int monitor_height = info.rcMonitor.bottom - info.rcMonitor.top;
user32
関数MonitorFromWindowを使用すると、hwndを渡すことができ、それが置かれているモニターへのハンドルを返します(またはデフォルト-詳細については、リンクされたMSDNの記事を参照してください)。これにより、GetMonitorInfoを呼び出して、解像度の詳細を示すRECTを含むMONITORINFO構造体を取得できます。
詳細については、MSDNの「複数画面のリファレンス」セクションを参照してください。
サンプルコードを追加しますが、参照した言語がわかりません。また、C#サンプルコードがどれほど役立つかわかりません。あなたがそれが助けになると思うなら、私に知らせてください、そして私は本当に速い何かをコード化します。
GetSystemMetricsもあります。msdnで確認してください。
P / Invokeを介して(DPIで)解像度を取得するC#コードは次のとおりです。
public static void GetWindowDpi(IntPtr hwnd, out int dpiX, out int dpiY)
{
var handle = MonitorFromWindow(hwnd, MonitorFlag.MONITOR_DEFAULTTOPRIMARY);
GetDpiForMonitor(handle, MonitorDpiType.MDT_EFFECTIVE_DPI, out dpiX, out dpiY);
}
/// <summary>
/// Determines the function's return value if the window does not intersect any display monitor.
/// </summary>
[SuppressMessage("ReSharper", "IdentifierTypo")]
[SuppressMessage("ReSharper", "UnusedMember.Local")]
private enum MonitorFlag : uint
{
/// <summary>Returns NULL.</summary>
MONITOR_DEFAULTTONULL = 0,
/// <summary>Returns a handle to the primary display monitor.</summary>
MONITOR_DEFAULTTOPRIMARY = 1,
/// <summary>Returns a handle to the display monitor that is nearest to the window.</summary>
MONITOR_DEFAULTTONEAREST = 2
}
[DllImport("user32.dll")]
private static extern IntPtr MonitorFromWindow(IntPtr hwnd, MonitorFlag flag);
[SuppressMessage("ReSharper", "IdentifierTypo")]
[SuppressMessage("ReSharper", "UnusedMember.Local")]
private enum MonitorDpiType
{
/// <summary>
/// The effective DPI.
/// This value should be used when determining the correct scale factor for scaling UI elements.
/// This incorporates the scale factor set by the user for this specific display.
/// </summary>
MDT_EFFECTIVE_DPI = 0,
/// <summary>
/// The angular DPI.
/// This DPI ensures rendering at a compliant angular resolution on the screen.
/// This does not include the scale factor set by the user for this specific display.
/// </summary>
MDT_ANGULAR_DPI = 1,
/// <summary>
/// The raw DPI.
/// This value is the linear DPI of the screen as measured on the screen itself.
/// Use this value when you want to read the pixel density and not the recommended scaling setting.
/// This does not include the scale factor set by the user for this specific display and is not guaranteed to be a supported DPI value.
/// </summary>
MDT_RAW_DPI = 2
}
[DllImport("user32.dll")]
private static extern bool GetDpiForMonitor(IntPtr hwnd, MonitorDpiType dpiType, out int dpiX, out int dpiY);
高解像度のモニターの場合2K4K>1920px
void GetDesktopResolution(int* horizontal, int* vertical)
{
HDC hScreenDC = GetDC(GetDesktopWindow());
int width = GetDeviceCaps(hScreenDC, HORZRES);
int height = GetDeviceCaps(hScreenDC, VERTRES);
ReleaseDC(GetDesktopWindow(), hScreenDC);
RECT desktop;
const HWND hDesktop = GetDesktopWindow();
GetWindowRect(hDesktop, &desktop);
if (width > 2000)
{
const POINT ptZero = { 0, 0 };
HMONITOR mon = MonitorFromPoint(ptZero, MONITOR_DEFAULTTOPRIMARY);
DEVICE_SCALE_FACTOR f;// vers < win 8 = GetScaleFactorForDevice(DEVICE_PRIMARY);
GetScaleFactorForMonitor(mon,&f);
if (f > 110)
{
*horizontal = width * ((f+10) / 100.0);
*vertical = height * ((f+10) / 100.0);
}
else
{
*horizontal = width;
*vertical = height;
}
}
else
{
*horizontal = desktop.right;
*vertical = desktop.bottom;
}
}
RECT windowsize; // get the height and width of the screen
GetClientRect(hwnd, &windowsize);
int srcheight = windowsize.bottom;
int srcwidth = windowsize.right;