·  Start ·  Programme ·  Codes ·  Tipps ·  ActiveX ·  Tutorials · 




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, 2000 und XP müssen (zumindest was die Registry betrifft) andere Schlüssel verwenden.

-- Arbeitsspeicher (RAM): Auslesen des totalen und verfügbaren Speichers
-- Virtueller Speicher: Auslesen und Setzen der Einstellungen
-- VCache: Erklärungen, Lesen und Setzen der Werte
-- CPU-Status: Auslesen der Werte und Anzeigen
-- USER, GDI, SYSTEM: Auslesen der verfügbaren Werte
-- Undokumentierte Windowseinstellungen über die Registry setzen.
-- Einschränkungen im System vornehmen
-- Anhang: Wiederverwendbares Modul und Beispiel mit den wichtigsten API-Deklarationen

Übersicht:

Allgemeines
Arbeitsspeicher
Virtueller Speicher
V-Cache
System.ini
Auslesen und Setzen der Werte "VCache"
CPU (Prozessor)
Systemresourcen
Undokumentiertes Windows
Allgemeine Systemeinstellungen
Versteckte Funktionen
RunDLL32
Reparieren
Systemeinschränkungen
Änderungen sofort wirksam werden lassen
Zusammenfassung und Beispiel

 
 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.
Überall werden 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.

Ereignis Form_Load():
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"
Was bedeuten nun diese 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 - aber gerade das ist für den Anwender interessant.

Also fügen wir noch einen Timer hinzu. In das Ereignis Timer_Timer() kommt:
Dim yourmemory As MemoryStatus
yourmemory.dwLength = Len(yourmemory)
GlobalMemoryStatus yourmemory

Label2.Caption = "" & (yourmemory.dwAvailPhys / 1024) & " KB"
ProgressBar1.value = (yourmemory.dwAvailPhys / 1024)
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 vorigen Punkt 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...
 

 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
MaxFileCache=16384   ' für Maximum
ChunkSize=1024       ' Blockgröße, empfohlen 512 oder 1024
 

 System.ini

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

 Setzen und Auslesen der Werte für den V-Cache

Ein Auszug aus dem Beispiel zum 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")

Auslesen der Werte und Anzeige in einem Textfeld:
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
Falls die Variablen W und W1 einen Leerstring zurückgeben, wird der Virtuelle Speicher vom System selbst verwaltet.


 Die CPU (Central Processing Unit - einfach der Prozessor)

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.


Allgemeine Deklarationen:
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
Eine hilfreiche SubRoutine:
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
Ereignis Form_Load():
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)
Ereignis Timer1_Timer():
m_intPercent = GetCPUStatus
Label1.Caption = CStr(m_intPercent) & " %"
 

 System-Resourcen

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
Hinweis: Die Datei "rsrc32.dll" muß auf dem Zielcomputer vorhanden sein !

Das Auslesen der Werte erfolgt sehr einfach:
lblGDI.Caption = (pBGetFreeSystemResources(GDI)) & " %"

lblUSER.Caption = (pBGetFreeSystemResources(USR)) & " %"

lblSYSTEM.Caption = (pBGetFreeSystemResources(SR)) & " %"
 

 Undokumentiertes Windows

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 , 2000 oder XP 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.

Handhabung der Funktionen (diese finden Sie im Beispielprojekt)

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


 Allgemeine Systemeinstellungen

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

Beispiel Computername auslesen:
Dim ComNam as Variant
If GetValue(HKEY_LOCAL_MACHINE, "System\CurrentControlSet\Control_
  \ComputerName\ComputerName", "ComputerName", ComNam) Then
  Label1.caption = "Computername: " + CStr(ComNam)
End If
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"

 

 Weitere versteckte Funktionen

Hier erst einmal ein Beispiel zum Schreiben der Werte in die Registry (also mit SetValue).

Hier 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
Ein weiteres Beispiel zur Aktivierung der Schnellansicht, die standardmäßig nicht für jede Datei zur Verfügung steht.
Dim strQuickView As String
strQuickView = "*"
  If Check2.value = 1 Then
    CreateKey HKEY_CLASSES_ROOT, "*\Quickview", ""
    SetValue HKEY_CLASSES_ROOT, "*\Quickview", "", strQuickView
  Else
    DeleteKey HKEY_CLASSES_ROOT, "*\Quickview"
  End If
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
Wollen Sie das Startmenü ändern ? Beispielsweise brauchen Sie den Ordner Favoriten nicht. Sie werden es 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"
SetValue(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
Zeit zum Aufklappen der Menüs in der Startleiste:
Dim s$
s = Text1.Text (der Wert kann von 10 bis 400 reichen)
SetValue HKEY_CURRENT_USER, "Control Panel\Desktop", "MenuShowDelay", s)
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.exe

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


 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}", ""
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
 

 Systemeinschrä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.


 Änderungen sofort wirksam werden lassen

Wenn Sie mit Visual Basic auf die Registry zugreifen und geänderte Werte zurückschreiben, werden die meisten vom System nicht sofort erkannt. Es ist ein Neustart des Betriebssystems erforderlich. Allerdings kann man das elegant umgehen. Ein Lob Ihrer Freunde oder des Chefs ist Ihnen sicher !
Private Declare Function SendMessageTimeout Lib "user32" _
Alias "SendMessageTimeoutA" (ByVal hwnd As Long, _
ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long, _
ByVal fuFlags As Long, ByVal uTimeout As Long, _
lpdwResult As Long)As Long
Private Declare Sub Sleep Lib "kernel32" _
(ByVal dwMilliseconds As Long)

Private Const WM_SETTINGCHANGE = &H1A
Private Const SMTO_ABORTIFHUNG = &H2
Private Const HWND_BROADCAST = &HFFFF&

' Hier der Code für die Änderung (zB OK_Click)
Me.MousePointer = vbHourglass
Dim nResult As Long
SendMessageTimeout HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0, _
SMTO_ABORTIFHUNG, 3, nResult
'Zeit zum Ändern...
  Sleep 500
Me.MousePointer = vbNormal
Anmerkung: Nicht alle Einstellungen können sofort aktualisiert werden, bei manchen ist trotzdem ein Systemneustart notwendig.

Andere Systemeinstellungen

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
 

 Zusammenfassung und Beispiel

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.

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.

Download  Beispielprojekt und Tutorial als Word-Dokument ( 23,2 KB )
Aktualisiert: 12.02.2008, 20:49 Uhr Copyright © 2001 - 2010 by ST-software Navigation zurück  |  Navigation vorwärts  |  Zum Seitenanfang     
Ihre IP: 38.107.191.80 ·  Seite erstellt in: 0.568 Sekunden ·  Dateigröße:  37563 Bytes