Die Community zu .NET und Classic VB.
Menü

System + Registry

 von 

Übersicht 

In diesem Tutorial werden die Zugriffe auf Systemeinstellungen verschiedenster Art behandelt. Alle Werte, Einstellungen und Pfade betreffen in erster Linie Windows 9x. User von Windows NT und 2000 müssen, was die Registry betrifft , andere Schlüssel verwenden.

Was erwartet Sie in diesem Tutorial ?

  • Arbeitsspeicher (RAM)
  • Virtueller Speicher
  • VCache
  • CPU-Status
  • USER, GDI, SYSTEM
  • Undokumentierte Windowseinstellungen
  • Einschränkungen im System vornehmen

Mit freundlichen Grüßen
Elmar Steinböck

Allgemeines  

Dieses Tutorial ist nicht uneingeschränkt für Anfänger geeignet, eher für fortgeschrittene Programmierer. Falls Sie sich als Anfänger sehen, beherzigen Sie ein paar Ratschläge:

Um Systemeinstellungen auszulesen, müssen Sie kein Profi sein. Was das Setzen von Werten in der Registry anbelangt, sollten Sie sehr wohl wissen, welche Schlüssel und Werte Sie ändern wollen. Im Allgemeinen empfiehlt es sich, eine Sicherungskopie der Registry anzulegen. Unter Windows 9x wären das die Dateien „System.dat“ und „User.dat“. Sie liegen normalerweise im Verzeichnis C:\Windows.

Diese beiden Dateien spiegeln im Prinzip die Registry wider.

Es werden vor allem API-Funktionen eingesetzt. Sie finden diese Funktionen, Konstanten und Typen im API-Katalog (VB-ADD-In).

Arbeitsspeicher  

Mit Hilfe einiger API-Funktionen können Sie die Werte des totalen und des noch verfügbaren Arbeitsspeichers auslesen und anzeigen. Die Anzeige kann über Msgbox, Labels, Progressbars, Pictureboxen etc. erfolgen.

Zuständig für den Arbeitsspeicher ist die API-Deklaration:

Declare Sub GlobalMemoryStatus Lib "kernel32" (lpBuffer As
MemoryStatus)

Und die Typisierung...

Public Type MemoryStatus
      dwLength As Long
      dwMemoryLoad As Long
      dwTotalPhys As Long
      dwAvailPhys As Long
      dwTotalPageFile As Long
      dwAvailPageFile As Long
      dwTotalVirtual As Long
      dwAvailVirtual As Long
End Type

Für ein kleines Beispiel erstellen Sie ein neues Projekt. Fügen Sie die Deklaration und Typus in ein Modul ein. Fügen Sie eine Form hinzu. Auf dieser platzieren Sie vier Progressbar und neben diesen jeweils ein Label.

Dim yourmemory As MemoryStatus
yourmemory.dwLength = Len(yourmemory)
GlobalMemoryStatus yourmemory

ProgressBar1.Min = "0"
ProgressBar1.Max = (yourmemory.dwTotalPhys / 1024)
ProgressBar2.Min = "0"
ProgressBar2.Max = (yourmemory.dwTotalPhys / 1024)
ProgressBar2.value = (yourmemory.dwTotalPhys / 1024)

Label1.Caption = "" & (yourmemory.dwTotalPhys / 1024) & " KB"
Label2.Caption = "" & (yourmemory.dwAvailPhys / 1024) & " KB"

ProgressBar3.Min = "0"
ProgressBar3.Max = (yourmemory.dwTotalPageFile / 1024)
ProgressBar3.value = (yourmemory.dwTotalPageFile / 1024)
ProgressBar4.Min = "0"
ProgressBar4.Max = (yourmemory.dwTotalPageFile / 1024)
ProgressBar4.value = (yourmemory.dwAvailPageFile / 1024)

Label3.Caption = "" & (yourmemory.dwTotalPageFile / 1024) & " KB"
Label4.Caption = "" & (yourmemory.dwAvailPageFile / 1024) & " KB"

Listing 1: Ereignis Form_Load()

Was bedeuten nun diese wirren Codezeilen ?

