Ikonka w oknie Mój komputer i innych folderach specjalnych

Szczawik

Ta wskazówka powstała na bazie posta użytkownika ravenmax z marca 2005 o analogicznym problemie.. Pozdrawiam.

Jak dodać własną ikonkę do okna Mój komputer w systemie Windows?

Zadanie jest dosyć proste, jednak wymaga trochę roboty. Postaram się pokazać to nie pod jakimś językiem programowania, ale poprzez modyfikację wpisów w rejestrze.

1 Numer GUID
2 Plik wpisu do rejestru
3 Co jest czym?
4 Literatura
5 Uwagi

Numer GUID

Po pierwsze potrzebujemy wygenerować sobie numer GUID (Globally Unique IDentifier). Z okna kodu Delphi robi to skrót [CTRL]+[SHIFT]+[G], ale równie dobrze można to zrobić choćby programami on-line (np.: http://kruithof.xs4all.nl/uuid/uuidgen), czy też aplikacją Microsoftu GUIDGEN.EXE ewentualnie UUIDGEN.EXE, dołączaną do wielu środowisk programistycznych dla Windows (w tym Visual Studio). Istnieje też funkcja systemowa CoCreateGuid(), którą można wykorzystać do generowania GUID w trakcie wykonania programu lub nawet do stworzenia generatora.

Czym jest GUID? Jest to 128 bitowy numer generowany na podstawie kilku czynników, w tym aktualnego czasu, strefy czasowej, numeru MAC karty sieciowej oraz numeru IP (choć sieć nie jest konieczna), kilku zmiennych systemowych oraz cząstek liczby losowej. Tak naprawdę GUID nie jest wyłącznie dużą zmienną losową, ale efektem działania dosyć skomplikowanego algorytmu opracowanego przez Open Software Foundation. Jego zadaniem jest identyfikować jednoznacznie w skali światowej obiekt.

Na jakimś serwisie internetowym widziałem wyliczenie, że gdyby każdy człowiek na świecie co minutę generował sobie jeden numer, to może zaczęłyby się powtarzać bodajże po kilkuset tysiącach lat - nie sprawdzałem tego wyliczenia osobiście. Pamiętajmy, że jest tu 2^128 kombinacji, przy czym pewne są zastrzeżone dla członków komitetu, który opracował ten algorytm (w tym Microsoftu), tych nie da się wygenerować - tak stworzono algorytm.

Abstrachując od szacunków - to na prawdę jest numer unikatowy globalnie, przy założeniu, że ktoś inny nie powieli go (na przykład kopiując gotowy przykład) lub nie wpisze sobie go ręcznie. Numery te należy generować! Algorytm wykorzystany we wszystkich generatorach GUID powinien być ten sam.

Do przykładu wygenerowałem sobie numer:
{645FF040-5081-101B-9F08-00AA002F954A}

Jeśli chcesz przetestować przykład, wygeneruj własny numer, a nim zastąp w poniższym pliku wszystkie fragmenty "{645FF040-5081-101B-9F08-00AA002F954A}". To będzie Twój światowo-niepowtarzalny numer identyfikacyjny folderu specjalnego.

Plik wpisu do rejestru

Tworzymy plik wpisu do rejestru (*.REG).

====================================================
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\
Explorer\MyComputer\NameSpace\{645FF040-5081-101B-9F08-00AA002F954A}]
@="Folder specjalny"

[HKEY_CLASSES_ROOT\CLSID\{645FF040-5081-101B-9F08-00AA002F954A}]
@="Folder Specjalny - tekst tylko dla opisu"
"InfoTip"=hex(2):49,00,6e,00,66,00,6f,00,54,00,69,00,70,00,20,00,66,00,6f,00,\
  6c,00,64,00,65,00,72,00,75,00,00,00
"SortOrderIndex"=dword:00000060
"IntroText"=hex(2):49,00,6e,00,74,00,72,00,6f,00,54,00,65,00,78,00,74,00,20,00,\
  66,00,6f,00,6c,00,64,00,65,00,72,00,75,00,00,00
"LocalizedString"="Folder specjalny"

[HKEY_CLASSES_ROOT\CLSID\{645FF040-5081-101B-9F08-00AA002F954A}\DefaultIcon]
@=hex(2):65,00,78,00,70,00,6c,00,6f,00,72,00,65,00,72,00,2e,00,65,00,78,00,65,\
  00,2c,00,30,00,00,00

