Unter Windows 8 / 8.1 x64 möchte ich ein benutzerdefiniertes Symbol für die Standardelemente des Windows-Kontextmenüs wie " Kopieren" , " Ausschneiden" , " Einfügen" , " Löschen" , " Rückgängig" , " Wiederherstellen" und " Senden an" zuweisen , die standardmäßig ein beliebiges Symbol aufweisen:
Wo finde ich den "Verweis" auf diese Kontextmenüelemente in der Registrierung und füge einen "Symbol" -Registrierungswert für sie hinzu?
Oder mit anderen Worten, wie Sie einem Shell-Erweiterungsmenü wie dem SendTo shellex ein Symbol zuweisen ?.
Forschung
Wie von @ Sk8erPeter kommentiert , scheint das:
"Das Hinzufügen des
Icon
Zeichenfolgenwerts zu verschiedenen Kontextmenü-Handlern funktioniert nicht wie beim Hinzufügen zu einem benutzerdefinierten Element wie z. B.HKEY_CLASSES_ROOT\*\shell\MYCUSTOMKEY
"
quelle
Icon
String-Wert in einem Schlüssel wie hinzufügen müssenHKEY_CLASSES_ROOT\*\shell\MYCUSTOMITEM
(und der Wert desIcon
wäre wie zB%SystemRoot%\System32\shell32.dll,-133
oder sg. else). ABER das Hinzufügen desIcon
Zeichenfolgenwerts zu verschiedenen Kontextmenü- Handlern funktioniert nicht wie beim Hinzufügen zu diesen benutzerdefinierten Elementen.SetMenuItemInfo
Reaktion darauf verwendet wirdQueryContextMenu
.Antworten:
Hinweis zur Zugehörigkeit: Ich bin der Autor der in dieser Antwort genannten Software.
Zunächst möchte ich Ihnen mitteilen, dass ich C ++ und Win32 nur für diese Frage gelernt habe .
Ich habe eine 64-Bit-Shell-Erweiterung entwickelt, die als Kontextmenü-Handler registriert wird. Wenn es aufgerufen wird, durchsucht es die vorhandenen Menüelemente nach interessanten Einträgen. Wenn es eines findet, klebt es ein Symbol darauf (das zuvor geladen worden sein muss). Im Moment sucht es nach Kopieren , Ausschneiden , Löschen , Einfügen , Wiederholen , Senden an und Rückgängig . Sie können Ihren eigenen Code hinzufügen, indem Sie den Code ändern. Die Vorgehensweise hierfür wird im Folgenden beschrieben. (Sorry, ich bin nicht gut genug in C ++, um es konfigurierbar zu machen.)
Ein Screenshot davon in Aktion mit den hässlichsten Symbolen, die der Mensch kennt:
Sie können diese Symbole herunterladen, wenn Sie wirklich möchten.
Einrichten
Laden Sie es herunter (von meiner Dropbox). Hinweis : Diese Datei wird von einem VirusTotal-Scanner als Malware erkannt . Dies ist verständlich, wenn man bedenkt, wie viel man tun muss, um die vorhandenen Einträge zu schlagen. Ich versichere Ihnen, dass es Ihrem Computer keinen absichtlichen Schaden zufügt. Wenn Sie misstrauisch sind und / oder es ändern und erweitern möchten, lesen Sie den Code auf GitHub !
Erstellen Sie einen Ordner in Ihrem Laufwerk C:
C:\shellicon
. Erstellen Sie BMP - Dateien mit den folgenden Titeln:copy
,cut
,delete
,paste
,redo
,sendto
,undo
. (Hoffentlich ist klar, wer was macht.) Diese Bilder sollten wahrscheinlich 16 mal 16 Pixel groß sein (oder wie groß Ihre DPI-Einstellungen auch sein mögen), aber ich hatte auch Erfolg mit größeren. Wenn Sie möchten, dass die Symbole transparent aussehen, müssen Sie lediglich den Hintergrund in der gleichen Farbe wie das Kontextmenü anzeigen. (Dieser Trick wird auch von Dropbox angewendet.) Ich habe meine schrecklichen Symbole mit MS Paint erstellt. Andere Programme werden möglicherweise auf eine Weise gespeichert, die mit kompatibel istLoadImageA
. 16 x 16 bei 24-Bit-Farbtiefe bei 96 Pixel pro Zoll scheint der zuverlässigste Satz von Bildeigenschaften zu sein.Platzieren Sie die DLL an einem Ort, auf den alle Benutzer zugreifen können. Der Ordner, den Sie gerade erstellt haben, ist eine gute Wahl. Öffnen Sie eine Admin-Eingabeaufforderung in dem Ordner, der die DLL enthält, und führen Sie dies aus
regsvr32 ContextIcons.dll
. Dies schafft Registrierungsinformationen für den Shell - Typen*
,Drive
,Directory
, undDirectory\Background
. Wenn Sie jemals die Shell-Erweiterung entfernen möchten, tun Sie diesregsvr32 /u ContextIcons.dll
.Relevanter Code
Grundsätzlich fragt die Erweiterung nur den Text jedes Kontextmenüeintrags mit ab
GetMenuItemInfo
und passt gegebenenfalls das Symbol mit anSetMenuItemInfo
.Visual Studio generiert eine Menge mysteriösen Code für ATL-Projekte, aber dies ist der Inhalt von
IconInjector.cpp
, der den Kontextmenü-Handler implementiert:Beachten Sie, dass die
HBITMAP
s nie bereinigt werden, dies ist jedoch nicht allzu wichtig, da die DLL-Dateien beim Herunterfahren des Explorers nicht mehr angezeigt werden. Die Icons nehmen sowieso kaum Speicherplatz in Anspruch.Wenn Sie für 32-Bit kompilieren, ist der erste Parameter
GetCommandString
nur aUINT
anstelle von aUINT_PTR
.Wenn Sie wirklich transparente Symbole wollen, müssen Sie zunächst ein Fenster mit dem gewünschten Symbol und setzen Sie erstellen müssen , um
mii.hBmpItem
zuHBMMENU_SYSTEM
und legen den Griff in die Fenster inmii.dwItemData
, wie im unteren Teil des beschriebenen auf den MSDN - ArtikelMENUITEMINFO
. Ich konnte nicht herausfinden, wie Fenster aus Shell-Erweiterungen erstellt werden.LR_LOADTRANSPARENT
sieht vielversprechend aus als Flagge vonLoadImageA
, hat aber seine eigenen Fallstricke - und funktioniert nur, wenn Sie Bitmaps mit 256 Farben verwenden.Wenn beim Laden von Bildern Probleme auftreten, entfernen Sie das
LR_DEFAULTSIZE
Flag aus denLoadImageA
Aufrufen.Jemand, der über ausreichende Kenntnisse in C ++ verfügt, könnte wahrscheinlich Ressourcen aus anderen DLLs entnehmen und in
HBITMAP
s konvertieren , aber das bin nicht ich.Ändern Sie es
Ich habe dies in Visual Studio geschrieben, das meiner Meinung nach der beste Editor für Windows C ++ ist.
Laden Sie die SLN-Datei in Visual Studio 2015, nachdem Sie die C ++ - Tools installiert haben. In
IconInjector.cpp
können SieHBITMAP
oben Einträge hinzufügen undLoadImageA
anrufenInitialize
, um neue Symbole hinzuzufügen.else if
Verwenden Sie unten im Abschnitt einenwcscmp
Aufruf, um nach einer genauen Übereinstimmungwcsstr
zu suchen , oder einen Aufruf, um nach der Anwesenheit einer Teilzeichenfolge zu suchen. In beiden Fällen steht das&
für die Position der Unterstreichung / Beschleunigung bei Verwendung von Umschalt + F10. Stellen Sie Ihren Modus auf Release und Ihre Architektur auf x64 ein und führen Sie Build → Build Solution aus . Es wird eine Fehlermeldung angezeigt, dass die Ausgabe nicht registriert werden konnte, aber keine Sorge. Sie möchten dies sowieso manuell tun. Beenden Sie den Explorer, kopieren Sie die neue DLL (\x64\Release\ContextIcons.dll
im Lösungsordner) an den gewünschten Ort undregsvr32
tanzen Sie dann.Zuschreibungen
Vielen Dank an die MSDN-Autoren und an den Schöpfer von " The Complete Idiot's Guide to Writing Shell Extensions ", auf das ich stark verwiesen habe.
Lobrede
Zu den vielen Explorer-Instanzen, die bei der Produktion dieser Shell-Erweiterung getötet wurden: Sie sind für eine große Sache gestorben, dass einige Leute im Internet Symbole neben ihren Worten haben können.
quelle
C:\shellicon\copy.bmp
BMP- Bilder befinden sich im richtigen Pfad ( usw. - das sind 20x20 Pixel-Symbole im BMP-Format) und ich habe die DLL als Administrator in der Eingabeaufforderung registriert, mitregsvr32 ContextIcons.dll
der sie erfolgreich ausgeführt wurde, aber Ich sehe keine Änderungen im Kontextmenü. Ich habe sogar den Computer neu gestartet, die Registrierung aufgehoben und die DLL erneut registriert, aber keine Änderungen vorgenommen. Ich versuche die Quelle in VS2015 zu kompilieren!Ich habe nicht genug Repräsentanten, um einen Kommentar zu hinterlassen, aber anscheinend sind diese Informationen in der Datei shell32.dll enthalten. Die Dateien wurden kompiliert, so dass es schwierig ist zu erkennen, welche Funktionen darin enthalten sind, aber es scheint die einzige zu sein.
Interessant (Registrierungsexport):
HKEY_CLASSES_ROOT \ CLSID {3ad05575-8857-4850-9277-11b85bdb8e09}
(Standard) REG_SZ Objekt kopieren / verschieben / umbenennen / löschen / verknüpfen
AppID REG_SZ {3ad05575-8857-4850-9277-11b85bdb8e09}
LocalizedString REG_EXPAND_SZ @% SystemRoot% \ system32 \ shell32.dll, -50176
Unter dem InProcServer32-Schlüssel wird auf shell32.dll verwiesen. Es gibt noch ein paar andere mit relevanten klingenden Namen. Möglicherweise ist auch windows.storage.dll von Interesse
quelle