2010-01-28 4 views
15

Wie bekomme ich die Bildschirmauflösung von einem hWnd?Wie bekomme ich die Bildschirmauflösung von einem hWnd?

Ich benutze eine hWnd, weil das Fenster auf einem von mehreren Monitoren liegen könnte.

das heißt, die hWnd oben/links befindet sich auf einem Monitor-Koordinate, die eine Bildschirmauflösung von 800 x 600

-I-Programm in einer Sprache PL/B genannt hat und es Windows-API erlaubt es aufgerufen wird.

Welche Fenster-APIs können verwendet werden?

Antwort

17

Die Funktion user32 Funktion MonitorFromWindow ermöglicht es Ihnen, ein HWND übergeben, und gibt ein Handle auf den Monitor zurück, es ist (oder ein Standard - siehe den verknüpften MSDN-Artikel für Details). Mit diesem können Sie GetMonitorInfo aufrufen, um eine MONITORINFO struct abzurufen, die eine RECT enthält, die ihre Auflösung aufführt.

Weitere Informationen finden Sie im Abschnitt Multiple Screens Reference von MSDN.

Ich würde Beispielcode hinzufügen, aber ich weiß nicht die Sprache, auf die Sie verwiesen, und ich weiß nicht, wie nützlich C# Beispielcode für Sie wäre. Wenn Sie denken, dass es hilft, lassen Sie es mich wissen und ich werde schnell etwas programmieren.

+0

Vielen Dank Erik. Ich konnte es mithilfe der von Ihnen angegebenen Referenzen in PL/B konvertieren. –

+0

Großartig, ich bin froh, es zu hören. =) –

4

Es gibt GetSystemMetrics auch, check it out auf Msdn

+3

Wahr, jedoch wird die Verwendung von MonitorFromWindow in einer Situation, in der der Endbenutzer über mehrere Monitore verfügt, besser funktionieren. – sidewinderguy

+0

@sidewinderguy Was macht RECT rcWork; bedeutet in der MONITORINFO-Struktur? Nicht bekommen, was es mit "Arbeitsbereich Rechteck des Monitors" auf MSDN – control

16

Hier ist ein C++ Codebeispiel, das funktioniert für mich:

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; 
+0

bedeutet Ich mag diese Methode. Es funktioniert auch für mich in C++. –

-1
RECT windowsize; // get the height and width of the screen 
GetClientRect(hwnd, &windowsize); 

int srcheight = windowsize.bottom; 
int srcwidth = windowsize.right; 
+0

Dies ist eine Fenstergröße, nicht Bildschirmgröße. – NateS

2

Hier einige C# -Code, der die Auflösung (in DPI) bekommt via P/Invoke:

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);