Seite 1 von 1

AppDesktopgröße unter Windows-10 [erledigt]

Verfasst: So, 23. Dez 2018 13:39
von peternmb
Hallo,

beim Auslesen meiner Desktopgröße fällt mir auf, dass eine unter Windows-10 festgelegte Skalierung dabei berücksichtigt wird.

Mein Monitor ist auf die vorgeschlagene Auflösung von 1680*1050 eingestellt.
Ich arbeite mit einer Skaliereung von 125%.
Mir wird beim Auslesen der AppDesktopgröße 1344*840 angezeigt.

Ich wollte, um die reale Desktopgröße zu erhalten, das dann mit dem DPI-Wert multiplizieren um die korrekte Desktopgröße zu erhalten.
Leider scheint meine Funktion dafür unter Windows-10 nicht mehr korrekt zu arbeiten, ich erhalte immer den Wert von 100%.

Was kann ich noch tun, um die reale Desktopgröße zuerhalten?
In der angezeigten MsgBox sind bei mir alle 3 Werte falsch.

Code: Alles auswählen

***********************************************************************************************************************************
*** Feststellen, welche Auflösung der Rechner hat
***********************************************************************************************************************************
FUNCTION AppDesktopDPI
//
LOCAL nHWnd := AppDesktop():GetHWnd()
LOCAL nHDC := DllCall("User32.DLL", DLL_STDCALL, "GetDC", nHWnd)
LOCAL nLogPix := 96
LOCAL LOGPIXELSY := 88
//
nLogPix := DllCall("GDI32.DLL", DLL_STDCALL, "GetDeviceCaps", nHDC, LOGPIXELSY)
DllCall("User32.DLL", DLL_STDCALL, "ReleaseDC", nHWnd, nHDC)
//
RETURN nLogPix

msgbox(str(AppDesktop():currentSize()[1],4,0)+" X "+ ;
       str(AppDesktop():currentSize()[2],4,0), ;
       "Skalierung "+str(AppDesktopDPI()/96*100,3,0)+"%")

Re: AppDesktopgröße unter Windows-10

Verfasst: Mo, 24. Dez 2018 2:53
von AUGE_OHR
hi,

unter Windows 10 gibt

Code: Alles auswählen

LOCAL nXLogPixel := @Gdi32:GetDeviceCaps( hDC, LOGPIXELSX )
LOCAL nYLogPixel := @Gdi32:GetDeviceCaps( hDC, LOGPIXELSY )
immer 96

Code: Alles auswählen

#define DESKTOPVERTRES       0x0075   // (117) 
#define DESKTOPHORZRES       0x0076   // (118) 
LOCAL nDHORZRES  := @Gdi32:GetDeviceCaps( hDC, DESKTOPHORZRES )
LOCAL nDVERTRES  := @Gdi32:GetDeviceCaps( hDC, DESKTOPVERTRES )
damit bekommt man die "echte" Bildschirm Grösse / AppDeskTop() -> Scale-Faktor

frohe Weihnachten :santa:

Re: AppDesktopgröße unter Windows-10

Verfasst: Mo, 24. Dez 2018 11:18
von peternmb
Hallo, vielen Dank für die Lösung. Auch dir schöne Weihnachten :santa:

Das erklärt/löst auch ein anderes Problem, mit dem ich mich über die Feiertage amüsieren wollte:
Unter Windows-10 wird bei mir die Caption von Elementen oft zu groß angezeigt.
-> na klar: ich teile die errechnete, passende CaptionSize immer noch durch die Skalierung um unabhängig von der Skalierung eine passende Schriftgröße zu erhalten. Da die Skalierung dann ja immer 1 ist, wird die Schrift nicht wirklich kleiner :banghead:

PS.: kann ich auch direkt die Skalierung auslesen lassen? Wenn ich die jetzt korrekt ausgelesene Auflösung durch die von Xbase angezeigte teile, dann funktioniert das zwar unter Windows-10 aber wie sieht es mit älteren OS z.B. XP aus?

Re: AppDesktopgröße unter Windows-10

Verfasst: Mo, 24. Dez 2018 11:26
von Jan
Peter,