Der Typ Memorystatus umfasst mehrere Werte, die ausgelesen werden können.
TotalPhys gibt den ganzen verfügbaren Arbeitsspeicher zurück (zB 64 MB)
AvailPhys gibt den Wert des noch verfügbaren Arbeitsspeichers aus (zB 12 MB)
TotalPageFile betrifft den eingestellten Virtuellen Speicher.
AvailPageFile gibt den noch verfügbaren Virtuellen Speicher an.

Die Werte werden vom System in Bytes angegeben, weshalb sich eine eigene interne Umrechnung empfiehlt (zum Beispiel / 1024 um KB zu erhalten).

Mit Form_Load haben wir jedoch erst die Werte erhalten; diese werden jedoch nicht laufend aktualisiert – und gerade das ist für den Anwender interessant.

Also fügen wir noch einen Timer hinzu.

Dim yourmemory As MemoryStatus
yourmemory.dwLength = Len(yourmemory)
GlobalMemoryStatus yourmemory

Label2.Caption = "" & (yourmemory.dwAvailPhys / 1024) & " KB"
ProgressBar1.value = (yourmemory.dwAvailPhys / 1024)

Listing 2: Ereignis Timer_Timer()

Den Intervall von Timer setzen Sie am besten auf Werte zwischen 100 und 1000.

Tipp

Sie können den Wert des Virtuellen Speichers kontrollieren. Sie finden die Einstellungen unter Eigenschaften des Arbeitsplatzes\Leistungsmerkmale\Virtueller Arbeitsspeicher. Dort wird entweder von Windows verwaltet oder es gelten benutzerdefinierte Einstellungen für Minimum und Maximum.

Experimentieren Sie mit den Werten. Empfehlenswert sind folgende Einstellungen:

Installierter Arbeitsspeicher x 2.5 bis 4

Beispiel

128 MB RAM = 512 MB Min und 512 MB Max. Optimale Werte können nicht angegeben werden, da die Systeme unterschiedlich aufgebaut sind und genutzt werden. Falls Sie eine weitere Festplatte haben, lagern Sie den Virtuellen Speicher auf die zweite Platte aus (Es ist die Datei Win386.swp im Stammverzeichnis). Das optimiert Plattenzugriffe und Speicherverwaltung.

Virtueller Speicher  

Das Auslesen des Virtuellen Speichers wurde schon im Punkt 3 behandelt. Aber Sie können die Einstellungen auch aus Ihrem Programm heraus setzen.

Gespeichert wird in der Datei "System.ini", zu finden im Windows-verzeichnis.

In der System.ini finden Sie die Zeile [386Enh]. Zuständig für den Virtuellen Speicher ist "MinPagingFileSize" und "MaxPagingFileSize".

ConservativeSwapFileUsage=1 sollten Sie verwenden. Die Meinung über die Notwendigkeit gehen auseinander. Angeblich ist diese Zeile für Win98 notwendig.

PagingDrive=C: gibt das Laufwerk an, auf welchem die Datei Win386.swp liegt.

Wie Sie diese Werte lesen und zurückschreiben, erfahren Sie gleich.

Die Manipulation des VCache und des Virtuellen Speichers spielt sich also in der Datei System.ini ab. Es gibt mehrere Möglichkeiten, auf eine Textdatei (und nichts anders ist es) zuzugreifen. Eine relativ einfache Möglichkeit sind die API-Funktion
WritePrivateProfileString und GetPrivateProfileString.

Declare Function WritePrivateProfileString Lib "kernel32" _
Alias "WritePrivateProfileStringA" _
(ByVal lpApplicationName As String, _
ByVal lpKeyName As Any, ByVal lpString As Any, _
ByVal lpFileName As String) As Long

Declare Function GetPrivateProfileString Lib "kernel32" _
Alias "GetPrivateProfileStringA" _
(ByVal lpApplicationName As String, _
ByVal lpKeyName As Any, ByVal lpDefault As String, _
ByVal lpReturnedString As String, ByVal nSize As Long, _
ByVal lpFileName As String) As Long

Listing 3: Deklarationen

Obwohl diese Funktionen eigentlich für private INI-Dateien gedacht waren, funktionieren sie auch für diesen Einsatz.

