Fehler bei API-Funktion SystemParametersInfo

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Salafat
Beiträge: 30
Registriert: 05.01.2012 07:40
Computerausstattung: AMD FX-8350 Eight-Core-Prozessor 4,00 GHz
8 GB RAM
Windows 7 64-Bit
Wohnort: Berlin

Fehler bei API-Funktion SystemParametersInfo

Beitrag 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
PureBasic v5.11 x64
Windows 7 64-Bit
AMD FX-8350 Eight-Core Processor 4 GHz, 8 GB Arbeitsspeicher
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Fehler bei API-Funktion SystemParametersInfo

Beitrag 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)
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Salafat
Beiträge: 30
Registriert: 05.01.2012 07:40
Computerausstattung: AMD FX-8350 Eight-Core-Prozessor 4,00 GHz
8 GB RAM
Windows 7 64-Bit
Wohnort: Berlin

Re: Fehler bei API-Funktion SystemParametersInfo

Beitrag 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
PureBasic v5.11 x64
Windows 7 64-Bit
AMD FX-8350 Eight-Core Processor 4 GHz, 8 GB Arbeitsspeicher
Antworten