Systeminformationen

Es gibt einige Systeminformationen, die man mit Umgebungsvariablen und somit ganz ohne APIs ermitteln kann. Die folgende Tabelle enthält Umgebungsvariablen, die so manchen API-Aufruf, den man im Netz finden kann, überflüssig machen.

Umgebungsvariablen
VariableBeispiel
COMPUTERNAME  MeinPC
PATHC:\Windows\system32;C:\Windows
ProgramW6432C:\Program Files
SystemRootC:\Windows
TEMPC:\Users\Maier\AppData\Local\Temp
USERNAMEMaier

ProgramW6432 ist nur auf 64-Bit Windows vorhanden und kann daher zur Unterscheidung von 32- und 64-Bit Windows genutzt werden:

Public Function isWin64Bit() As Boolean
    isWin64Bit = Len(Environ("ProgramW6432"))
End Function

GetLocaleInfoEx

Liefert zahlreiche verschiedene Informationen zu einem Gebietsschema. Der Rückgabewert wird in den Parameter LCType geschrieben. Der eigentliche Rückgabewert der Funktion gibt die Anzahl der Zeichen von LCType an bzw. 0, wenn die Funktion nichts zurückgegeben hat.

Im Parameter LocaleName muss ein Gebietsschema angegeben werden. Möglich sind Sprachangaben nach ISO 639 oder Länderangaben nach ISO 3166, die auch kombiniert werden können, also beispielsweise:

Es ist auch ein Leerstring bzw. vbNullString möglich. Dann wird von einem „unveränderlichen Land“ ausgegangen.

Sowohl LocaleName als auch der Rückgabewert lpLCData sind Unicode-Strings. Für die Verwendung mit VBA müssen sie umgewandelt werden.

Welche Information zurückgegeben wird, hängt vom Parameter LCType ab. Fängt LCType mit LOCALE_I an, ist der Rückgabewert lpLCData ein String, der ausschließlich aus Ziffern besteht.

#If VBA7 Then
    Private Declare PtrSafe Function GetLocaleInfoEx Lib "kernel32" _
        (ByVal LocaleName As String, ByVal LCType As eLCType, _
        ByVal lpLCData As String, ByVal cchData As Long) As Long
#Else
    Private Declare Function GetLocaleInfoEx Lib "kernel32" _
        (ByVal LocaleName As String, ByVal LCType As eLCType, _
        ByVal lpLCData As String, ByVal cchData As Long) As Long
#End If