Schreiben in die System.ini

Dim rr&, bb&, ee&, ff&

rr=WritePrivateProfileString("386Enh", "MinPagingFileSize", _
   "512000", "System.ini")
bb=WritePrivateProfileString("386Enh", "MaxPagingFileSize", _
   "512000", "System.ini")
ee=WritePrivateProfileString("386Enh", "PagingDrive", "C:", _
   "System.ini")
ff=WritePrivateProfileString("386Enh", "Paging", "on", _
   "System.ini")

Listing 4

Lesen aus der System.ini

Dim O&, W$
Dim F&, W1$
Dim Pag&, W3$

W = Space$(200)
W1 = Space$(200)
W3 = Space$(200)

O = GetPrivateProfileString("386Enh", "MinPagingFileSize", "", _
    W, 200, "System.ini")
F = GetPrivateProfileString("386Enh", "MaxPagingFileSize", "", _
    W1, 200, "System.ini")
Pag = GetPrivateProfileString("386Enh", "Paging", "", W3, 200, _
      "System.ini")

W = Left$(W, O)
W1 = Left$(W1, F)
W3 = Left$(W3, Pag)

Label1.Caption = W
Label2.Caption = W1

Listing 5

Falls die Variablen W und W1 einen Leerstring zurückgeben, wird der Virtuelle Speicher vom System selbst verwaltet.

V-Cache  

Was bedeutet VCache ? VCache bedeutet frei übersetzt "Geheimes Lager" oder "Versteck" oder "Zwischenlager". Böse Zungen behaupten, der VCache habe nur in Windows 95 funktioniert. Dies kann ich nicht bestätigen.

Daten, die im VCache liegen, werden schneller wieder angefordert; je größer also der "reservierte" Speicher ist, desto schneller werden Daten wieder ausgelesen. Allerdings verringert sich der restliche Arbeitsspeicher. Hier gilt ebenso, wie für den Virtuellen Speicher: Experimentieren...

Die Einstellungen für den VCache sind ebenfalls in der System.ini zu finden:

[vcache]
MinFileCache=16384 gibt das Minimum an (Beispielwert)
MaxFileCache=16384 für Maximum (Beispielwert)
ChunkSize=1024 Blockgröße, empfohlen 512 oder 1024

Schreiben in die System.ini

Dim n&, a&, c&, d&

n = WritePrivateProfileString("VCache", "MinFileCache", _
    Text1.Text, "System.ini")
a = WritePrivateProfileString("VCache", "MaxFileCache", -
    Text2.Text, "System.ini")
c = WritePrivateProfileString("VCache", "ChunkSize", _
    Text3.Text, "System.ini")
d = WritePrivateProfileString("386Enh", _
    "ConservativeSwapFileUsage", "1", "System.ini")

Listing 6

Lesen der Werte aus der System.ini

Dim l&, s$
Dim a&, s1$
Dim b&, s2$

s = Space$(200)
s1 = Space$(200)
s2 = Space$(200)

l = GetPrivateProfileString("VCache", "Minfilecache", "", s, _
    200, "System.ini")
a = GetPrivateProfileString("VCache", "Maxfilecache", "", s1,_
    200, "System.ini")
b = GetPrivateProfileString("VCache", "ChunkSize", "", s2, _
    200, "System.ini")

s1 = Left$(s1, a)
s = Left$(s, l)
s2 = Left$(s2, b)

Text1.Text = s
Text2.Text = s1
Text3.Text = s2

Listing 7

CPU  

Den momentanen Status der CPU kann man vermutlich auch mit anderen Methoden auslesen. Wir wollen es uns hier einfach machen und nehmen die Werte der Registry.

Hierfür zuständig ist der Schlüssel:

HKEY_DYN_DATA\PerfStats\StatsData "Kernel/CPUUsage"

Vom System wird permanent in die Registry geschrieben und dieser Wert aktualisiert. Also liegt es nahe, diesen Wert wieder auszulesen und ein paar Hundertstel Sekunden später die Auslastung anzuzeigen.

Zur Überprüfung starten Sie den Systemmonitor und vergleichen Sie die Werte (Sie stimmen sicher überein!).