[HKEY_CLASSES_ROOT\CLSID\{645FF040-5081-101B-9F08-00AA002F954A}\Shell]
@=""

[HKEY_CLASSES_ROOT\CLSID\{645FF040-5081-101B-9F08-00AA002F954A}\Shell\Open]
@="Otwórz mój folder"

[HKEY_CLASSES_ROOT\CLSID\{645FF040-5081-101B-9F08-00AA002F954A}\Shell\Open\Command]
@="explorer.exe c:\\"

[HKEY_CLASSES_ROOT\CLSID\{645FF040-5081-101B-9F08-00AA002F954A}\ShellFolder]
"Attributes"=hex:40,00,00,02
"CallForAttributes"=dword:00000040
  ====================================================

Pierwsza nazwa klucza rejestru została przeze mnie przeniesiona do nowej linii, by na forum nie rozciągała tekstu, należy ją poprawić.

Co jest czym?

Oto masz plik (*.REG). Możesz powyższy tekst przekleić do pliku, poprawić i uruchomić. Stworzy Ci to Folder Specjalny w oknie Mój komputer. Po jego naciśnięciu uruchomi się katalog C:.

A teraz przejdźmy do tego, czym co jest [polecam najpierw uruchomić powyższy wpis, a potem przeglądać zawartość rejestru (program REGEDIT), gdyż niektóre dane są zapisane w Unicode (znaki wielobajtowe)].

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\
Explorer\MyComputer\NameSpace\{645FF040-5081-101B-9F08-00AA002F954A}]
@="Folder specjalny"

To dodaje do Mój komputer nową ikonę folderu specjalnego, którego numer GUID jest taki, jak podano. Ta akcja już dodaje ikonę do okna, co prawda ikona ta nic nie robi. Nazwa nie jest tu niezbędna, potrzebny tylko klucz rejestru.

[HKEY_CLASSES_ROOT\CLSID\{645FF040-5081-101B-9F08-00AA002F954A}]
@="Folder Specjalny - tekst tylko dla opisu"
"InfoTip"=hex(2):49,00,6e,00,66,00,6f,00,54,00,69,00,70,00,20,00,66,00,6f,00,\
          6c,00,64,00,65,00,72,00,75,00,00,00
"SortOrderIndex"=dword:00000060
"IntroText"=hex(2):49,00,6e,00,74,00,72,00,6f,00,54,00,65,00,78,00,74,00,20,00,\
          66,00,6f,00,6c,00,64,00,65,00,72,00,75,00,00,00
"LocalizedString"="Folder specjalny"

Powyższe wpisy definiują Twój folder specjalny. Pierwsza linia tworzy klucz dla twego folderu. Druga identyfikuje wpis w rejestrze - nie jest niezbędna, jednak dla porządku warto ją dawać.

InfoTip (w Unicode) to chmurka podpowiedzi po najechaniu na Twój folder.
SortOrderIndex to kolejność układania w Mój komputer, bo nie będzie to układane literami dysków (bo tu nie ma o tym mowy).
IntroText (w Unicode) to opis wydziany w oknie Mój komputer
LocalizedString to nazwa dla tego folderu (dopiero ten wpis definiuje nazwę)

[HKEY_CLASSES_ROOT\CLSID\{645FF040-5081-101B-9F08-00AA002F954A}\DefaultIcon]
@=hex(2):65,00,78,00,70,00,6c,00,6f,00,72,00,65,00,72,00,2e,00,65,00,78,00,65,\
          00,2c,00,30,00,00,00

(Unicode) To definiuję ikonę dla Twojego folderu - może być wyrażone np.: w postaci: explorer.exe,7 (siódma ikona w pliku exe) lub po prostu c:\ikona.ico.

[HKEY_CLASSES_ROOT\CLSID\{645FF040-5081-101B-9F08-00AA002F954A}\
Shell]
@=""

To klucz, gdzie będziemy opisywali akcje dostępne na Twoim folderze (widoczne w menu podręcznym, gdy folder jest zaznaczony)

[HKEY_CLASSES_ROOT\CLSID\{645FF040-5081-101B-9F08-00AA002F954A}\
Shell\Open]
@="Otwórz mój folder"

