Wie weist man ein Symbol für die Standard-Kontextmenüelemente "Kopieren / Ausschneiden / Einfügen / Löschen" zu?

2675
ElektroStudios

Unter Windows 8 / 8.1 x64 möchte ich ein benutzerdefiniertes Symbol für die Standard-Windows-Kontextmenüelemente zuweisen, z. B. Kopieren, Ausschneiden, Einfügen, Löschen, Rückgängig machen, Wiederherstellen und Senden an, wobei standardmäßig ein Symbol vorhanden ist:

Wie weist man ein Symbol für die Standard-Kontextmenüelemente

Wo kann ich den "Verweis" auf diese Kontextmenüelemente in der Registrierung finden und dann einen Registrierungswert "Symbol" hinzufügen?

Oder mit anderen Worten, wie man einem Shell-Erweiterungsmenü wie dem SendTo shellex? Ein Symbol zuweisen kann.

Forschung


Wie @ Sk8erPeter kommentiert, scheint das:

"Das Hinzufügen des IconZeichenfolgenwerts zu anderen Kontextmenü-Handlern funktioniert nicht wie beim Hinzufügen zu einem benutzerdefinierten Element wie HKEY_CLASSES_ROOT\*\shell\MYCUSTOMKEY"

12
Welches Symbol meinst du? Hast du einen Screenshot? Raystafarian vor 8 Jahren 0
@Raystafarian Ich habe die Frage mit einem Bild aktualisiert. ElektroStudios vor 8 Jahren 0
@Raystafarian: Die Frage ist, wie Sie ein benutzerdefiniertes Symbol zu vorhandenen grundlegenden Kontextmenüelementen wie _ "Ausschneiden" _, _ "Kopieren" _, _ "Löschen" _, _ "Umbenennen" _ usw. hinzufügen. BTW beim Hinzufügen eines *. Ein neues benutzerdefiniertes Element * für das Kontextmenü ist sehr einfach, da Sie nur den Zeichenwert `Icon` in einem Schlüssel wie` HKEY_CLASSES_ROOT \ * \ shell \ MYCUSTOMITEM` hinzufügen müssen (und der Wert des `Icon` wäre wie zB '% SystemRoot% \ System32 \ shell32.dll, -133` oder sg. else). ** ABER das Hinzufügen des `Icon`-Zeichenfolgenwerts zu einem anderen Kontextmenü _handlers_ funktioniert nicht ** wie beim Hinzufügen zu diesen benutzerdefinierten Elementen. Sk8erPeter vor 8 Jahren 1
Hier ist ein weiterer Screenshot, um es deutlich zu machen (der interessante Teil ist in roten Grenzen): http://i.imgur.com/fmewg6L.png. Wie Sie sehen, habe ich einige benutzerdefinierte Elemente im Kontextmenü mit benutzerdefinierten Symbolen (wie _ "Öffnen mit Notepad ++" _) - genau das möchten wir mit den vorhandenen Systemkontextmenüelementen erreichen! Sk8erPeter vor 8 Jahren 0
Richtig, also gibt es momentan kein Symbol für diese Elemente, richtig? Wir sind also nicht sicher, ob sie dieses bestimmte Attribut bearbeiten müssen. Möglicherweise muss es erstellt werden? Raystafarian vor 8 Jahren 0
@ Raystafarian: Was ist dein Punkt? Ja, es gibt kein Symbol für diese Elemente, da wir es bereits erklärt haben und ich sogar einen Screenshot davon gepostet habe (und ElektroStudios fügte es freundlicherweise in seine Frage ein, um es klarer zu machen), und genau das möchten wir ändern ... Sk8erPeter vor 8 Jahren 0
@ Sk8erPeter Mein Punkt war: Es gibt kein leeres Pixel oder Platzhalter für ein Symbol. Ich habe das gerade überprüft. Raystafarian vor 8 Jahren 0
@ Sk8erPeter Mein bester Vorsprung im Moment ist die Erstellung eines Shell-Kontextmenü-Handlers, der [`SetMenuItemInfo`] (https://msdn.microsoft.com/de-de/library/windows/desktop/ms648001) verwendet (v = vs.85) .aspx) als Antwort auf [`QueryContextMenu`] (https://msdn.microsoft.com/de-de/library/windows/desktop/bb776097 (v = vs.85) .aspx). Ben N vor 8 Jahren 1
@ Benen: Wenn Sie Zeit hätten, würde ich mich über einen Beispielcode freuen. :) Danke im Voraus. Sk8erPeter vor 8 Jahren 0
@ElektroStudios Hier haben einige Beispiele für das, worauf Ben sich bezogen hat, um über die anwendbare Logik zu schauen, möglicherweise [Kontextmenü-Beispiele] (https://code.msdn.microsoft.com/windowsapps/Context-menu-sample-40840351). Dies hat auch einige Verweise auf die `Windows.UI.Popups`-API und korrelierte Klassen usw. Dies scheint etwas extrem zu sein, nur um ein Symbol zu einem der Standard-Kontextmenüoptionen hinzuzufügen, aber ich habe versucht, mit Process Monitor usw. nachzufahren Wenn Sie mit der rechten Maustaste klicken und verschiedene Registrierungsschlüsselpfade, -stapel usw. betrachten, hatte ich nicht viel Glück mit der geringen Zeit, die ich für die Aufgabe aufgewendet hatte. Pimp Juice IT vor 8 Jahren 0
@ElektroStudios Auch für Zeichenfolgenwerte von Registrierungsschlüsseln usw., die möglicherweise von Interesse sind, und möglicherweise auch einen Dateinamen für das, was ich beim Tracing gesehen habe, aber ich konnte die Teile hier nicht zusammenstellen, ist eine Liste der für den Fall, dass Sie hilfreich sind irgendein. . . "Shell Copy Hook", "Disk Copy Extension", "Copy as Path Menu", "CTXMENU_NOVERBS", "Shell DRM Copy Object" und auch "diskcopy.dll". . . Ich hatte nicht mehr viel Zeit, um weiterzugehen, aber das ist mein Stich. Ich war mir nicht sicher, ob das Hinzufügen des Schlüssels `\ Settings 'und der anwendbaren Werte zu einem Standardspeicherort der Registrierung den Trick erfüllen würde. Das war es, was ich zu testen hoffte. Pimp Juice IT vor 8 Jahren 0
@ Sk8erPeter Ich füge die Teile mehr oder weniger zu etwas zusammen, das für mich funktioniert. Siehe meine Antwort :) Ben N vor 8 Jahren 0
ElektroStudios: Sie können [Ben Ns Antwort] (http://superuser.com/a/1021873/62130) akzeptieren, es löst das Problem wirklich! :) Danke, Ben, du hast wirklich die Prämie verdient! Und @LMFAO_A_JOKE, danke auch für deine Bemühungen! Sk8erPeter vor 8 Jahren 0
@ Sk8erPeter und an alle, die daran interessiert sein könnten: Meine Antwort lautet jetzt [ein GitHub-Projekt] (https://github.com/Fleex255/ContextIcons). Ich habe auch meine Antwort mit Links und zusätzlichen technischen Details aktualisiert. Ben N vor 8 Jahren 0
@BenN: großartig, noch besser, danke! :) Sk8erPeter vor 8 Jahren 0

2 Antworten auf die Frage

9
Ben N

Hinweis zur Mitgliedschaft: Ich bin der Autor der in dieser Antwort genannten Software.

Zunächst einmal werde ich wissen, 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 und sucht nach interessanten Einträgen. Wenn es einen findet, klebt es ein Symbol (das zuvor geladen worden sein muss). Im Moment wird nach Kopieren, Ausschneiden, Löschen, Einfügen, Wiederholen, Senden an und Rückgängig gesucht . Sie können Ihren eigenen Code hinzufügen, indem Sie den Code ändern. Die Vorgehensweise dazu ist unten beschrieben. (Sorry, ich bin in C ++ nicht gut genug, um es konfigurierbar zu machen.)

Ein Screenshot davon in Aktion mit den hässlichsten Icons, die man kennt:

in Aktion

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 die Art der Dinge beachtet, die es zum Schlagen der vorhandenen Einträge tun muss. Ich gebe Ihnen mein Wort, dass es Ihrem Computer keinen absichtlichen Schaden zufügt. Wenn Sie misstrauisch sind und / oder es ändern oder 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 es offensichtlich, wer was macht.) Diese Bilder sollten wahrscheinlich 16 mal 16 Pixel groß sein (oder wie groß Ihre DPI-Einstellungen den Menürand bilden), aber ich habe auch mit größeren Bildern Erfolg gehabt. Wenn Sie möchten, dass die Symbole transparent aussehen, müssen Sie nur deren Hintergrundfarbe wie das Kontextmenü festlegen. (Dieser Trick wird auch von Dropbox angewendet.) Ich habe mit MS Paint meine schrecklichen Icons gemacht; andere Programme können auf eine kompatible Weise speichern LoadImageA. 16 x 16 bei 24 Bit Farbtiefe bei 96 Pixel pro Zoll scheint der zuverlässigste Satz von Bildeigenschaften zu sein.

Legen Sie die DLL an einem für alle Benutzer zugänglichen Ort ab. Der Ordner, den Sie gerade erstellt haben, ist eine gute Wahl. Öffnen Sie eine Admin-Eingabeaufforderung in dem Ordner, der die DLL enthält regsvr32 ContextIcons.dll. Dies schafft Registrierungsinformationen für den Shell - Typen *, Drive, Directory, und Directory\Background. Wenn Sie die Shell-Erweiterung jemals entfernen möchten, tun Sie dies regsvr32 /u ContextIcons.dll.

Relevanter Code

Grundsätzlich fragt die Erweiterung nur den Text jedes Kontextmenüelements mit ab GetMenuItemInfound passt gegebenenfalls das Symbol mit an SetMenuItemInfo.

Visual Studio generiert eine Menge magischen, geheimnisvollen Code für ATL-Projekte. Dies ist jedoch der Inhalt von IconInjector.cpp, der den Kontextmenü-Handler implementiert:

// IconInjector.cpp : Implementation of CIconInjector  #include "stdafx.h" #include "IconInjector.h" #include <string>  // CIconInjector  HBITMAP bmpCopy = NULL; HBITMAP bmpCut = NULL; HBITMAP bmpUndo = NULL; HBITMAP bmpRedo = NULL; HBITMAP bmpSendto = NULL; HBITMAP bmpDel = NULL; HBITMAP bmpPaste = NULL; STDMETHODIMP CIconInjector::Initialize(LPCITEMIDLIST pidlFolder, LPDATAOBJECT pDataObj, HKEY hProgID) { // Load the images bmpCopy = (HBITMAP)LoadImageA(NULL, "C:\\shellicon\\copy.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_DEFAULTSIZE); bmpCut = (HBITMAP)LoadImageA(NULL, "C:\\shellicon\\cut.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_DEFAULTSIZE); bmpUndo = (HBITMAP)LoadImageA(NULL, "C:\\shellicon\\undo.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_DEFAULTSIZE); bmpRedo = (HBITMAP)LoadImageA(NULL, "C:\\shellicon\\redo.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_DEFAULTSIZE); bmpSendto = (HBITMAP)LoadImageA(NULL, "C:\\shellicon\\sendto.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_DEFAULTSIZE); bmpDel = (HBITMAP)LoadImageA(NULL, "C:\\shellicon\\delete.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_DEFAULTSIZE); bmpPaste = (HBITMAP)LoadImageA(NULL, "C:\\shellicon\\paste.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_DEFAULTSIZE); int err = GetLastError(); return S_OK; } STDMETHODIMP CIconInjector::QueryContextMenu(HMENU hmenu, UINT uMenuIndex, UINT uidFirst, UINT uidLast, UINT flags) { using namespace std; if (flags & CMF_DEFAULTONLY) return S_OK; // Don't do anything if it's just a double-click int itemsCount = GetMenuItemCount(hmenu); for (int i = 0; i < itemsCount; i++) { // Iterate over the menu items MENUITEMINFO mii; ZeroMemory(&mii, sizeof(mii)); mii.cbSize = sizeof(mii); mii.fMask = MIIM_FTYPE | MIIM_STRING; mii.dwTypeData = NULL; BOOL ok = GetMenuItemInfo(hmenu, i, TRUE, &mii); // Get the string length if (mii.fType != MFT_STRING) continue; UINT size = (mii.cch + 1) * 2; // Allocate enough space LPWSTR menuTitle = (LPWSTR)malloc(size); mii.cch = size; mii.fMask = MIIM_TYPE; mii.dwTypeData = menuTitle; ok = GetMenuItemInfo(hmenu, i, TRUE, &mii); // Get the actual string data mii.fMask = MIIM_BITMAP; bool chIcon = true; if (wcscmp(menuTitle, L"&Copy") == 0) { mii.hbmpItem = bmpCopy; } else if (wcscmp(menuTitle, L"Cu&t") == 0) { mii.hbmpItem = bmpCut; } else if (wcscmp(menuTitle, L"&Paste") == 0) { mii.hbmpItem = bmpPaste; }  else if (wcscmp(menuTitle, L"Se&nd to") == 0) { mii.hbmpItem = bmpSendto; } else if (wcsstr(menuTitle, L"&Undo") != NULL) { mii.hbmpItem = bmpUndo; } else if (wcsstr(menuTitle, L"&Redo") != NULL) { mii.hbmpItem = bmpRedo; } else if (wcscmp(menuTitle, L"&Delete") == 0) { mii.hbmpItem = bmpDel; } else { chIcon = false; } if (chIcon) SetMenuItemInfo(hmenu, i, TRUE, &mii); free(menuTitle); } return MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_NULL, 0); // Same as S_OK (= 0) but is The Right Thing To Do [TM] } STDMETHODIMP CIconInjector::InvokeCommand(LPCMINVOKECOMMANDINFO info) { return S_OK; } STDMETHODIMP CIconInjector::GetCommandString(UINT_PTR, UINT, UINT*, LPSTR, UINT) { return S_OK; } 

Beachten Sie, dass die HBITMAPs niemals bereinigt werden. Dies ist jedoch nicht so wichtig, da die DLL-Dateien beim Schließen des Explorers verschwinden. Die Icons nehmen sowieso kaum Speicher in Anspruch.

Wenn Sie für 32-Bit kompilieren, ist der erste Parameter GetCommandStringnur a UINTstatt a UINT_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, mii.hBmpItemum HBMMENU_SYSTEMin und legte den Griff in die Fenster mii.dwItemData, wie im unteren Teil der beschriebenen auf dem MSDN - ArtikelMENUITEMINFO . Ich konnte nicht herausfinden, wie man Fenster aus Shell-Erweiterungen erstellt. LR_LOADTRANSPARENTSieht vielversprechend aus LoadImageA, aber es hat seine eigenen Fallstricke. Insbesondere funktioniert es nicht, wenn Sie 256-Bit-Bitmaps verwenden.

Wenn beim Laden von Bildern Probleme auftreten, entfernen Sie die LR_DEFAULTSIZEMarkierung von den LoadImageAAufrufen.

Jemand, der über ausreichende Kenntnisse in C ++ verfügt, könnte wahrscheinlich Ressourcen aus anderen DLLs holen und in HBITMAPs konvertieren, aber das ist nicht jemand.

Ä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 nach der Installation der C ++ - Tools in Visual Studio 2015. In IconInjector.cpp, können Sie hinzufügen HBITMAPEinträge nach oben und LoadImageAruft in Initializeneue Symbole hinzuzufügen. else ifVerwenden Sie unten in diesem Abschnitt einen wcscmpAnruf, um nach einer genauen Übereinstimmung wcsstrzu suchen, oder einen Anruf, um nach dem Vorhandensein eines Teilstrings zu suchen. In beiden Fällen &repräsentiert das die Position der Unterstreichung / des Beschleunigers bei Verwendung von Umschalttaste + F10. Stellen Sie den Modus auf Release und Ihre Architektur auf x64 ein, und führen Sie BuildBuild Solution aus . Sie erhalten eine Fehlermeldung, dass die Ausgabe nicht registriert wird. Machen Sie sich jedoch keine Sorgen. Sie möchten dies sowieso manuell tun. Beenden Sie den Explorer, kopieren Sie die neue DLL ( \x64\Release\ContextIcons.dllim Lösungsordner) an den Ort und führen Sie dann den regsvr32Tanz aus.

Namensnennungen

Vielen Dank an die MSDN-Autoren und an den Ersteller von " The Complete Idiots Guide to Writing Shell Extensions ", auf den ich ausführlich Bezug genommen habe.

Lobrede

Zu den vielen Explorer-Instanzen, die bei der Produktion dieser Shell-Erweiterung getötet wurden: Sie starben für einen guten Grund, dass einige Personen im Internet neben ihren Wörtern Symbole haben können.

Beeindruckend! Ich schätze Ihre Bemühungen wirklich sehr, vielen Dank! (+1) Ich habe mein Bestes gegeben, aber die kompilierte Version konnte unter Windows 10 (Build 10240) nicht funktionieren. Ich weiß nicht, was das Problem ist, alle BMP-Bilder befinden sich im richtigen Pfad (`C: \ shellicon \ copy.bmp` usw. - das sind 20 x 20 Pixel-Icons im BMP-Format) und ich habe die DLL als registriert admin in der Eingabeaufforderung mit `regsvr32 ContextIcons.dll` wurde erfolgreich ausgeführt, aber im Kontextmenü werden keine Änderungen angezeigt. Ich habe sogar den Computer neu gestartet, die Registrierung der DLL rückgängig gemacht und erneut registriert, jedoch keine Änderungen. Ich versuche die Quelle in VS2015 zu kompilieren! Sk8erPeter vor 8 Jahren 0
@ Sk8erPeter MSDN sagte, dass die Icons 16x16 sein müssen, aber 20x20 funktioniert für mich. Möglicherweise erfordert Windows 10 16x16? Beachten Sie, dass Sie den Explorer neu starten müssen, damit die Änderungen wirksam werden. Ben N vor 8 Jahren 0
Ich habe gerade das gleiche mit 16x16 BMP-Images versucht (nachdem die Registrierung der DLL wieder aufgehoben und erneut registriert wurde), und leider gibt es immer noch keine Änderung. Sk8erPeter vor 8 Jahren 0
@ Sk8erPeter Hast du einen Windows 8-Rechner, um es anprobieren zu können? Ich arbeite daran, einen Windows 10-Computer für das Debugging bereitzustellen. Vergewissern Sie sich außerdem, dass unter "HKCR \ * \ shellex \ ContextMenuHandlers" ein Eintrag "IconInjector" angezeigt wird. Überprüfen Sie schließlich Ihre Antivirus-Protokolle. Es mag ein wenig verdächtig sein, dass die Shell-Erweiterung nicht signiert ist. Versuchen Sie schließlich, einen Zeichenfolgeneintrag zu "HKLM \ Software \ Microsoft \ Windows \ CurrentVersion \ Shell Extensions \ Approved" hinzuzufügen, dessen Name `ist. (In Win10 ist möglicherweise eine Richtlinie aktiviert, für die auch eine Registrierung erforderlich ist.) Ben N vor 8 Jahren 0
Ja, natürlich habe ich die neuen Registry-Einträge überprüft und sie existieren! Ich habe auch den neuen String-Eintrag unter der Taste "Approved" hinzugefügt. Immer noch keine Änderung (danach auch unregistriert und erneut registriert). Leider habe ich derzeit keinen Windows 8-Rechner, aber ich werde versuchen, einen zu bekommen. Sk8erPeter vor 8 Jahren 0
Wie auch immer, ich gebe dir die Prämie! :) Ich kann nicht alle anderen Umstände vor Mitternacht testen, wenn es abläuft, und ich glaube, dass es wirklich für Sie funktioniert hat. Wenn Sie eine Chance haben, würde ich mich freuen, wenn Sie es auch unter Windows 10 testen könnten. :) Vielen Dank! Sk8erPeter vor 8 Jahren 0
Übrigens, konnten Sie Ihre BMP-Dateien nicht auch in Dropbox hochladen? :) Nur aus Neugierde möchte ich es mit den Bildern testen, die in Ihrem Kontextmenü sichtbar waren (obwohl ich nicht glaube, dass die Bilder die Ursache des Problems sind, aber wer weiß ...). Es wäre sehr schön, wenn Sie den Quellcode in GitHub / Bitbucket hochladen könnten. :) Sk8erPeter vor 8 Jahren 0
@ Sk8erPeter Sicherlich [hier geht's] (https://dl.dropboxusercontent.com/u/3771470/shellicon.zip). Ich werde sehen, wie der Code in GitHub eingefügt wird. Jetzt wird Windows 10 heruntergeladen ... Ben N vor 8 Jahren 2
Sie werden es nicht glauben ... ES FUNKTIONIERT mit Ihren Bildern! : D: D Dies bedeutet, dass ich einige BMP-Dateien habe, mit denen Windows nicht umgehen konnte. Ich weiß nicht warum (später überprüfe ich das auch). Wie auch immer, vielen Dank, Ihr Code löst das Problem wirklich! :) Sk8erPeter vor 8 Jahren 2
@BenN Ziemlich der Job hier !! Große Anstrengungen Mann, gute Arbeit !! +1 von mir Pimp Juice IT vor 8 Jahren 0
@Ben NA Programmiersprache Antwort ist nicht die Lösungserwartungen, die ich habe, sowieso bin ich ein .Net-Typ, so dass ich den nicht verwalteten Code in verwalteten Code in Vb.Net übersetzen konnte. Daher bin ich mit Ihrer Antwort sehr dankbar, DANKE, auch Vielleicht wird beim Debuggen des ** hbmpItem ** - Anwendungsfelds auf Änderungen in der Registry geprüft. An diesem Punkt könnten wir einen einfachen Weg finden, dies über Registrierungsänderungen zu tun, um zu vermeiden, dass eine Anwendung im Hintergrund ausgeführt wird. Ich habe trotzdem nicht untersucht, was im Registrierung an dieser Stelle, aber wenn jemand möchte, empfehle ich das Programm ** X-RegShot v2.0 **. ElektroStudios vor 8 Jahren 0
@BenN: Weißt du nicht, ob sogar ein Ressourcensymbol verwendet werden kann (z. B. die Symbole von `shell32.dll` oder eine Exe) oder nicht? Ich habe nur Wege gefunden, BMPs (`HBITMAP` s) zu laden, da dies von `MENUITEMINFO` (` hbmpItem`) benötigt wird und `HICON`-Instanzen nicht akzeptiert werden. Gibt es eine andere Methode dafür oder müssen wir die Tatsache akzeptieren, dass dies nur mit BMPs funktioniert? Wenn ich zum Beispiel ein Symbol neben dem Menüpunkt "Befehlsfenster hier öffnen" anzeigen möchte, muss ich nur "HKEY_CLASSES_ROOT \ Directory \ Background \ shell \ cmd" bearbeiten. Fügen Sie hier einen String-Wert namens "Icon" mit dem Wert ein `cmd.exe, 0`. Sk8erPeter vor 8 Jahren 0
@ Sk8erPeter Ich glaube, dass das Laden von DLL-Ressourcen funktioniert, weil der Explorer den vom Benutzer gezeichneten Eintrag erstellt. Leider sehe ich keine Möglichkeit, das Explorer * -Fenster * von einer Shell-Erweiterung auszugeben (das Eigentümerzeichnen wird mit einer Fenstermeldung eingeleitet). Es scheint, dass das Feld "hBmpItem" nur "HBITMAP`s" benötigt. Ben N vor 8 Jahren 0
@ElektroStudios Die Icon-Injection dieses Programms nimmt weder direkt noch indirekt Änderungen an der Registrierung vor. Dies geschieht zur Laufzeit. Es scheint keine Registrierungseinstellung zu geben, die das Symbol für diese Einträge steuert. Da ich sowohl die Quelle als auch eine kompilierte Version zur Verfügung gestellt habe, denke ich, dass das Übersetzen in eine andere Sprache / Runtime keinen großen Zweck hat. Außerdem ist es [in der Regel nicht ratsam] (https://blogs.msdn.microsoft.com/oldnewthing/20130222-01/?p=5163), Shell-Erweiterungen in .NET zu schreiben. Schließlich läuft die DLL nicht so sehr im Hintergrund, sondern wird Teil des Explorers - fast kein Performance-Hit. Ben N vor 8 Jahren 0
@BenN: OK, danke! :) Es wäre etwas bequemer gewesen. BTW in der Zwischenzeit habe ich festgestellt, dass ich, wenn ich meine zuvor nicht funktionierenden Bilder im _legendary_ Paint öffne, eine 24-Bit-Bitmap (.bmp; .dip) "Speichern unter" ("Speichern unter"> "") (also in einer BMP-Datei speichern) wieder), und ich benutze diese neue Datei als Quellbild, es funktioniert. Die Größe der Bitmap muss natürlich genau 16 x 16 Pixel betragen. Paint erstellt also das erwartete Bitmap-Format mit 24 Bit pro Pixel (16,7 Millionen Farben), 96 x 96 DPI und 16 x 16 Pixel. Zuvor habe ich .png-Dateien in IrfanView in .bmp-Dateien konvertiert und deren Größe geändert. Diese Symbole funktionierten nicht. Sk8erPeter vor 8 Jahren 1
Vielleicht können Sie dies in dem Beitrag erwähnen, um damit verbundene Probleme und Fragen zu vermeiden, und es kann eine wichtige Information sein, welche Art von Bildern akzeptiert werden. :) Sk8erPeter vor 8 Jahren 0
1
nijave

Ich habe nicht genug Vertreter, um einen Kommentar zu hinterlassen, aber es scheint, dass diese Informationen in der shell32.dll enthalten sind. Da die Dateien kompiliert wurden, ist es schwer zu erkennen, welche Funktionen darin enthalten sind, aber es scheint die eine zu sein.

Von Interesse (Registry-Export):

HKEY_CLASSES_ROOT \ CLSID

(Standard) REG_SZ Objekt kopieren / verschieben / umbenennen / löschen / verknüpfen

AppID REG_SZ

LocalizedString REG_EXPAND_SZ @% SystemRoot% \ system32 \ shell32.dll, -50176

Unter dem Schlüssel InProcServer32 referenziert es shell32.dll. Es gibt auch einige andere mit relevanten klingenden Namen. Möglicherweise ist auch windows.storage.dll interessant

Interessante Information. Es scheint jedoch eher ein Kommentar als eine Antwort zu sein. Du hast jetzt genug Repräsentanten, um überall zu kommentieren :) Ben N vor 8 Jahren 1