Public Enum eLCType
    LOCALE_SLOCALIZEDDISPLAYNAME = &H2   'Sprachname (evtl mit Land) des Gebietsschemas
    LOCALE_SENGLISHDISPLAYNAME = &H72    'Sprachname (evtl mit Land) in Englisch
    LOCALE_SNATIVEDISPLAYNAME = &H73     'Sprachname (evtl mit Land) in lokaler Sprache

    LOCALE_SLOCALIZEDLANGUAGENAME = &H6F 'Sprachname des Gebietsschemas
    LOCALE_SENGLISHLANGUAGENAME = &H1001 'Sprachname in Englisch
    LOCALE_SNATIVELANGUAGENAME = &H4     'Sprachname in lokaler Sprache

    LOCALE_SLOCALIZEDCOUNTRYNAME = &H6   'Landesname des Gebietsschemas
    LOCALE_SENGLISHCOUNTRYNAME = &H1002  'Landesname in Englisch
    LOCALE_SNATIVECOUNTRYNAME = &H8      'Landesname in lokaler Sprache

    LOCALE_SISO639LANGNAME = &H59        'Sprachname nach ISO639
    LOCALE_SISO3166CTRYNAME = &H5A       'Landesname nach ISO3166 (2 Stellen)
    LOCALE_SISO3166CTRYNAME2 = &H68      'Landesname nach ISO3166 (3 Stellen)
    LOCALE_SNAME = &H5C                  'Sprachname nach RFC4646 (zB: de-DE_phoneb)
    LOCALE_SSCRIPTS = &H6C               'üblicher Zeichensatz

    LOCALE_SABBREVLANGNAME = &H3         '3stelliger Sprachname (2 Stellen: ISO639/1, 1 Stelle: 1.Zchn der Subsprache)
    LOCALE_IDIALINGCODE = &H5            'internationale Telefonvorwahl
    LOCALE_SABBREVCTRYNAME = &H7         'Abgekürzer Sprachname (ISO3166)
    LOCALE_IGEOID = &H5B                 'geografische ID eines Landes

    LOCALE_IDEFAULTCODEPAGE = &HB        'Standard Codepage
    LOCALE_IDEFAULTANSICODEPAGE = &H1004 'ANSI Codepage für Anwendungen, die kein UTF können
    LOCALE_IDEFAULTMACCODEPAGE = &H1011  'Macintosh Codepage für Anwendungen, die kein UTF können
    LOCALE_IDEFAULTEBCDICCODEPAGE = &H1012 'EBCDIC Codepage für Anwendungen, die kein UTF können

    LOCALE_SPOSITIVESIGN = &H50          'positives Vorzeichen
    LOCALE_SNEGATIVESIGN = &H51          'negatives Vorzeichen
    LOCALE_IPOSSIGNPOSN = &H52           'Wo positives Vorzeichen: 1:vor, 2=hinter, 3=vor Währung, 4=hinter Währung
    LOCALE_INEGSIGNPOSN = &H53           'Wo negatives Vorzeichen: wie IPOSSIGNPOSN, plus 0:in Klammern
    LOCALE_SNAN = &H69                   'Bezeichnung für nicht definiert (Not a Number)
    LOCALE_SPOSINFINITY = &H6A           'Bezeichnung für +unendlich
    LOCALE_SNEGINFINITY = &H6B           'Bezeichnung für -unendlich

    LOCALE_SLIST = &HC                   'Listentrennzeichen
    LOCALE_IMEASURE = &HD                '0=Metrisch, 1=US
    LOCALE_SDECIMAL = &HE                'Dezimaltrennzeichen
    LOCALE_STHOUSAND = &HF               'Tausendertrennzeichen
    LOCALE_SGROUPING = &H10              'Gruppierungsregel für Tausendertrennzeichen
    LOCALE_IDIGITS = &H11                'Anzahl Nachkommastellen
    LOCALE_ILZERO = &H12                 '0=keine führende Nullen, 1=führende Nullen,
    LOCALE_INEGNUMBER = &H1010           'Darstellung negativer Zahlen: 0="(1)", 1="-1", 2="- 1", 3="1-", 4="1 -"

    LOCALE_SNATIVEDIGITS = &H13          'Äquivalente für "0123456789" in bestimmten Sprachen
    LOCALE_IDIGITSUBSTITUTION = &H1014   'Bestimmung der Äquivalente: 0=Kontext, 1=Keine, 2=abhängig von SNATIVEDIGITS

    LOCALE_SCURRENCY = &H14              'Währungssymbol
    LOCALE_SINTLSYMBOL = &H15            'Internationaler Währungsbezeichner
    LOCALE_SMONDECIMALSEP = &H16         'Dezimaltrennzeichen für Währung
    LOCALE_SMONTHOUSANDSEP = &H17        'Tausendertrennzeichen für Währung
    LOCALE_SMONGROUPING = &H18           'Gruppierungsregel für Tausendertrennzeichen für Währung
    LOCALE_ICURRDIGITS = &H19            'Anzahl Nachkommastellen für Währung
    LOCALE_ICURRENCY = &H1B              'Position Währungssymbol: 0="$1", 1="1$", 2="$ 1", 3="1 $"
    LOCALE_IPOSSYMPRECEDES = &H54        'Währungssymbol vor Betrag? 1=Ja, 0=Nein
    LOCALE_IPOSSEPBYSPACE = &H55         'Währungssymbol mit Leerzeichen: 1=Ja, 0=Nein
    LOCALE_INEGCURR = &H1C               'Darstellung negativer Währungsbeträge
    LOCALE_INEGSYMPRECEDES = &H56        'negatives Währungssymbol vor Betrag? 1=Ja, 0=Nein
    LOCALE_INEGSEPBYSPACE = &H57         'negatives Währungssymbol mit Leerzeichen: 1=Ja, 0=Nein
    LOCALE_SENGCURRNAME = &H1007         'Währungsbezeichnung in englisch
    LOCALE_SNATIVECURRNAME = &H1008      'Währungsbezeichnung in lokaler Sprache

    LOCALE_SSHORTDATE = &H1F             'Formatstring für kurzes Datum
    LOCALE_SLONGDATE = &H20              'Formatstring für langes Datum
    LOCALE_STIMEFORMAT = &H1003          'Formatstring für Zeit
    LOCALE_SYEARMONTH = &H1006           'Formatstring für Jahr und Monat
    LOCALE_SDURATION = &H5D              'Formatstring für Zeitdauer
    LOCALE_S1159 = &H28                  'AM Anzeige
    LOCALE_S2359 = &H29                  'PM Anzeige
    LOCALE_ICALENDARTYPE = &H1009        'Verwendeter Kalender
    LOCALE_IOPTIONALCALENDAR = &H100B    'Zusätzlich verwendeter Kalender
    LOCALE_IFIRSTDAYOFWEEK = &H100C      'Erster Tag der Woche: 0=Montag, 1=Dienstag, ... 6=Sonntag
    LOCALE_IFIRSTWEEKOFYEAR = &H100D     'Erste Woche des Jahres:
                                         '0=Woche mit 1.Jan, 1=1.volle Woche nach 1.Jan, 2=1.Woche mit min 4 Tagen

    LOCALE_IPAPERSIZE = &H100A           'übliches Papierformat: 1=Letter, 5=Legal, 8=A3, 9=A4
    LOCALE_SKEYBOARDSTOINSTALL = &H5E    'Liste potentiell installierbarer Tastaturen
    LOCALE_SSORTNAME = &H1013            'Name des Sortieralgorhythmus

    LOCALE_SDAYNAME1 = &H2A              'Bezeichnung für Montag
    LOCALE_SDAYNAME2 = &H2B              'Bezeichnung für Dienstag
    LOCALE_SDAYNAME3 = &H2C              'Bezeichnung für Mittwoch
    LOCALE_SDAYNAME4 = &H2D              'Bezeichnung für Donnerstag
    LOCALE_SDAYNAME5 = &H2E              'Bezeichnung für Freitag
    LOCALE_SDAYNAME6 = &H2F              'Bezeichnung für Samstag
    LOCALE_SDAYNAME7 = &H30              'Bezeichnung für Sonntag
    LOCALE_SABBREVDAYNAME1 = &H31        'Abkürzung für Montag
    LOCALE_SABBREVDAYNAME2 = &H32        'Abkürzung für Dienstag
    LOCALE_SABBREVDAYNAME3 = &H33        'Abkürzung für Mittwoch
    LOCALE_SABBREVDAYNAME4 = &H34        'Abkürzung für Donnerstag
    LOCALE_SABBREVDAYNAME5 = &H35        'Abkürzung für Freitag
    LOCALE_SABBREVDAYNAME6 = &H36        'Abkürzung für Samstag
    LOCALE_SABBREVDAYNAME7 = &H37        'Abkürzung für Sonntag
    LOCALE_SSHORTESTDAYNAME1 = &H60      'Noch kürzer für Montag
    LOCALE_SSHORTESTDAYNAME2 = &H61      'Noch kürzer für Dienstag
    LOCALE_SSHORTESTDAYNAME3 = &H62      'Noch kürzer für Mittwoch
    LOCALE_SSHORTESTDAYNAME4 = &H63      'Noch kürzer für Donnerstag
    LOCALE_SSHORTESTDAYNAME5 = &H64      'Noch kürzer für Freitag
    LOCALE_SSHORTESTDAYNAME6 = &H65      'Noch kürzer für Samstag
    LOCALE_SSHORTESTDAYNAME7 = &H66      'Noch kürzer für Sonntag
    LOCALE_SMONTHNAME1 = &H38            'Bezeichnung für Januar
    LOCALE_SMONTHNAME2 = &H39            'Bezeichnung für Februar
    LOCALE_SMONTHNAME3 = &H3A            'Bezeichnung für März
    LOCALE_SMONTHNAME4 = &H3B            'Bezeichnung für April
    LOCALE_SMONTHNAME5 = &H3C            'Bezeichnung für Mai
    LOCALE_SMONTHNAME6 = &H3D            'Bezeichnung für Juni
    LOCALE_SMONTHNAME7 = &H3E            'Bezeichnung für Juli
    LOCALE_SMONTHNAME8 = &H3F            'Bezeichnung für August
    LOCALE_SMONTHNAME9 = &H40            'Bezeichnung für September
    LOCALE_SMONTHNAME10 = &H41           'Bezeichnung für Oktober
    LOCALE_SMONTHNAME11 = &H42           'Bezeichnung für November
    LOCALE_SMONTHNAME12 = &H43           'Bezeichnung für Dezember
    LOCALE_SMONTHNAME13 = &H100E         'Bezeichnung für 13ten Monat (falls es ihn gibt)
    LOCALE_SABBREVMONTHNAME1 = &H44      'Abkürzung für Januar
    LOCALE_SABBREVMONTHNAME2 = &H45      'Abkürzung für Februar
    LOCALE_SABBREVMONTHNAME3 = &H46      'Abkürzung für März
    LOCALE_SABBREVMONTHNAME4 = &H47      'Abkürzung für April
    LOCALE_SABBREVMONTHNAME5 = &H48      'Abkürzung für Mai
    LOCALE_SABBREVMONTHNAME6 = &H49      'Abkürzung für Juni
    LOCALE_SABBREVMONTHNAME7 = &H4A      'Abkürzung für Juli
    LOCALE_SABBREVMONTHNAME8 = &H4B      'Abkürzung für August
    LOCALE_SABBREVMONTHNAME9 = &H4C      'Abkürzung für September
    LOCALE_SABBREVMONTHNAME10 = &H4D     'Abkürzung für Oktober
    LOCALE_SABBREVMONTHNAME11 = &H4E     'Abkürzung für November
    LOCALE_SABBREVMONTHNAME12 = &H4F     'Abkürzung für Dezember
    LOCALE_SABBREVMONTHNAME13 = &H100F   'Abkürzung für 13ten Monat (falls es ihn gibt)

    'Ab Windows 7:
    LOCALE_IREADINGLAYOUT = &H70         'Schreibrichtung: 0=Links-Rechts, 1=Rechts-Links, 2=Oben-Unten, 3=Unten-Oben
    LOCALE_INEGATIVEPERCENT = &H74       'Position Prozentzeichen und Minus bei negativen Werten
    LOCALE_IPOSITIVEPERCENT = &H75       'Position Prozentzeichen: 0="1 %", 1="1%", 2="%1", 3="% 1"
    LOCALE_SPERCENT = &H76               'Das Prozentsymbol
    LOCALE_SPERMILLE = &H77              'Das Promillesymbol
    LOCALE_SMONTHDAY = &H78              'Formatstring für Tag und Monat
    LOCALE_SSHORTTIME = &H79             'Formatstring für kurzes Zeitformat (idR ohne Sekunden)
    LOCALE_RETURN_GENITIVE_NAMES = &H10000000 'mit "Or LOCALE_SMONTHNAME1-13":
                                              'Genitivform des Monats (nur manche Sprachen)
