W systemie Windows 8 / 8.1 x64 chciałbym przypisać niestandardową ikonę do domyślnych elementów menu kontekstowego systemu Windows, takich jak Kopiuj , Wytnij , Wklej , Usuń , Cofnij , Ponów i Wyślij do , które domyślnie mają dowolną ikonę:
Gdzie mogę znaleźć „odniesienie” do tych pozycji menu kontekstowego w rejestrze, a następnie dodać dla nich wartość rejestru „ikona”?
Lub innymi słowy, jak przypisać ikonę do menu rozszerzenia powłoki niczym SendTo Shellex ?.
Badania
Jak komentuje @ Sk8erPeter , wydaje się, że:
„Dodanie
Icon
wartości ciągu do różnych programów obsługi menu kontekstowego nie działa tak, jak podczas dodawania go do elementu niestandardowego, takiego jak np.HKEY_CLASSES_ROOT\*\shell\MYCUSTOMKEY
”
windows-8
context-menu
shell-extensions
ElektroStudios
źródło
źródło
Icon
wartość ciągu w kluczu podobnymHKEY_CLASSES_ROOT\*\shell\MYCUSTOMITEM
(a wartość tegoIcon
będzie taka jak np%SystemRoot%\System32\shell32.dll,-133
. sg. else). ALE dodawanieIcon
wartości ciągu do różnych programów obsługi menu kontekstowego nie działa tak, jak podczas dodawania go do tych niestandardowych elementów.SetMenuItemInfo
w odpowiedziQueryContextMenu
.Odpowiedzi:
Powiadomienie o stowarzyszeniu: Jestem autorem oprogramowania wymienionego w tej odpowiedzi.
Po pierwsze, chcę wiedzieć, że nauczyłem się C ++ i Win32 tylko na to pytanie .
Opracowałem 64-bitowe rozszerzenie powłoki, które jest rejestrowane jako moduł obsługi menu kontekstowego. Po wywołaniu przeszukuje istniejące pozycje menu, szukając interesujących pozycji. Jeśli ją znajdzie, nakleja na nią ikonę (która musiała zostać wcześniej załadowana). Obecnie wyszukuje opcje Kopiuj , Wytnij , Usuń , Wklej , Ponów , Wyślij do i Cofnij . Możesz dodać własny, modyfikując kod; procedura jest opisana poniżej. (Przepraszam, nie jestem wystarczająco dobry w C ++, aby można go było konfigurować).
Zrzut ekranu przedstawiający najbrzydsze ikony znane człowiekowi:
Możesz pobrać te ikony, jeśli naprawdę chcesz.
Konfiguracja
Pobierz go (z mojego Dropbox). Uwaga : ten plik jest wykrywany przez jeden skaner VirusTotal jako pewna forma złośliwego oprogramowania. Jest to zrozumiałe, biorąc pod uwagę rodzaj rzeczy, które należy zrobić, aby zlikwidować istniejące wpisy. Daję wam słowo, że nie wyrządza celowo szkody komputerowi. Jeśli jesteś podejrzany i / lub chcesz go zmodyfikować i rozszerzyć, zobacz kod na GitHub !
Utwórz folder w dysku C:
C:\shellicon
. Tworzenie plików BMP z następujących tytułów:copy
,cut
,delete
,paste
,redo
,sendto
,undo
. (Mam nadzieję, że jest oczywiste, który z nich robi jakąś rzecz.) Te obrazy powinny prawdopodobnie mieć rozmiar 16 na 16 pikseli (lub jak duże ustawienia DPI robią margines menu), ale udało mi się również z większymi. Jeśli chcesz, aby ikony wyglądały na przezroczyste, musisz po prostu ustawić ich tło w tym samym kolorze co menu kontekstowe. (Ta sztuczka jest również stosowana przez Dropbox.) Zrobiłem moje straszne ikony za pomocą MS Paint; inne programy mogą, ale nie muszą, zapisywać w sposób zgodny zLoadImageA
. 16 na 16 przy 24-bitowej głębi kolorów przy 96 pikselach na cal wydaje się być najbardziej niezawodnym zestawem właściwości obrazu.Umieść bibliotekę DLL w miejscu dostępnym dla wszystkich użytkowników, właśnie utworzony folder jest dobrym wyborem. Otwórz monit administratora w folderze zawierającym bibliotekę DLL i wykonaj
regsvr32 ContextIcons.dll
. Stwarza informacji rejestracyjnych dla typów muszli*
,Drive
,Directory
, iDirectory\Background
. Jeśli kiedykolwiek chcesz usunąć rozszerzenie powłoki, zrób toregsvr32 /u ContextIcons.dll
.Odpowiedni kod
Zasadniczo rozszerzenie tylko odpytuje tekst każdego elementu menu kontekstowego
GetMenuItemInfo
i, w razie potrzeby, dostosowuje ikonę za pomocąSetMenuItemInfo
.Visual Studio generuje wiele magicznego tajemniczego kodu dla projektów ATL, ale jest to zawartość
IconInjector.cpp
, która implementuje moduł obsługi menu kontekstowego:Zauważ, że
HBITMAP
s nigdy nie są czyszczone, ale nie ma to większego znaczenia, biorąc pod uwagę, że pliki DLL znikną po wyłączeniu Explorera. Ikony i tak ledwo zajmują pamięć.Jeśli kompilujesz dla wersji 32-bitowej, pierwszym parametrem
GetCommandString
jest po prostuUINT
zamiast aUINT_PTR
.Jeśli naprawdę chcesz, przejrzyste ikony, musisz utworzyć okno z żądaną ikonę, a następnie ustawić
mii.hBmpItem
sięHBMMENU_SYSTEM
i umieścić uchwyt do okna, wmii.dwItemData
sposób opisany na dole artykułu na MSDNMENUITEMINFO
. Nie byłem w stanie dowiedzieć się, jak tworzyć okna z rozszerzeń powłoki.LR_LOADTRANSPARENT
wygląda obiecującoLoadImageA
, ale ma swoje własne pułapki - w szczególności nie działa, chyba że użyjesz 256-bitowych map bitowych.Jeśli występują problemy z ładowaniem obrazu, spróbuj usunąć
LR_DEFAULTSIZE
flagę zLoadImageA
połączeń.Ktoś wystarczająco wykwalifikowany w C ++ mógłby prawdopodobnie pobrać zasoby z innych bibliotek DLL i przekonwertować je na
HBITMAP
s, ale tym kimś nie jestem ja.Modyfikując to
Napisałem to w Visual Studio, które uważam za najlepszy edytor dla Windows C ++.
Załaduj plik SLN do programu Visual Studio 2015 po zainstalowaniu narzędzi C ++. W
IconInjector.cpp
możesz dodaćHBITMAP
wpisy u góry iLoadImageA
wywołać,Initialize
aby dodać nowe ikony. W dolnejelse if
części sekcji użyjwcscmp
połączenia, aby wyszukać dokładne dopasowanie lubwcsstr
połączenia, aby sprawdzić obecność podłańcucha. W obu przypadkach&
reprezentuje pozycję podkreślenia / akceleratora przy użyciu Shift + F10. Ustaw tryb na Release, a architekturę na x64 i wykonaj Kompilacja → Kompiluj rozwiązanie . Pojawi się błąd związany z niezarejestrowaniem danych wyjściowych, ale nie martw się; i tak chcesz to zrobić ręcznie. Zakończ Eksploratora, skopiuj nową bibliotekę DLL (\x64\Release\ContextIcons.dll
w folderze rozwiązania) na miejsce, a następnie wykonajregsvr32
taniec.Atrybucje
Wielkie podziękowania dla pisarzy MSDN i twórcy „ The Complete Idiot's Guide to Writing Shell Extensions ”, do którego bardzo się odwoływałem.
Pochwała
Do wielu wystąpień Eksploratora, które zostały zabite podczas produkcji tego rozszerzenia powłoki: zginąłeś z wielkiej przyczyny, że niektóre osoby w Internecie mogą mieć ikony obok swoich słów.
źródło
C:\shellicon\copy.bmp
itp. - są to ikony 20 x 20 pikseli w formacie BMP) i zarejestrowałem dll jako administrator w wierszu polecenia, zregsvr32 ContextIcons.dll
którym uruchomiono pomyślnie, ale Nie widzę żadnych zmian w menu kontekstowym. Zrestartowałem nawet komputer, wyrejestrowałem i ponownie zarejestrowałem dll, ale żadnych zmian. Próbuję skompilować źródło w VS2015!Nie mam wystarczającej liczby przedstawicieli, aby zostawić komentarz, ale wygląda na to, że ta informacja jest zawarta w shell32.dll. Pliki zostały skompilowane, więc trudno jest zobaczyć, jakie funkcje są w nim zawarte, ale wydaje się, że jest to jedna.
Interesujące (eksport rejestru):
HKEY_CLASSES_ROOT \ CLSID {3ad05575-8857-4850-9277-11b85bdb8e09}
(Domyślnie) REG_SZ Kopiuj / Przenieś / Zmień nazwę / Usuń / Połącz obiekt
AppID REG_SZ {3ad05575-8857-4850-9277-11b85bdb8e09}
LocalizedString REG_EXPAND_SZ @% SystemRoot% \ system32 \ shell32.dll, -50176
Pod kluczem InProcServer32 odwołuje się do shell32.dll. Jest też kilka innych o odpowiednich brzmieniach. Być może również interesujący jest plik windows.storage.dll
źródło