um die Schriftgröße von Captions etc. mußt Du Dich nicht kümmern, wenn Du das dpiAware in Deine Manifest einbaust.

Jan

Re: AppDesktopgröße unter Windows-10

Verfasst: Mo, 24. Dez 2018 12:08
von peternmb
Jan hat geschrieben: Mo, 24. Dez 2018 11:26 ...
um die Schriftgröße von Captions etc. mußt Du Dich nicht kümmern, wenn Du das dpiAware in Deine Manifest einbaust.
Danke für den Hinweis.

Ich habe das bei mir so gelöst, dass der Anwender die Darstellung des Programmfensters in 10%-Schritten vergrößern/verkleinern kann.
Das funktioniert super, jeder kann sich das Programmfenster genauso groß machen, wie er es gerne hätte/braucht.
Dafür rechne ich auch die beste Größe der Caption aus.

Ich möchte daran auch nichts ändern, da es bis zu W10 absolut perfekt funktionierte.

Re: AppDesktopgröße unter Windows-10

Verfasst: Mo, 24. Dez 2018 12:13
von peternmb

Code: Alles auswählen

#define DESKTOPVERTRES       0x0075   // (117) 
#define DESKTOPHORZRES       0x0076   // (118) 
PROCEDURE Main
LOCAL nEvent, ;
      nHWnd := AppDesktop():GetHWnd(), ;
      nHDC := DllCall("User32.DLL", DLL_STDCALL, "GetDC", nHWnd), ;
      nDHORZRES := @Gdi32:GetDeviceCaps( nHDC, DESKTOPHORZRES ), ;
      nDVERTRES := @Gdi32:GetDeviceCaps( nHDC, DESKTOPVERTRES )
ich erhalte beim compilieren die Fehlermeldung:
invalide use of @ (pass bei reference) operator
muss ich da noch etwas einbinden oder was mache ich denn da falsch :?

Re: AppDesktopgröße unter Windows-10

Verfasst: Mo, 24. Dez 2018 17:41
von georg
Hallo,


ja, Du brauchst die OT4XB. Bitte auch die entsprechende Header-Datei ot4xb.ch einbinden, dann sollte es klappen.

Re: AppDesktopgröße unter Windows-10

Verfasst: Mo, 24. Dez 2018 21:27
von AUGE_OHR
hi,
peternmb hat geschrieben: Mo, 24. Dez 2018 12:13 ich erhalte beim compilieren die Fehlermeldung:
invalide use of @ (pass bei reference) operator
muss ich da noch etwas einbinden oder was mache ich denn da falsch :?
sorry das ist ot4xb Syntax

hier die pure Xbase++ Version

Code: Alles auswählen

FUNCTION GetDeviceCaps( nhDC, nPIXELS )
RETURN ( DllCall( "Gdi32.dll", DLL_STDCALL, "GetDeviceCaps", nhDC, nPIXELS ) )

Re: AppDesktopgröße unter Windows-10

Verfasst: Di, 25. Dez 2018 17:54
von peternmb
Hallo, frohe Weihnachten :santa:

funktioniert prima mit ot4xb - allerdings unter Win7 muss ich meine alte Funktion verwenden.
Da gibt Xbase die korrekte Bildschirmgröße ohne Berücksichtigung der Skalierung an...

Re: AppDesktopgröße unter Windows-10

Verfasst: Di, 25. Dez 2018 17:57
von peternmb
peternmb hat geschrieben: Di, 25. Dez 2018 17:54 Hallo, frohe Weihnachten :santa:

funktioniert prima mit ot4xb
Allerdings muss ich unter Win7 um den Scalefaktor zu ermittlen meine alte Funktion verwenden.
Dort gibt Xbase die korrekte Bildschirmgröße ohne Berücksichtigung der Skalierung an...

Re: AppDesktopgröße unter Windows-10 [erledigt]

Verfasst: Mo, 04. Feb 2019 18:43
von Manfred
ich klinke mich nochmal hier ein. Irgendwas mache ich total falsch. Ich bekomme auch nur verkehrte Werte zurück. Können wir das nochmal Schritt für Schritt durchgehen, was man machen muß um unter Windows 10 vernünftig die Desktopmaße und die DPI Einstellung zu ermitteln? Weiterhin habe ich festgestellt, das die stufenlose Verstellung der % Angaben überhaupt nicht erkannt wird.