Dla przykładu zdefiniujemy jedną akcję (więc przy okazji będzie ona domyślną). Jeśli w nazwie klucza wyraz "Open" zastąpisz innym wyrazem, na przykład "Akcja_1", możesz definiować dodatkowe akcje. Ta będzie miała widoczny tekst: "Otwórz mój folder".

[HKEY_CLASSES_ROOT\CLSID\{645FF040-5081-101B-9F08-00AA002F954A}\
Shell\Open\Command]
@="explorer.exe c:\\"

Co się ma dziać po wybraniu akcji "Open"? Na przykład uruchomienie explorer.exe z parametrem - otwartym katalogiem (jeśli w ścieżce występują spacje, to ścieżka folderu musi byc dodatkowo brana w cudzysłowy). Można tu uruchomić dowolny inny program.

[HKEY_CLASSES_ROOT\CLSID\{645FF040-5081-101B-9F08-00AA002F954A}\ShellFolder]
"Attributes"=hex:40,00,00,02
"CallForAttributes"=dword:00000040

To opis stanu folderu (polecam pozostawić niezmienione lub poeksperymentowac z wartościami).

Według konwencji Winapi, stałe atrybutów poprzedzone są przedrostkiem: SFGAO_. W Delphi stałe atrybutów znajdują się w bibliotece ShlObj.

Wartość Opis Stała Winapi
<nowrap>10 00 00 00</nowrap> Obiekt posiada opcję zmiany nazwy SFGAO_CANRENAME
20 00 00 00 Obiekt posiada opcję usunięcia SFGAO_CANDELETE
40 00 00 00 Obiekt posiada opcję właściwości SFGAO_HASPROPSHEET
01 00 00 00 Obiekt posiada opcję skopiowania SFGAO_CANCOPY
02 00 00 00 Obiekt posiada opcję przeniesienia SFGAO_CANMOVE
04 00 00 00 Obiekt posiada opcję utworzenia skrótu SFGAO_CANLINK
08 00 00 00 Obiekt obsługuje interfejs IStorage SFGAO_STORAGE
00 20 00 00 Obiekt jest zaszyfrowany SFGAO_ENCRYPTED
00 40 00 00 Obiekt jest oznaczony jako powolny SFGAO_ISSLOW
00 80 00 00 Obiekt jest oznaczony półprzezroczysty SFGAO_GHOSTED
00 01 00 00 Obiekt może być celem upuszczania lub wklejania SFGAO_DROPTARGET
00 00 10 00 Obiekt nie jest zwracany przy wyliczaniu IShellFolder::EnumObjects SFGAO_NONENUMERATED
00 00 20 00 Obiekt posiada nową zawartość (powinien być pogrubiony w drzewie plików) SFGAO_NEWCONTENT
00 00 40 00 Obiekt może posiadać nasłuchiwanie SFGAO_CANMONIKER
00 00 40 00 Obiekt obsługuje interfejs IStream SFGAO_STREAM
00 00 80 00 Obiekt jest korzeniem systemu obiektów IStream (SFGAO_STREAM) lub IStorage (SFGAO_STORAGE) SFGAO_STORAGEANCESTOR
00 00 01 00 Obiekt jest skrótem (ma ikonę strzałki skrótu) SFGAO_LINK
00 00 02 00 Obiekt jest udostępniony (ma ikonę dłoni) SFGAO_SHARE
00 00 04 00 Obiekt jest tylko do odczytu SFGAO_READONLY
00 00 08 00 Obiekt jest ukryty SFGAO_HIDDEN
00 00 00 10 Obiekt jest korzeniem systemu plików SFGAO_FILESYSANCESTOR
00 00 00 20 Obiekt jest folderem SFGAO_FOLDER
00 00 00 40 Obiekt jest elementem systemu plików (plik, katalog, katalog główny) SFGAO_FILESYSTEM
00 00 00 80 Obiekt zawiera podkatalogi SFGAO_HASSUBFOLDER
00 00 00 01 Obiekt wymaga sprawdzenia zgromadzonych informacji SFGAO_VALIDATE
00 00 00 02 Obiekt jest medium wymiennym SFGAO_REMOVABLE
00 00 00 04 Obiekt jest skompresowany (ma nazwę zakolorowaną) SFGAO_COMPRESSED
00 00 00 08 Obiekt może być przeglądany w miejscu SFGAO_BROWSABLE