End Enum


Public Function apiGetLocaleInfoEx(lngLCType As eLCType, Optional LocaleName As String = "de") As String Dim lngLocale As Long Dim strLCData As String Dim lngX As Long Dim lngSize As Long lngSize = 255 strLCData = String(lngSize, vbNullChar) lngX = GetLocaleInfoEx(StrConv(LocaleName, vbUnicode), lngLCType, strLCData, lngSize) If lngX <> 0 Then apiGetLocaleInfoEx = Replace(StrConv(strLCData, vbFromUnicode), vbNullChar, "") Else apiGetLocaleInfoEx = "" End If End Function
Public Sub
demoLocale() Dim strCtry(1) As String, i As Long strCtry(0) = "ar" strCtry(1) = "de-at" For i = 0 To 1 Debug.Print "In "; apiGetLocaleInfoEx(LOCALE_SLOCALIZEDCOUNTRYNAME, strCtry(i)); _ " ("; apiGetLocaleInfoEx(LOCALE_SISO3166CTRYNAME, strCtry(i)); _ ") spricht man "; apiGetLocaleInfoEx(LOCALE_SLOCALIZEDLANGUAGENAME, strCtry(i)) Next Debug.Print vbNewLine; "Die Sortierreihenfolge "; apiGetLocaleInfoEx(LOCALE_SNAME, "de-de_phoneb"); _ " nennt man "; apiGetLocaleInfoEx(LOCALE_SSORTNAME, "de-de_phoneb") Debug.Print vbNewLine; apiGetLocaleInfoEx(LOCALE_SMONTHNAME1, "de"); " heißt in "; _ apiGetLocaleInfoEx(LOCALE_SLOCALIZEDCOUNTRYNAME, "de-at"); " "; _ apiGetLocaleInfoEx(LOCALE_SMONTHNAME1, "de-at") Debug. Print "In "; apiGetLocaleInfoEx(LOCALE_SLOCALIZEDCOUNTRYNAME, "hr"); " heißt er "; _ apiGetLocaleInfoEx(LOCALE_SMONTHNAME1, "hr"); ", und der Monatserste ist dann '1. "; _ apiGetLocaleInfoEx(LOCALE_SMONTHNAME1 Or LOCALE_RETURN_GENITIVE_NAMES, "hr"); "'" End Sub