Folgendes Beispiel können Sie sofort ausprobieren. Sie brauchen dazu eine Form, ein Timer-Control und ein Label (oder Textbox). Ausbaufähig natürlich auf grafische Darstellung, Progressbar oder ähnlichem.

Const REG_DWORD = 4
Const HKEY_DYN_DATA = &H80000006

Private Declare Function RegQueryValueEx Lib "advapi32.dll" _
  Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName _
  As String,  ByVal lpReserved As Long, lpType As Long, lpData _
  As Any, lpcbData As Long) As Long

Private Declare Function RegOpenKey Lib "advapi32.dll" Alias _
  "RegOpenKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, _
  phkResult As Long) As Long

Private Declare Function RegCloseKey Lib "advapi32.dll" _
  (ByVal hKey As Long)_
  As Long

Private m_intPercent As Single

Listing 8: Allgemeine Deklarationen

Private Function GetCPUStatus() As Integer
Dim lngData As Long, lnghKey As Long, lngRet As Long

lngRet = RegOpenKey(HKEY_DYN_DATA, "PerfStats\StatData", _
         lnghKey)

If lngRet <> 0 Then
        MsgBox "Fehler beim Lesen aus der Registrierdatenbank."
        Unload Me
End If

lngRet = RegQueryValueEx(lnghKey, "KERNEL\CPUUsage", 0, _
         REG_DWORD,  lngData, 4)

GetCPUStatus = Trim(Str(Int(lngData)))

lngRet = RegCloseKey(lnghKey)
End Function

Listing 9: hilfreiche SubRoutine

Dim lngData As Long, lnghKey As Long, lngRet As Long

lngRet = RegOpenKey(HKEY_DYN_DATA, "PerfStats\StartStat", _
         lnghKey)

If lngRet <> 0 Then
        MsgBox "Fehler beim Lesen aus der Registrierdatenbank."
        Unload Me
End If

lngRet = RegQueryValueEx(lnghKey, "KERNEL\CPUUsage", 0, _
         REG_DWORD, _
         lngData, 4)
lngRet = RegCloseKey(lnghKey)

Listing 10: Ereignis Form_Load()

m_intPercent = GetCPUStatus
Label1.Caption = CStr(m_intPercent) & " %"

Listing 11: Ereignis Timer_Timer()

Systemressourcen  

Sie kennen vielleicht die Windows-eigene Anzeige der Systemresourcen ? Dieses Tool wird nicht standardmäßig installiert und befindet sich üblicherweise im Verzeichnis C:\Windows. Es heißt RSRCMTR.EXE.

Diese Resourcen werden aufgeteilt in USER, GDI und SYSTEM. Und diese Werte können Sie auch auslesen. Unter Windows 16bit war es noch kein Geheimnis. Ich habe aber lange nach dieser Funktion für Windows 32bit gesucht (und gefunden).

Binden Sie die API-Deklaration in ein Modul oder (als Private) in eine Form:

Const SR = 0
Const GDI = 1
Const USR = 2

Private Declare Function pBGetFreeSystemResources Lib _
  "rsrc32.dll" Alias "_MyGetFreeSystemResources32@4" _
(ByVal iResType As Integer) As Integer

Private Sub UpdateFSR()
'Diese Sub benötigt 3 Labels
lblGDI.Caption = (pBGetFreeSystemResources(GDI)) & " %"
lblUSER.Caption = (pBGetFreeSystemResources(USR)) & " %"
lblSYSTEM.Caption = (pBGetFreeSystemResources(SR)) & " %"
End Sub

Listing 12: Daten der Systemressourcen auslesen

Hinweis

Die Datei "rsrc32.dll" muß auf dem Zielcomputer vorhanden sein !

Windows - Einstellungen manipulieren  

Windows (hier wird eigentlich nur Windows 95 und 98, ME behandelt) schreibt so ziemlich alles in die Registry, sozusagen das Hirn des Betriebssystems. Wenn Sie Windows NT oder 2000 benutzen, müssen Sie die Registry-Schlüssel abändern.