Niektóre stany atrybutów od systemów Windows 2000/XP są nieaktualne. Wszystkie wartości podane są dla zapisu hex: HH,HH,HH,HH. Dla zapisu dword:DDDDDDDD kolejność bajtów powinna być odwrotna. Wartości można ze sobą łączyć operatorami logicznymi.

Możesz tak dowolny program uruchomić. Nawet otworzyć katalog przez uruchomienie programu Explorer.exe z parametrem - ścieżka:
EXPLORER.EXE c:\

Możesz to zamienić na przykład uruchomieniem powiedzmy notatnika:
NOTEPAD.EXE

Może to być cokolwiek innego, nawet nazwa pliku *.bmp, ale musimy ją poprzedzić nazwą programu, który ma to otworzyć. Niestety tak łatwo nie jesteśmy w stanie uruchomić pliku jego domyslnym programem. Ważne jest to, że nie można dać nazwy dowolnego pliku, a jedynie jakiś wykonywalny. Jeśli chcemy otworzyć inny format pliku, to musimy podać ścieżkę do programu, który go otworzy. Jeśli nie podamy pliku wykonywalnego, system wyświetli podczas otwierania niemiły komunikat.

Polecam też posługiwanie się całymi ściezkami do plików wykonywalnych oraz zmiennymi środowiska, np.: %SystemRoot% (katalog Windows, nie koniecznie będzie to c:\Windows, bo ktoś mógł zainstalować gdzieś indziej swój system). Poprawnym więc będzie wyrażenie:
%SystemRoot%\EXPLORER.EXE c:\

Literatura

Jeśli chodzi o numery GUID i pewne kwestie rejestru, to najlepszą jest tu książka Kraiga Brockschmidta "Inside OLE, 2nd edition" z roku 1995. Do reszty informacji doszedłem sam, więc nie jestem w stanie wskazać literatury.

P.S. Przed uruchomieniem jakiegokolwiek pliku (*.REG), warto sprawdzić czy jego zawartość nie jest w stanie namieszać nam w systemie.

Uwagi

Jeśli będziemy postępować zgodnie z poradą, ale zamiast (albo dodatkowo) dodawać ikonkę w rejestrze do klucza:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\
Explorer\MyComputer\NameSpace\{645FF040-5081-101B-9F08-00AA002F954A}

dodamy ją do:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\
Explorer\Desktop\NameSpace\{645FF040-5081-101B-9F08-00AA002F954A}

na pulpicie pojawi się nasza ikonka. Nie będzie ona jednak traktowana jako plik czy skrót, ale jako obiekt, na takich samych zasadach jak Mój komputer. O ile nie napiszemy jej akcji na usuwanie, nie będzie możliwości skasowania takiego elementu.

Na identycznych zasadach można ją dołożyć do Panelu sterowania: nie jako aplet, ale jako obiekt. Wystarczy utworzyć w rejestrze klucz:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\
Explorer\ControlPanel\NameSpace\{645FF040-5081-101B-9F08-00AA002F954A}

Albo też do folderu specjalnego Moje miejsca sieciowe:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\
Explorer\NetworkNeighborhood\NameSpace\{645FF040-5081-101B-9F08-00AA002F954A}

"You have been warned" - Zostaliście ostrzeżeni.. :D
Miłej zabawy :)

FAQ

8 komentarzy

Do panelu sterowania można jeszcze łatwiej.
Trzeba w Delphi/C++ Enterprise stworzyć Control Panel Application i skopiować do <katalog_windows>\system32
I gotowe.

Jak przekopie działeczkę to może jeszcze pokopać w MSDN i wynaleźć dla nas więcej kwiatków ;P

To jak sobie przekopiesz dzialeczke to wrzuc cos jeszcze:)

No wskazowka elegancka. Oby wiecej takich.

Jasne.. napiszę o panelu sterowania, ale może jutro, bo dziś lecę kopać działkę :D

dobre! Brawo!
Teraz napisz o dodawaniu ikonek do Panelu Sterowania...
Bo to nie sa zwykle dllki ;)

Palce lizać....