Die Demofunktion zeigt nur einige der so ermittelbaren Informationen an.

demoLocale
In Saudi-Arabien (SA) spricht man Arabisch
In Österreich (AT) spricht man Deutsch

Die Sortierreihenfolge de-DE_phoneb nennt man Telefonbuch (DIN)

Januar heißt in Österreich Jänner
In Kroatien heißt er sijecanj, und der Monatserste ist dann '1. sijecnja'

GetSystemDirectory

Ermittelt den Pfad des Windows-Systemverzeichnisses, also etwas wie C:\Windows\system32. Der Rückgabewert zeigt die Länge des in der Variable lpBuffer zurückgegebenen Strings an.

#If VBA7 Then
    Private Declare PtrSafe Function GetSystemDirectoryA Lib "kernel32" _
       (ByVal lpBuffer As String, ByVal nSize As Long) As Long
#Else
    Private Declare Function GetSystemDirectoryA Lib "kernel32" _
       (ByVal lpBuffer As String, ByVal nSize As Long) As Long
#End If


Public Function
apiGetSystemDirectory() As String Dim lngLen As Long, lpBuffer As String, nSize As Long nSize = 255 lpBuffer = String(nSize, vbNullChar) lngLen = GetSystemDirectoryA(lpBuffer, nSize) apiGetSystemDirectory = Left(lpBuffer, lngLen) End Function

