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 :)
Cudo
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ć....