Re: AppDesktopgröße unter Windows-10 [erledigt]

Verfasst: Mo, 04. Feb 2019 23:59
von AUGE_OHR
es gibt 3 Möglichkeiten

1.) DPIaware
2.) X,Y Faktor
3.) Font Grösse

bei 1.) bleibt die App in der realen Grösse unabhängig von der Auflösung oder Skale-Faktor

Nr. 2.) ist wohl das was du hast. dabei muss man die reale (native) Auflösung im Verhältnis zu AppDesktop():CurrentSize() nehmen

die Methode 3.) ist nun die Version die ich nehme. Ich habe dazu einen Referenz String woraus ich den X,Y Faktor berechne.

Re: AppDesktopgröße unter Windows-10 [erledigt]

Verfasst: Di, 05. Feb 2019 8:08
von Manfred
erstmal eine Frage zu Anfang. Wenn ich einen PC habe, der mehrere Bildschirme hat, die unterschiedliche Auflösung und DPI Einstellungen haben, kann man dann für jeden Bildschirm die DAten exakt ermitteln, oder bringt das schon Chaos? Ich bekomme Werte geliefert, die sind total abstrus.

Re: AppDesktopgröße unter Windows-10 [erledigt]

Verfasst: Di, 05. Feb 2019 15:02
von AUGE_OHR
moin,
Manfred hat geschrieben: Di, 05. Feb 2019 8:08 Ich bekomme Werte geliefert, die sind total abstrus.
Ich schätze mal das man für AppDeskTop():CurrentSize() die Breite der Summe aller Monitore bekommt und für die Höhe ... den höchsten Wert :?:

mit "pure" Xbase++ könnte es schwierig werden aber Pablo hat wohl eine Lösung die man erweitern könnte (erfordert ot4xb)
MonitorInfo.zip
Source
need ot4xb
(2.29 KiB) 249-mal heruntergeladen

Code: Alles auswählen

function GetMonitorInfoArray()
local hData     := _Var2Con( {} )
@user32:EnumDisplayMonitors(0,0,_callback_MonitorEnumProc(),hData)
return _ConRelease(hData)
das ganze arbeitet mit einem Callback (OBJ anbei) der so aussieht

Code: Alles auswählen

XPPCBK VERSION 001.000.012
BEGIN CALLBACK MonitorEnumProc AS BOOL
  PARAM HANDLE 
  PARAM HANDLE
  PARAM POINTER32
  PARAM LONG
END CALLBACK
mittels des Callback fragt er nun jeden einzeln Monitor ab.
die Pointer zeigen nun jeweils zur entsprechenden Monitor Structure

Code: Alles auswählen

BEGIN STRUCTURE MONITORINFOEX
   MEMBER DWORD    cbSize 
   MEMBER @ RECT   rcMonitor
   MEMBER @ RECT   rcWork 
   MEMBER DWORD    dwFlags 
   MEMBER SZSTR    szDevice SIZE 32
END STRUCTURE
ich bin mir allerdings nicht sicher ob es die realen native Werte sind oder durch irgendwas beeinflusst wird.

Re: AppDesktopgröße unter Windows-10 [erledigt]

Verfasst: Sa, 09. Feb 2019 13:45
von georg
Hallo,


also, ich habe mir das mal angesehen und bekomme bei meinen zwei Monitoren (links: 2560*1440, rechts: 1920*1080, wobei der linke Monitor der Hauptmonitor ist) folgendes Ergebnis:

Bild

Windows betrachtet den rechten Monitor als #1, das ist eben so. Aber die Auflösungswerte finde ich nur "teilweise" wieder, d.h. r:2560 b:1400 - hier fehlen 40 Pixel bei der Höhe (das ist die Höhe der Taskleiste), genau wie beim zweiten Monitor r:4480 (2560+1920=4480) und b:1040 (anstelle der 1080, die ich erwartet hätte).

Auf jeden Fall sehr interessant.