Im Anhang finden Sie ein recht brauchbares Modul, in dem alle Routinen und Funktionen zusammengefasst sind. Natürlich können Sie auch mit den API-Funktionen direkt arbeiten, aber diese Funktionen und Subs sind etwas leichter zu handhaben.

            
ExistKey
 prüft, ob ein Schlüssel vorhanden ist
            
GetValue
 gibt einen Wert zurück
            
SetValue
 schreibt einen Wert in die Registry
            
CreateKey
 erstellt einen Schlüssel in der Registry
            
DeleteKey
 löscht einen Schlüssel
            
DeleteValue
 löscht einen Eintrag / Wert

Hier wird nicht für jeden Wert ein Beispiel gezeigt; es sollen nur Hinweise auf die Möglichkeiten gegeben werden.

Dim ComNam As Variant

If GetValue(HKEY_LOCAL_MACHINE, _
   "System\CurrentControlSet\Control\ComputerName\ComputerName",_
   "ComputerName", ComNam) Then
          Label1.caption =  "Computername: " + CStr(ComNam)
End If

Listing 13: Beispiel Computername auslesen

Sie können für jeden der nachstehend angeführten Schlüssel genau nach dem gleichen Schema verfahren.

Weitere Schlüssel für verschiedene Systemeinstellungen:

Prozessor:
HKEY_LOCAL_MACHINE, _
"Hardware\Description\System\CentralProcessor\0", _
"Identifier"

HKEY_LOCAL_MACHINE, _
"Hardware\Description\System\CentralProcessor\0", _
"MMXIdentifier"

Betriebssystem:
HKEY_LOCAL_MACHINE, _
"Software\Microsoft\Windows\CurrentVersion", _
"ProductName"

Versionsnummer:
HKEY_LOCAL_MACHINE, _
"Software\Microsoft\Windows\CurrentVersion", _
"VersionNumber"

Product-ID:
HKEY_LOCAL_MACHINE, _
"Software\Microsoft\Windows\CurrentVersion", _
"ProductID"

Product-Key:
HKEY_LOCAL_MACHINE, _
"Software\Microsoft\Windows\CurrentVersion", _
"ProductKey"

Registriert auf:
HKEY_LOCAL_MACHINE, _
"Software\Microsoft\Windows\CurrentVersion", _
"RegisteredOwner"

Konfiguration:
HKEY_LOCAL_MACHINE, _
"System\CurrentControlSet\Control\IDConfigDB", _
"FriendlyName0001"

Installierter Monitor:
HKEY_LOCAL_MACHINE, _
"System\CurrentControlSet\Services\Class\Monitor\0000", _
"DriverDesc"

Maximale Auflösung des Monitors:
HKEY_LOCAL_MACHINE, _
"System\CurrentControlSet\Services\Class\Monitor\0000", _ 
"MaxResolution"

Desktop-Schema:
HKEY_CURRENT_USER, "Control Panel\Appearance", "Current"

Hintergrundbild:
HKEY_CURRENT_USER, "Control Panel\Desktop", "Wallpaper"

Geheime Windowsfunktionen  

Hier finden Sie einige teilweise undokumentierte Funktionen für Windows, die Sie mittels Registryzugriff schreiben und auch auslesen können.

Im folgenden Beispiel geht es darum, beim Anlegen von Dateien und Ordnern, Großbuchstaben zu ermöglichen. Diese Funktion finden Sie auch unter Ordneroptionen\Ansicht.

Es wird eine Checkbox verwendet, deren Status abgefragt wird. Um die Werte richtig auszulesen, brauchen Sie das Ganze nur umzudrehen (getvalue(PFAD, Wert)).

Dim großB&
Dim kleinB&

großB = "1"
kleinB = "0"

If Check1.value = 1 Then
  SetValue HKEY_CURRENT_USER, _
  Software\Microsoft\Windows\CurrentVersion\Explorer\ _
  Advanced", "DontPrettyPath, großB
Else
  SetValue HKEY_CURRENT_USER, _
  Software\Microsoft\Windows\CurrentVersion\Explorer\ _
  Advanced", "DontPrettyPath, kleinB
End If

Listing 14: Großbuchstaben ermöglichen

Ein weiteres Beispiel zur Aktivierung der Schnellansicht, die standardmäßig nicht für jede Datei zur Verfügung steht.

