ABOUT Visual Basic Programmieren Programmierung Download Downloads Tips & Tricks Tipps & Tricks Know-How Praxis VB VBA Visual Basic for Applications VBS VBScript Scripting Windows ActiveX COM OLE API ComputerPC Microsoft Office Microsoft Office 97 Office 2000 Access Word Winword Excel Outlook Addins ASP Active Server Pages COMAddIns ActiveX-Controls OCX UserControl UserDocument Komponenten DLL EXE
Diese Seite wurde zuletzt aktualisiert am 16.06.2000

Diese Seite wurde zuletzt aktualisiert am 16.06.2000
Aktuell im ABOUT Visual Basic-MagazinGrundlagenwissen und TechnologienKnow How, Tipps und Tricks rund um Visual BasicActiveX-Komponenten, Controls, Klassen und mehr...AddIns für die Visual Basic-IDE und die VBA-IDEVBA-Programmierung in MS-Office und anderen AnwendungenScripting-Praxis für den Windows Scripting Host und das Scripting-ControlTools, Komponenten und Dienstleistungen des MarktesRessourcen für Programmierer (Bücher, Job-Börse)Dies&Das...

Themen und Stichwörter im ABOUT Visual Basic-Magazin
Code, Beispiele, Komponenten, Tools im Überblick, Shareware, Freeware
Ihre Service-Seite, Termine, Job-Börse
Melden Sie sich an, um in den vollen Genuss des ABOUT Visual Basic-Magazins zu kommen!
Informationen zum ABOUT Visual Basic-Magazin, Kontakt und Impressum

Zurück...

Shell-Icons frisch aufgetischt

Zurück...


Anzeige

(-hg) mailto:hg_shellicons@aboutvb.de

Geraten auf Ihrem Windows-Desktop, auf Ihren Taskbar-Symbolleisten oder im Explorer die Icons hin und wieder durcheinander und zeigen nicht mehr die korrekten Icons zu den entsprechenden Dateien und Verknüpfungen? Egal aus welchem Grund auch immer - falls Sie bei der Suche nach einer API-Funktion, die die Darstellung der Icons aktualisiert, auf die Funktion MSDN Library - API SystemParametersInfoSystemParametersInfo mit dem Aktionsparameter SPI_SETICONS gestoßen sein sollten, werden Sie sich vielleicht darüber gewundert haben, dass der Aufruf dieser Funktion offensichtlich ohne Wirkung zu bleiben scheint. Selbst wenn Sie in deren letztem Parameter entsprechend der Dokumentation das Flag SPIF_SENDCHANGE übergeben, scheint sich immer noch nichts zu tun, zumindest nicht auf allen Systemen. Den genauen Grund weiß ich allerdings auch nicht. Bekannt ist nur, dass sich die Funktion nicht immer so verhält, wie sie soll.

Eine tatsächliche Aktualisierung der Shell-Icons, genauer gesagt, der System-Icon-Liste, erreichen Sie nur, wenn Sie kurzfristig die Größe der Icons ändern, die Message MSDN Library - API WM_SETTINGCHANGEWM_SETTINGCHANGE an alle Fenster senden, die Größe wieder restaurieren und die Message noch einmal senden.

Doch wie ändern Sie nun die Größe der Shell-Icons? Mit SystemParametersInfo können Sie zwar allerhand Veränderungen in den Systemeinstellungen vornehmen, auch die nahe verwandt erscheinenden Standard-Abstände der Icons auf dem Desktop bzw. in ListViews mit Icon-Darstellung. Doch ausgerechnet zur Manipulation der Icon-Größe werden Sie keinen Aktionsparameter finden können. Sie können die Icon-Größe zwar mit der API-Funktion MSDN Library - API GetSystemMetricsGetSystemMetrics und den Indices SM_CXICON und SM_CYICON auslesen - das Gegenstück zu dieser Funktion, die etwa SetSystemMetrics heißen müsste, werden Sie genau so wenig finden. Die einzige Möglichkeit ist, den Wert direkt in der Windows-Registrierung unter dem Schlüssel

HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics\Shell Icon Size

zu ändern.

Nun sind Zugriffe auf die Registrierung nicht gerade trivial, wenn Sie an jeden beliebigen Schlüssel heran kommen möchten, und sich nicht auf die Visual Basic-eigenen GetSetting/SaveSetting-Möglichkeiten beschränken wollen (und hier eben auch nicht können).

Wenn Sie ein wenig in der Microsoft Knowledge-Base, im Internet, in Foren und in Newsgroups herumstöbern, werden Sie viele Code-Beispiele, sogar auf gebrauchsfertige Module, Klassen und Controls für Registrierungszugriffe stoßen. Die meisten bilden jedoch die dahinterstehenden API-Funktionen auf aus Visual Basic-Sicht eher ungewohnte Weise ab, so dass die Verwendung oft nicht gerade als komfortabel zu bezeichnen wäre. Doch interessanterweise bietet Microsoft selbst schon seit ewigen Zeiten (seit Visual Basic 4) eine kleine, aber feine und praktische ActiveX-DLL (REGOBJ.DLL) genau zu diesem Zweck an. Das darin enthaltende Registry-Objekt ist zum einen nicht nur ausgesprochen stabil und fehlerfrei, sondern bietet zudem auch die Möglichkeit, die gesamte Registrierung in der Form eines Baumes mit allen Verzweigungen zu durchlaufen (ähnlich dem, wie das FileSystemObject aus der Scripting-DLL das Dateisystem abbildet). Sie können die DLL kostenlos bei Download - Microsoft REGOBJ.DLLMicrosoft herunterladen und brauchen sie anschließend nur noch mit RegSvr32 zu registrieren:

RegSvr32.EXE [Pfad]REGOBJ.DLL)

Für unsere Absicht, die Shell-Icon-Größe vorübergehend zu ändern, genügt der Zugriff auf den oben genannten Schlüssel. Den Schlüssel erhalten Sie direkt mit einem Aufruf der globalen Methode RegKeyFromString des Registry-Objekts (da dieses ein globales Objekt ist, brauchen Sie es noch nicht einmal ausdrücklich zu instanzieren). Und den gesuchten Wert finden Sie in der Values-Collection des betreffenden Schlüssel-Objekts (Regkey-Objekt).

Da die Standard-Einstellung für die Shell-Icon-Größe meistens 32 Pixels beträgt, genügt es, den Wert vorübergehend auf 31 Pixels zu setzen. Falls er jedoch schon 31 Pixels betragen sollte, setzen wir ihn eben umgekehrt auf 32 Pixels. In jedem Fall merken wir uns den vorgefundenen Wert in der Variablen nOldSize.

Dann senden wir die Nachricht WM_SETTINGCHANGE systemweit an alle Top-Fenster - anstelle eines spezifischen Fenster-Handles geben wir die Konstante HWND_BROADCAST an. Allerdings verwenden wir hier nicht wie sonst meistens die Funktion MSDN Library - API SendMessageSendMessage, sondern deren Variante MSDN Library - API SendMessageTimeoutSendMessageTimeout. Diese hat den Vorteil, dass ihr Aufruf auch dann nach einer in Sekunden einstellbaren Zeitspanne zurückkehrt, wenn eines der die Nachricht empfangenden Fenster die Nachricht nicht (oder nicht sofort) verarbeiten kann (weil sie vielleicht anderweitig beschäftigt ist, oder gar unbemerkt abstürzt oder bereits abgestürzt ist). Für den letzten Parameter (eigentlich eine Erfolgsmeldung) müssen wir zwar eine Variable dimensionieren, können hier aber auf eine Auswertung und Berücksichtigung verzichten.

Damit der Desktop genügend Zeit bekommt, die Größenänderung nachzuvollziehen, legen wir unseren Code für kurze Zeit mit der API-Funktion Sleep schlafen - etwa 4 Sekunden (4000 Millisekunden). Nun setzen wir die Größe der Shell-Icons wieder auf den Ursprungswert zurück und senden zum Abschluß erneut die Nachricht WM_SETTINGCHANGE an alle Fenster.

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&

Public Sub ReloadShellIcons()
  Dim nResult As Long
  Dim nOldSize As Long
  
  With RegKeyFromString _
   ("\HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics")
    nOldSize = .Values("Shell Icon Size")
    If nOldSize = 31 Then
      .Values("Shell Icon Size") = 32
    Else
      .Values("Shell Icon Size") = 31
    End If
    SendMessageTimeout HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0, _
     SMTO_ABORTIFHUNG, 3, nResult
    Sleep 4000
    .Values("Shell Icon Size") = nOldSize
    SendMessageTimeout HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0, _
     SMTO_ABORTIFHUNG, 3, nResult
  End With
End Sub

Natürlich können Sie die Technik auch für sich alleine dazu verwenden, die Shell-Icon-Größe zu ändern:

Public Property Let ShellIconSize(ByVal New_ShellIconSize As Long)
  Dim nResult As Long
  
  Select Case New_ShellIconSize
    Case 0
      New_ShellIconSize = 32
    Case Is < 16
      New_ShellIconSize = 16
    Case Is > 72
      New_ShellIconSize = 72
  End Select
  RegKeyFromString _
   ("\HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics") _
    .Values("Shell Icon Size") = New_ShellIconSize
  SendMessageTimeout HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0, _
   SMTO_ABORTIFHUNG, 3, nResult
End Property

Und falls Sie nur neugierig sein sollten, können Sie die Größe auch über das Registry-Objekt auslesen:

Public Property Get ShellIconSize() As Long
  ShellIconSize = RegKeyFromString _
   ("\HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics") _
   .Values("Shell Icon Size")
End Property

Modul modShellIcons (modShellIcons.bas - ca. 2 KB)

Microsoft REGOBJ.DLL


Artikel
Zum Download-Bereich dieses Artikel
Mail an den Autor dieses Artikels

KnowHow
Zur KnowHow-Übersicht

KnowHow-Themen
Themen - Allgemeines
Themen - Entwicklungsumgebung (VB-IDE)
Themen - Forms
Themen - Steuerelemente (Controls)
Themen - Grafik
Themen - Dateien
Themen - UserControls
Themen - Einsteiger-Tipps
Themen - Wussten Sie...?

Übersicht nach Titeln in alphabetischer Reihenfolge
Übersicht nach Erscheinungsdatum

Schnellsuche



Zum Seitenanfang

Copyright © 1999 - 2017 Harald M. Genauck, ip-pro gmbh  /  Impressum

Zum Seitenanfang

Zurück...

Zurück...

Download Internet Explorer