xsharp.eu • Verfügbare Bildschirmgröße
Page 1 of 1

Verfügbare Bildschirmgröße

Posted: Mon Dec 27, 2021 8:01 am
by lagraf
Hallo,
wie kann ich die verfügbare Bildschirmfläche (Breite und Höhe) in VO 2.8 ermitteln?

Code: Select all

hScrDC := CreateDC(Cast2Psz("DISPLAY"), NULL_PSZ, NULL_PSZ , NULL_PSZ )
GetDeviceCaps(hScrDC, HORZRES)
GetDeviceCaps(hScrDC, VERTRES)
bestimmt die gesamte Bildschirmgröße. Ich benötige aber den verfügbaren Platz (abzüglich Taskleiste unten oder anderswo platziert).

Verfügbare Bildschirmgröße

Posted: Mon Dec 27, 2021 10:44 am
by Karl-Heinz
Hallo Franz,

Eine Suche findet das hier:

https://docs.microsoft.com/en-us/window ... etersinfoa

[...]
SPI_GETWORKAREA
0x0030

Retrieves the size of the work area on the primary display monitor. The work area is the portion of the screen not obscured by the system taskbar or by application desktop toolbars
[...]

Code: Select all

LOCAL struRect IS _winRECT 

IF SystemParametersInfo(SPI_GETWORKAREA, 0, @struRect, 0)
 
 ?  struRect.Top , struRect.Bottom , struRect.Left, struRect.Right

ENDIF		
Gruß
Karl-Heinz

Verfügbare Bildschirmgröße

Posted: Mon Dec 27, 2021 4:36 pm
by Karl-Heinz
Hallo Franz,

wahrscheinlich wäre es besser gleich die erwähnte GetMonitorInfo() zu verwenden.

Code: Select all

To get the work area of a monitor other than the primary display monitor, call the GetMonitorInfo function.
Ich habe momentan keinen ZUgriff auf einen zweiten Monitor um das zu überprüfen, aber falls die Anwendung mehrheitlich ;-) auf einem zweiten Monitor angezeigt wird würde a[1] und a[2] höchstwahrscheinlich andere Werte als SystemParametersInfo() anzeigen, auf jeden Fall müsste a[3] aber false beinhalten.

Code: Select all

LOCAL struRect IS _winrect
LOCAL a AS ARRAY	

	a := MonitorInfos ( GetDesktopWindow() )
	? a [1] , a [2]  , "primary monitor ?", a [3]  

 	SystemParametersInfo(SPI_GETWORKAREA, 0, @struRect, 0)
 
       ?  struRect.bottom , struRect.right

Code: Select all

STRUCTURE _winMONITORINFO 
	MEMBER cbSize AS DWORD
	MEMBER rcMonitor IS _winrect  
	MEMBER rcWork IS _winrect
	MEMBER dwFlags AS DWORD  
	
_DLL FUNCTION MonitorFromWindow ( hwnd AS PTR , dwFlags AS DWORD ) AS PTR PASCAL:User32.MonitorFromWindow

_DLL FUNCTION GetMonitorInfo ( hMonitor AS PTR, lpmi AS _winMONITORINFO ) AS LOGIC PASCAL:User32.GetMonitorInfoA
  
DEFINE MONITORINFOF_PRIMARY := 0x00000001
   
FUNCTION MonitorInfos ( hwnd AS PTR ) AS ARRAY PASCAL   
LOCAL struInfo IS _winMONITORINFO 
LOCAL hMonitor AS PTR 
  
	hMonitor := MonitorFromWindow( hwnd, MONITOR_DEFAULTTONEAREST )

	struInfo.cbSize := _SIZEOF(_winMONITORINFO)
	
	GetMonitorInfo( hMonitor, @struInfo) 
	
	RETURN { struInfo.rcWork.bottom - struInfo.rcWork.top ,  struInfo.rcWork.right - struInfo.rcWork.Left , struInfo.dwFlags ==  MONITORINFOF_PRIMARY }  
Gruß
Karl-Heinz

Verfügbare Bildschirmgröße

Posted: Mon Jan 03, 2022 2:23 pm
by lagraf
Hallo Karl-Heinz,
danke für deinen Code!

Die Anwendung läuft ausschließlich auf einem System mit 1 Monitor, sodaß die erste Variante genügen wird. Ich selber habe auch nur 1 Monitor, kanns daher auch nicht für mehrere Monitore probieren.