Dim quk$
quk = "*"

If Check2.value = 1 Then
  CreateKey HKEY_CLASSES_ROOT, "*\Quickview", ""
  SetValue HKEY_CLASSES_ROOT, "*\Quickview", "", quk
Else
  DeleteKey HKEY_CLASSES_ROOT, "*\Quickview"
End If

Listing 15: Schnellansicht aktivieren (Quickview)

Und noch ein Beispiel. Hier wird bei *.bmp-Dateien das Bild als Icon (sozusagen als Vorschau) im Explorer angezeigt. Kann auf manchen System nicht ordnungsgemäß funktionieren!

Dim BmPP$
Dim StandRd$

BmPP = "%1"
StandRd = ""

If Option1.value = True Then
  SetValue HKEY_CLASSES_ROOT, "Paint.Picture\DefaultIcon", "", _
  StandRd
End If
If Option2.value = True Then
  SetValue HKEY_CLASSES_ROOT, "Paint.Picture\DefaultIcon", "", _
  BmPP
End If

Listing 16

Weitere undokumentierte Funktionen

Wollen Sie das Startmenü ändern ? Beispielsweise brauchen Sie den Ordner Favoriten nicht. Sie werden es mit normalen Mitteln nicht schaffen, den Eintrag aus der Startleiste zu bekommen. Abhilfe schafft eine Manipulation eines bestimmten Registry-Eintrags:

HKEY_CURRENT_USER, _
"Software\Microsoft\Windows\CurrentVersion\Policies\Explorer", _
"NoFavoritesMenu"
Gefordert wird hier ein Long-Wert (1 oder 0)

Und so geht's mit anderen Einträgen:

Menü "Dokumente"
HKEY_CURRENT_USER, _
"Software\Microsoft\Windows\CurrentVersion\Policies\Explorer",
 "NoRecentDocsMenu" (ebenfalls 1 oder 0)

Menü "Beenden"
HKEY_CURRENT_USER, _
"Software\Microsoft\Windows\CurrentVersion\Policies\Explorer", _
"NoClose"

Menü "Ausführen"
HKEY_CURRENT_USER, _
"Software\Microsoft\Windows\CurrentVersion\Policies\Explorer", _
"NoRun"

Menü "Suchen"
HKEY_CURRENT_USER, _
"Software\Microsoft\Windows\CurrentVersion\Policies\Explorer", _
"NoFind"

Menü "Windows Update"
HKEY_CURRENT_USER, _
"Software\Microsoft\Windows\CurrentVersion\Policies\Explorer", _
"NoWindowsUpdate"

Verknüpfungspfeile der ICONS auf dem Desktop anzeigen /ausblenden:

abcdeF = ""
If Check4.value = 1 Then
  SetValue HKEY_CLASSES_ROOT, "lnkfile", "IsShortcut", abcdeF
Else
  'Lösche den Schlüssel
  DeleteValue HKEY_CLASSES_ROOT, "lnkfile", "IsShortcut"
End If

Listing 17

Dim s$
s = Text1.Text (der Wert kann von 10 bis 400 reichen)
SetValue HKEY_CURRENT_USER, "Control Panel\Desktop", _
"MenuShowDelay", s)

Listing 18: Zeit zum Aufklappen der Menüs in der Startleiste

Hier können Sie einstellen, ob die Menüs nach links (Standard) oder rechts ausgerichtet sind !

HKEY_CURRENT_USER, "Control Panel\Desktop", _
"MenuDropAlignment" (1 oder 0)

RunDLL32  

Auch die RunDLL32.exe spielt eine Rolle im System / Registry .

Ein Beispiel wäre der Eintrag "Öffnen mit..." im Kontextmenü. Klicken Sie eine unbekannte Datei an, wird meist Öffnen mit angezeigt, oft ist es aber wünschenswert, auch bei bekannten Dateiextensionen diese Funktion nutzen zu können.

Nehmen Sie die Datei LOGOW.SYS . Es ist im Prinzip eine Systemdatei; in Wirklichkeit handelt es sich um eine Bitmap und zwar um das Bild, welches Windows beim Herunterfahren anzeigt. Wenn Sie diese Datei mit dem Notepad öffnen – und das dürfte der Standard sein, können Sie damit nichts anfangen...

