SystemParametersInfo und NONCLIENTMETRIC

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
iostream
Beiträge: 109
Registriert: 15.06.2008 12:59

SystemParametersInfo und NONCLIENTMETRIC

Beitrag von iostream »

Hallo liebe Foristen,

ich lese aktuell wie folgt die Standard-UI-Schrift aus:

Code: Alles auswählen

Define.NONCLIENTMETRICS NCM
Define MessageFont

NCM\cbSize = SizeOf(NONCLIENTMETRICS)
SystemParametersInfo_(#SPI_GETNONCLIENTMETRICS, SizeOf(NONCLIENTMETRICS), @NCM, 0)
MessageFont = CreateFontIndirect_(@NCM\lfMessageFont)
If MessageFont
	SetGadgetFont(#PB_Default, MessageFont)
EndIf
Nun habe ich zufällig mitbekommen, dass ab Vista ein zusätzlicher Integer in der Struktur
dazugekommen ist (http://msdn.microsoft.com/en-us/library ... p/ff729175).
D.h. unter XP übergebe ich SystemParametersInfo eine falsche größe (vier Bytes bei x86 zu viel),
da mein Programm ja unter 8.1 kompiliert wurde...oder?

Ich bin nun irritiert, da in PB die Struktur diesen zusätzlichen Integer nicht besitzt...wie programmiere
ich nun "richtig", damit mein Auslesen der Schriftart unter XP genau so erfolgreich ist wie unter 8.1?
OS: Windows 8.1 Pro
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: SystemParametersInfo und NONCLIENTMETRIC

Beitrag von edel »

z.B. so:

Code: Alles auswählen

Structure NONCLIENTMETRICS_VISTA Extends NONCLIENTMETRICS
	iPaddedBorderWidth.l
EndStructure

Procedure isVistaOrGreater()	
	Protected OSVerInfo.OSVERSIONINFOEX

	OSVerInfo\dwOSVersionInfoSize = SizeOf(OSVERSIONINFOEX)

	GetVersionEx_(@OSVerInfo)	
	
	ProcedureReturn Bool(OSVerInfo\dwMajorVersion>=6)
EndProcedure

Define.NONCLIENTMETRICS_VISTA NCM
Define MessageFont

If isVistaOrGreater()	
	NCM\cbSize = SizeOf(NONCLIENTMETRICS_VISTA)
Else	
	NCM\cbSize = SizeOf(NONCLIENTMETRICS)
EndIf

Debug SystemParametersInfo_(#SPI_GETNONCLIENTMETRICS, NCM\cbSize, @NCM, 0)
MessageFont = CreateFontIndirect_(@NCM\lfMessageFont)
If MessageFont
	SetGadgetFont(#PB_Default, MessageFont)	
EndIf
iostream
Beiträge: 109
Registriert: 15.06.2008 12:59

Re: SystemParametersInfo und NONCLIENTMETRIC

Beitrag von iostream »

Sowas hatte ich auch schon im Kopf. Aber macht es denn keine
Probleme, wenn ich dann unter XP SystemParametersInfo einen
Pointer auf eine Struktur übergebe, die mehr Elemente hat als
eigentlich vorgesehen (ich meine, XP kennt ja iPaddedBorderWidth
gar nicht)?
OS: Windows 8.1 Pro
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: SystemParametersInfo und NONCLIENTMETRIC

Beitrag von edel »

Nein, deswegen gibst du ja die Groesse der Struktur mit an.
iostream
Beiträge: 109
Registriert: 15.06.2008 12:59

Re: SystemParametersInfo und NONCLIENTMETRIC

Beitrag von iostream »

edel hat geschrieben:Nein, deswegen gibst du ja die Groesse der Struktur mit an.
Verstehe...d.h. selbst wenn da noch zehn Floats kommen würden wäre es egal,
da ich die korrekte Größe angebe?

Auf jeden Fall vielen Dank edel!
OS: Windows 8.1 Pro
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: SystemParametersInfo und NONCLIENTMETRIC

Beitrag von NicTheQuick »

iostream hat geschrieben:
edel hat geschrieben:Nein, deswegen gibst du ja die Groesse der Struktur mit an.
Verstehe...d.h. selbst wenn da noch zehn Floats kommen würden wäre es egal,
da ich die korrekte Größe angebe?
Korrekt.
Antworten