GetSystemMetrics

Liefert zahlreiche verschiedene Informationen über die Größe des Bildschirms, verschiedener Fensterelemente, Mindest- oder Maximalgrößen von Fenstern, aber auch einige Infos zur Maus oder dazu, wie Windows gestartet wurde.

#If VBA7 Then
    Public Declare PtrSafe Function GetSystemMetrics Lib "user32" _
        (ByVal nIndex As eIndex) As Integer
#Else
    Public Declare Function GetSystemMetrics Lib "user32" _
        (ByVal nIndex As eIndex) As Integer
#End If

'Rückgabewerte:
    'für "Breite", "Höhe": in Pixel
    'für "Boolean": False = 0, Wahr = irgendein Wert <> 0
Public Enum eIndex
    SM_CXSCREEN = 0         'Breite des Bildschirms
    SM_CYSCREEN = 1         'Höhe des Bildschirms
    SM_CXVSCROLL = 2        'Breite einer vertikalen Bildlaufleiste
    SM_CYHSCROLL = 3        'Höhe einer horizontalen Bildlaufleiste
    SM_CYCAPTION = 4        'Höhe einer Titelleiste
    SM_CXBORDER = 5         'Breite eines Fensterrahmens
    SM_CYBORDER = 6         'Höhe eines Fensterrahmens
    SM_CXFIXEDFRAME = 7     'Breite eines Fensterrahmens im Stil "Dialog"
    SM_CYDLGFRAME = 8       'veraltet (identisch mit SM_CXFIXEDFRAME)
    SM_CYVTHUMB = 9         'Höhe der Positionsanzeige einer vertikalen Bildlaufleiste
    SM_CXHTHUMB = 10        'Breite der Positionsanzeige einer horizontalen Bildlaufleiste
    SM_CXICON = 11          'Breite eines normalen Icons (siehe auch SM_CXSMICON)
    SM_CYICON = 12          'Höhe eines normalen Icons (siehe auch SM_CYSMICON)
    SM_CXCURSOR = 13        'Breite des Cursors
    SM_CYCURSOR = 14        'Höhe des Cursors
    SM_CYMENU = 15          'Höhe einer einzeiligen Menüleiste
    SM_CXFULLSCREEN = 16    'Breite des Arbeitsbereiches eines maximierten Fensters
    SM_CYFULLSCREEN = 17    'Höhe des Arbeitsbereiches eines maximierten Fensters
    SM_CYKANJIWINDOW = 18   'Für japanische (Kanji) Schrift
    SM_MOUSEPRESENT = 19    'Boolean: Maus installiert
    SM_CYVSCROLL = 20       'Höhe der Pfeil-Bitmap einer horizontalen Bildlaufleiste
    SM_CXHSCROLL = 21       'Breite der Pfeil-Bitmap einer horizontalen Bildlaufleiste
    SM_DEBUG = 22           'Boolean: Debugging-Version von User.exe installiert
    SM_SWAPBUTTON = 23      'Boolean: Maustasten vertauscht
    SM_CXMIN = 28           'Mindestbreite eines Fensters
    SM_CYMIN = 29           'Mindesthöhe eines Fensters
    SM_CXSIZE = 30          'Breite der Schaltflächen in der Titelleiste
    SM_CYSIZE = 31          'Höhe der Schaltflächen in der Titelleiste
    SM_CXSIZEFRAME = 32     'Breite eines anpassbaren Fensters
    SM_CYSIZEFRAME = 33     'Höhe eines anpassbaren Fensters
    SM_CXMINTRACK = 34      'Mindestbreite eines greifbaren Fensters
    SM_CYMINTRACK = 35      'Mindesthöhe eines greifbaren Fensters
    SM_CXDOUBLECLK = 36     'Breite des Rechtecks, in der ein Doppelklick erkannt wird
    SM_CYDOUBLECLK = 37     'Höhe des Rechtecks, in der ein Doppelklick erkannt wird
    SM_CXICONSPACING = 38   'Breite einer Zelle, um Icons auszurichten
    SM_CYICONSPACING = 39   'Höhe einer Zelle, um Icons auszurichten
    SM_MENUDROPALIGNMENT = 40 'Boolean: PopUps in der Menüleiste rechts ausgerichtet
    SM_PENWINDOWS = 41      'Boolean: MS Windows Pen-Programmier-Erweiterungen installiert
    SM_DBCSENABLED = 42     'Boolean: Doppel-Byte Version von "User.exe" installiert
    SM_CMOUSEBUTTONS = 43   'Anzahl Maustasten. 0=Keine Maus installiert
    SM_SECURE = 44          'Veraltet (nur Win95/98)
    SM_CXEDGE = 45          'Breite der Fensterecken
    SM_CYEDGE = 46          'Höhe der Fensterecken
    SM_CXMINSPACING = 47    'Breite einer Gitterzelle für minimierte Fenster
    SM_CYMINSPACING = 48    'Höhe einer Gitterzelle für minimierte Fenster
    SM_CXSMICON = 49        'Breite eines kleinen Icons
    SM_CYSMICON = 50        'Höhe eines kleinen Icons
    SM_CYSMCAPTION = 51     'Höhe einer kleinen Titelleiste
    SM_CXSMSIZE = 52        'Breite kleiner Schaltflächen in der Titelleiste
    SM_CYSMSIZE = 53        'Höhe kleiner Schaltflächen in der Titelleiste
    SM_CXMENUSIZE = 54      'Breite der Schaltflächen in der Menüleiste
    SM_CYMENUSIZE = 55      'Höhe der Schaltflächen in der Menüleiste
    SM_ARRANGE = 56         'Gibt zurück, wie minimierte Fenster angeordnet werden
    SM_CXMINIMIZED = 57     'Breite eines minimierten Fensters
    SM_CYMINIMIZED = 58     'Höhe eines minimierten Fensters
    SM_CXMAXTRACK = 59      'Maximale Breite, auf die User ein Fenster vergrößern darf
    SM_CYMAXTRACK = 60      'Maximale Höhe, auf die User ein Fenster vergrößern darf
    SM_CXMAXIMIZED = 61     'Standardbreite eines maximierten Fensters
    SM_CyMAXIMIZED = 62     'Standardhöhe eines maximierten Fensters
    SM_NETWORK = 63         'ungerade Zahl=Netzwerk vorhanden, 0=kein Netzwerk vorhanden
    SM_CLEANBOOT = 67       'Windows-Start: 0=Normal, 1=abgesichert, 2=abgesichert mit Netzwerk
    SM_CXDRAG = 68          'Breite, um die die Maus bewegt werden kann, ohne Ziehen auszulösen
    SM_CYDRAG = 69          'Höhe, um die die Maus bewegt werden kann, ohne Ziehen auszulösen
    SM_SHOWSOUNDS = 70      'Boolean: Windows Soundstichwörter werden angezeigt
    SM_CXMENUCHECK = 71     'Breite der Markierungs-Bitmap
    SM_CYMENUCHECK = 72     'Höhe der Markierungs-Bitmap
    SM_SLOWMACHINE = 73     'Boolean: Low-End Computer (veraltet)
    SM_MIDEASTENABLED = 74  'Boolean: Hebräisch und Arabisch im System aktiviert
    SM_MOUSEWHEELPRESENT = 75 'Boolean: Maus mit Mausrad ist installiert
    SM_XVIRTUALSCREEN = 76  'linke Kante des virtuellen Bildschirms
    SM_YVIRTUALSCREEN = 77  'obere Kante des virtuellen Bildschirms
    SM_CXVIRTUALSCREEN = 78 'Breite des virtuellen Bildschirms
    SM_CYVIRTUALSCREEN = 79 'Höhe des virtuellen Bildschirms
    SM_CMONITORS = 80       'Anzahl sichtbarer Monitore
    SM_SAMEDISPLAYFORMAT = 81 'Boolean: Gleiches Farbformat bei allen angeschlossenen Monitoren