Abhilfe schafft der folgende Code:

Dim mOeff$

mOeff = "rundll32.exe Shell32.dll,OpenAs_RunDLL %1"
If Check10.value = 1 Then
  CreateKey HKEY_CLASSES_ROOT, "Unknown\Shell\OpenAs\command",_
  ""
  SetValue HKEY_CLASSES_ROOT, "Unknown\Shell\OpenAs\command",_
  "", mOeff
Else
  DeleteKey HKEY_CLASSES_ROOT, "Unknown\Shell\OpenAs"
End If

Listing 19

Es wird also zuerst der Unterschlüssel "command" erstellt und als zweiter Schritt der Wert "rundll32" eingefügt. Wollen Sie den Eintrag "Öffnen mit" im Kontextmenü nicht mehr, löschen Sie den zuständigen Schlüssel mit DeleteKey.

Windows reparieren

Wenn Windows oder ein anderes Programm wieder mal alles durcheinander bringt, können Sie mit Ihrer Anwendung manches wieder reparieren.

Beispiel Papierkorb

Wenn dieser unabsichtlich gelöscht wurde, dürfte es schwierig sein, ihn wieder herzustellen. Mit folgendem Code gelingt es ganz einfach:

CreateKey HKEY_LOCAL_MACHINE, Software\Microsoft\Windows\ _
  CurrentVersion\explorer\ Desktop\NameSpace\ _
  {645FF040-5081-101B-9F08-00AA002F954E}", "

Listing 20

Beispiel Grafikfehler der Icons

Me.MousePointer = vbHourglass
Dim nResult As Long 
Dim nOldSize As Long

Dim lSize As String
lSize = "32"
Dim uSize As String
uSize = "31"

'Änderung der Icongröße auf 31 pixel
nOldSize = SetValue(HKEY_CURRENT_USER, Control _
  Panel\Desktop\WindowMetrics", "Shell Icon Size, uSize)
'System von der Änderung benachrichtigen
SendMessageTimeout HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0, _
  SMTO_ABORTIFHUNG, 3, nResult
'Zeit zum Ändern...
Sleep 1000
'Änderung wieder rückgängig machen
nOldSize = SetValue(HKEY_CURRENT_USER, Control _
  Panel\Desktop\WindowMetrics", "Shell Icon Size, lSize)
'System wieder benachrichtigen.
SendMessageTimeout HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0, _
  SMTO_ABORTIFHUNG, 3, nResult
Me.MousePointer = vbNormal

Listing 21

Sicherungen - Einschränkungen  

Mit Hilfe der Registry und den vorher angeführten Routinen lassen sich auch eine ganze Menge an Restriktionen im System vornehmen. Beispielsweise können die Diskettenlaufwerke ausgeblendet werden, es kann verhindert werden, daß neue Dateien angelegt werden können und vieles mehr.

Diskettenlaufwerke ausblenden:
HKEY_CURRENT_USER, _
"Software\Microsoft\Windows\CurrentVersion\Policies\Explorer", _
"NoDrives", 1 oder 0

Kein Menü "Neue Datei" im Explorer:
HKEY_CURRENT_USER, _
"Software\Microsoft\Windows\CurrentVersion\Policies\Explorer", _
"NoFileMenu", 1 oder 0

Verhindern, daß neue Drucker installiert werden können:
HKEY_CURRENT_USER, _
"Software\Microsoft\Windows\CurrentVersion\Policies\Explorer", _
"NoAddPrinter", 1 oder 0

DOS-Modus sperren:
HKEY_CURRENT_USER, _
"Software\Microsoft\Windows\CurrentVersion\Policies\WinOldApp", _
"NoRealMode", 1 oder 0

Sperren der Anzeigeeigenschaften:
HKEY_CURRENT_USER, _
"Software\Microsoft\Windows\CurrentVersion\Policies\System", _
"NoDispCpl", 1 oder 0

Nur "Darstellung" in den Anzeigeeigenschaften ausblenden:
HKEY_CURRENT_USER, _
"Software\Microsoft\Windows\CurrentVersion\Policies\System", _
"NoDispAppearancePage", 1 oder 0

