Fehler bei API-Funktion SystemParametersInfo
Verfasst: 01.06.2014 19:18
Hallo,
ich habe eine Frage zur API-Funktion SystemParametersInfo. Ich dachte, daß ich die Basics bezüglich des Aufrufs von API-Funktionen begriffen hätte, aber PureBasic hat mich unsaft auf den Boden der Realität zurückgeholt. Anlaß für meinen Optimismus war folgender erfolgreicher Aufruf, der die Höhe des Desktops abzüglich der Taskleiste ('client' oder 'working area') zurückgibt:
Alles läuft perfekt; ESPI gibt 1 zurück (erfolgreicher Aufruf) und in HDoTl wird (bei mir) der Wert 980 abgelegt.
Nun wollte ich von derselben Funktion (SystemParametersInfo gibt ja über so ziemlich alles mögliche Auskunft) den Font, den Windows in MessageBoxen verwendet, zurückgeben lassen. Diesen kann man aus der Struktur NONCLIENTMETRICS erfahren, die die uiAction (erster Parameter) #SPI_GETNONCLIENTMETRICS zurückgibt. Die zurückgegebene NONCLIENTMETRICS-Struktur enthält ihrerseits mehrere Strukturen vom Typ LOGFONT, von denen die letzte (lfMessageFont) die gewünschte Information enthält: ein statisches char-Array mit 32 Elementen (lfFaceName.c[32]).
Laut Win32.hlp muß ferner im zweiten Parameter uiParam die Größe der Struktur abgelegt werden:
Das ist natürlich ein anderes Kaliber als das erste Beispiel, und prompt läuft irgendetwas schief: ESPI liefert 0 zurück, also stimmt schon beim Aufruf irgendetwas nicht, und den ganzen Rest kann man sich schon sparen.
Hat von Euch jemand eine Idee, wo der Fehler steckt?
Vielen Dank
ich habe eine Frage zur API-Funktion SystemParametersInfo. Ich dachte, daß ich die Basics bezüglich des Aufrufs von API-Funktionen begriffen hätte, aber PureBasic hat mich unsaft auf den Boden der Realität zurückgeholt. Anlaß für meinen Optimismus war folgender erfolgreicher Aufruf, der die Höhe des Desktops abzüglich der Taskleiste ('client' oder 'working area') zurückgibt:
Code: Alles auswählen
Define.rect DoTl ; Desktop ohne Taskleiste (RECT-Struktur)
Define.i ESPI, HDoTl ; Ergebnis SystemParametersInfo, Höhe Desktop ohne Taskleiste
ESPI=SystemParametersInfo_(#SPI_GETWORKAREA, 0, @DoTl, 0)
HDoTl=DoTl\Bottom
Debug ESPI
Debug HDoTl
Nun wollte ich von derselben Funktion (SystemParametersInfo gibt ja über so ziemlich alles mögliche Auskunft) den Font, den Windows in MessageBoxen verwendet, zurückgeben lassen. Diesen kann man aus der Struktur NONCLIENTMETRICS erfahren, die die uiAction (erster Parameter) #SPI_GETNONCLIENTMETRICS zurückgibt. Die zurückgegebene NONCLIENTMETRICS-Struktur enthält ihrerseits mehrere Strukturen vom Typ LOGFONT, von denen die letzte (lfMessageFont) die gewünschte Information enthält: ein statisches char-Array mit 32 Elementen (lfFaceName.c[32]).
Laut Win32.hlp muß ferner im zweiten Parameter uiParam die Größe der Struktur abgelegt werden:
Ich habe keine Ahnung, was mit "cbSize member of this structure" gemeint. Auf Grundlage der übrigen Informationen habe ich folgenden Kode zusammengebastelt:SPI_GETNONCLIENTMETRICS retrieves the metrics associated with the nonclient area of nonminimized windows. The pvParam parameter must point to a NONCLIENTMETRICS structure that receives the information. Set the cbSize member of this structure and the uiParam parameter to sizeof(NONCLIENTMETRICS).
Code: Alles auswählen
Define.i ESPI, Ix
Define.nonclientmetrics Syzs ; Systemzeichensätze
Define.logfont MBF ; MessageBox-Font
Define.s MBFN ; MessageBox-Font-Name
ESPI=SystemParametersInfo_(#SPI_GETNONCLIENTMETRICS, SizeOf(NONCLIENTMETRICS), @SyZs, 0)
MBF=Syzs\lfMessageFont
For Ix=0 To 31
MBFN=MBFN+MBF\lfFaceName[Ix]
Next
Hat von Euch jemand eine Idee, wo der Fehler steckt?
Vielen Dank