Seite 1 von 1

Fehler bei API-Funktion SystemParametersInfo

Verfasst: 01.06.2014 19:18
von Salafat
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:

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 
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:
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).
Ich habe keine Ahnung, was mit "cbSize member of this structure" gemeint. Auf Grundlage der übrigen Informationen habe ich folgenden Kode zusammengebastelt:

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

Re: Fehler bei API-Funktion SystemParametersInfo

Verfasst: 01.06.2014 20:01
von Danilo
Du hast einen Teil des Zitates noch nicht umgesetzt:
Set the cbSize member of this structure and the uiParam parameter to sizeof(NONCLIENTMETRICS).
Du musst also vor dem Funktionsaufruf noch die Größe in der Strukturvariablen setzen:

Code: Alles auswählen

Syzs\cbSize = SizeOf(NONCLIENTMETRICS)

Re: Fehler bei API-Funktion SystemParametersInfo

Verfasst: 01.06.2014 23:02
von Salafat
Danilo, herzlichen Dank -- genau das war der Fehler. Die vielen verschiedenen (und für BASIC-Programmierer ungewohnten) Datentypen der Windows-API sind echt der Horror.

Gruß
Salafat