"Hintergrund" in den Anzeigeeigenschaften sperren:
HKEY_CURRENT_USER, _
"Software\Microsoft\Windows\CurrentVersion\Policies\System", _
"NoDispBackgroundPage", 1 oder 0

"Bildschirmschoner" sperren:
HKEY_CURRENT_USER, _
"Software\Microsoft\Windows\CurrentVersion\Policies\System", _
"NoDispScrSavPage", 1 oder 0

Arbeitsplatz: Gerätemanager ausblenden
HKEY_CURRENT_USER, _
"Software\Microsoft\Windows\CurrentVersion\Policies\System", _
"NoDevMgrPage", 1 oder 0

Register Virtueller Arbeitsspeicher ausschalten
HKEY_CURRENT_USER, _
"Software\Microsoft\Windows\CurrentVersion\Policies\System", _
"NoVirtMemPage", 1 oder 0

Ändern von Kennwörtern unterbinden:
HKEY_CURRENT_USER, _
"Software\Microsoft\Windows\CurrentVersion\Policies\System", _
"NoPwdPage", 1 oder 0

Sie sehen, man kann sehr viel am System ändern, wenn man nur weiß, wo diese Einstellungen gespeichert sind.

Weitere Informationen

Folgende Werte werden nicht über die Registry ausgelesen sondern können mit anderen API-Aufrufen bestimmt werden (Sie finden diese im Modul zusammengefasst wieder).

'Bildschirmauflösung und eingestellte Farben:
Declare Function GetDeviceCaps Lib "gdi32" _
(ByVal hdc As Long, ByVal nIndex As Long) As Long

'Blink-Geschwindigkeit des Cursors:
Declare Function CreateCaret Lib "user32" _
(ByVal hwnd As Long, ByVal hBitmap As Long, _
ByVal nWidth As Long, ByVal nHeight As Long) As Long
Declare Function HideCaret Lib "user32" (ByVal hwnd As Long) As Long
Declare Function SetCaretBlinkTime Lib "user32" _
(ByVal wMSeconds As Long) As Long
Declare Function ShowCaret Lib "user32" (ByVal hwnd As Long) As Long

'Windows-Verzeichnis:
Declare Function GetWindowsDirectory Lib "kernel32" _
Alias "GetWindowsDirectoryA" _
(ByVal lpBuffer As String, ByVal nSize As Long) As Long

'System-Verzeichnis:
Declare Function GetSystemDirectory Lib "kernel32" _
Alias "GetSystemDirectoryA" _
(ByVal lpBuffer As String, ByVal nSize As Long) As Long

Listing 22: Deklarationen einige API-Funktionen

Zusammenfassung  

Es gibt eine Fülle von undokumentierten Windowsfunktionen; die meisten sind anhand der Registry auszulesen bzw. einzustellen. Die einzelnen Beispiele sollten Ihnen nur eine Hilfestellung geben. Es können nicht alle möglichen Einstellungen behandelt werden, aber es ist vielleicht ein Anreiz, noch mehr herauszufinden.

Hinweis

Ein hilfreiches Tool zur Überwachung der Registry stellt "Regmon" dar. Es ist eine Art Editor, wo alle Lese- und Schreibaktionen der Registry festgehalten werden. Damit können Sie erkennen, welches Programm einen bestimmten Schlüssel manipuliert. Zu finden unter:
http://www.sysinternals.com

Im Anhang finden Sie noch ein Modul, in welchem die wichtigsten API-Funktionen, Deklarationen, Typen und Konstanten zusammengefasst sind. Außerdem ein kleines Beispiel sowie dieses Tutorial als Word-Dokument.

Mit diesem Tutorial sollte es Ihnen gelingen, einen richtigen "Windows-Optimizer" zu schreiben.

Update (04.11.2002):

Die Datei "rsrc32.dll", zuständig für das Auslesen der GDI-, USER- und SYSTEM-Resouren wird nun zusammen mit dem Beispielprojekt ausgeliefert.

Beispielprojekt und Tutorial [24937 Bytes]

Ihre Meinung  

Falls Sie Fragen zu diesem Tutorial haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.