End Enum

Public Sub
demoMetrics() Debug.Print "Bildschirmauflösung:", Debug.Print GetSystemMetrics(SM_CXSCREEN) & "x" & GetSystemMetrics(SM_CYSCREEN) Debug.Print "Fenstergröße im Vollbild:", Debug.Print GetSystemMetrics(SM_CXFULLSCREEN) & "x" & GetSystemMetrics(SM_CYFULLSCREEN) Debug.Print "Sichtbare Monitore:", GetSystemMetrics(SM_CMONITORS) If GetSystemMetrics(SM_MOUSEPRESENT) Then Debug.Print "Mindestens eine Maus "; If GetSystemMetrics(SM_MOUSEWHEELPRESENT) Then Debug.Print "(mit Rad) "; Debug.Print "ist vorhanden (" & GetSystemMetrics(SM_CMOUSEBUTTONS) & " Tasten). Die Tasten sind "; If Not GetSystemMetrics(SM_SWAPBUTTON) Then Debug.Print "nicht "; Debug.Print "vertauscht." End If Select Case GetSystemMetrics(SM_CLEANBOOT) Case 0: Debug.Print "Windows wurde normal gestartet." Case 1: Debug.Print "Windows wurde abgesichert gestartet." Case 2: Debug.Print "Windows wurde abgesichert im Netzwerk gestartet." End Select End Sub

Die Demofunktion zeigt nur einige der so ermittelbaren Informationen an. Für VBA dürften viele der sonstigen Informationen auch kaum je relevant sein.

demoMetrics
Bildschirmauflösung:        1920x1200
Fenstergröße im Vollbild:   1920x1125
Sichtbare Monitore:          1
Mindestens eine Maus (mit Rad) ist vorhanden (5 Tasten). Die Tasten sind nicht vertauscht.
Windows wurde normal gestartet.