В Windows 8 / 8.1 x64 я хотел бы назначить пользовательский значок для элементов контекстного меню Windows по умолчанию, таких как элементы « Копировать» , « Вырезать» , « Вставить» , « Удалить» , « Отменить» , « Повторить» и « Отправить» , которые по умолчанию имеют любой значок:
Где я могу найти «ссылку» на эти пункты контекстного меню в реестре, а затем добавить для них значение реестра «значок»?
Или, другими словами, как назначить значок в меню расширения оболочки, например, SendTo shellex ?.
Исследование
Как прокомментировал @ Sk8erPeter , кажется, что:
«Добавление
Icon
строкового значения в разные обработчики контекстного меню работает не так, как при добавлении его в пользовательский элемент, например, напримерHKEY_CLASSES_ROOT\*\shell\MYCUSTOMKEY
»
источник
Icon
строковое значение в ключ, напримерHKEY_CLASSES_ROOT\*\shell\MYCUSTOMITEM
(и значениеIcon
будет, например, например,%SystemRoot%\System32\shell32.dll,-133
или sg. else). НО добавлениеIcon
строкового значения в разные обработчики контекстного меню не работает, как при добавлении его к этим пользовательским элементам.SetMenuItemInfo
в ответQueryContextMenu
.Ответы:
Уведомление о присоединении: я являюсь автором программного обеспечения, упомянутого в этом ответе.
Прежде всего, я хочу, чтобы вы знали, что я изучил C ++ и Win32 только для этого вопроса .
Я разработал 64-битное расширение оболочки, которое регистрируется как обработчик контекстного меню. Когда он вызывается, он копается в существующих пунктах меню в поисках интересных записей. Если он находит его, он прикрепляет значок (который должен быть загружен ранее). На данный момент он ищет Копировать , Вырезать , Удалить , Вставить , Повторить , Отправить и Отменить . Вы можете добавить свой собственный, изменив код; процедура для этого описана ниже. (Извините, я недостаточно хорош в C ++, чтобы настраивать его.)
Скриншот этого в действии, с самыми уродливыми иконами, известными человеку:
Вы можете скачать эти иконки, если вы действительно хотите.
Настройка его
Загрузите его (из моего Dropbox). Примечание : этот файл обнаруживается одним сканером VirusTotal как разновидность вредоносного ПО. Это понятно, учитывая то, что нужно сделать, чтобы ударить существующие записи. Я даю вам слово, что это не наносит преднамеренного вреда вашему компьютеру. Если вы подозрительны и / или хотите изменить и расширить его, посмотрите код на GitHub !
Создайте папку в диске С:
C:\shellicon
. Создание BMP файлов со следующими названиями:copy
,cut
,delete
,paste
,redo
,sendto
,undo
. (Надеюсь, очевидно, кто из них что делает.) Эти изображения, вероятно, должны быть 16 на 16 пикселей (или какими бы большими ни были ваши настройки DPI, чтобы заполнить меню), но я также добился успеха с большими. Если вы хотите, чтобы значки выглядели прозрачными, вы должны просто сделать их фон того же цвета, что и контекстное меню. (Этот прием также используется в Dropbox.) Я сделал свои ужасные иконки с помощью MS Paint; другие программы могут сохранять, а могут и не сохранять, способом, совместимым сLoadImageA
. 16 на 16 с глубиной цвета 24 бита при 96 пикселях на дюйм, кажется, наиболее надежный набор свойств изображения.Поместите DLL где-нибудь доступным для всех пользователей, эта папка, которую вы только что создали, является хорошим выбором. Откройте приглашение администратора в папке, содержащей DLL и сделайте
regsvr32 ContextIcons.dll
. Это создает регистрационную информацию для типов оболочек*
,Drive
,Directory
иDirectory\Background
. Если вы хотите удалить расширение оболочки, сделайтеregsvr32 /u ContextIcons.dll
.Соответствующий код
По сути, расширение просто запрашивает текст каждого элемента контекстного меню с помощью
GetMenuItemInfo
и, при необходимости, корректирует значок с помощьюSetMenuItemInfo
.Visual Studio генерирует много магического загадочного кода для проектов ATL, но это содержимое
IconInjector.cpp
, которое реализует обработчик контекстного меню:Обратите внимание, что
HBITMAP
s никогда не очищаются, но это не имеет большого значения, учитывая, что содержимое DLL исчезнет, когда Explorer отключится. Значки в любом случае едва занимают память.Если вы компилируете для 32-битной версии, первым параметром
GetCommandString
будет просто aUINT
вместо aUINT_PTR
.Если вы действительно хотите , прозрачные иконки, вам придется создать окно с нужной иконке , а затем установить
mii.hBmpItem
наHBMMENU_SYSTEM
и поставить ручку окна вmii.dwItemData
, как описано в нижней части статьи MSDN поMENUITEMINFO
. Я не смог понять, как создавать окна из расширений оболочки.LR_LOADTRANSPARENT
выглядит многообещающе, как флагLoadImageA
, но у него есть свои подводные камни - в частности, не работает, если вы не используете 256-цветные растровые изображения.Если у вас возникли проблемы с загрузкой изображений, попробуйте убрать
LR_DEFAULTSIZE
флажок изLoadImageA
вызовов.Кто-то достаточно опытный в C ++ мог бы, вероятно, извлечь ресурсы из других DLL и преобразовать их в
HBITMAP
s, но это кто-то не я.Модифицируя это
Я написал это в Visual Studio, который я считаю лучшим редактором для Windows C ++.
Загрузите файл SLN в Visual Studio 2015 после установки инструментов C ++. В
IconInjector.cpp
, вы можете добавитьHBITMAP
записи вверху иLoadImageA
звонить,Initialize
чтобы добавить новые значки. Внизу вelse if
разделе используйтеwcscmp
вызов для поиска точного соответствия илиwcsstr
вызов для поиска наличия подстроки. В обоих случаях&
позиция представляет подчеркивание / ускоритель при использовании Shift + F10. Установите режим Release и свою архитектуру x64 и выполните Build → Build Solution . Вы получите сообщение об ошибке при регистрации выхода, но не волнуйтесь; Вы бы все равно хотели сделать это вручную. Завершите работу проводника, скопируйте новую DLL-библиотеку (\x64\Release\ContextIcons.dll
в папке решения) на место и выполнитеregsvr32
танец.Атрибуции
Большое спасибо авторам MSDN и создателю « Полного идиотского руководства по написанию расширений оболочки », на которое я много ссылался.
панегирик
Для многих экземпляров Explorer, которые были убиты при производстве этого расширения оболочки: вы умерли по великой причине, что некоторые люди в Интернете могут иметь значки рядом со своими словами.
источник
C:\shellicon\copy.bmp
и т. Д. - это значки размером 20x20 пикселей в формате BMP), и я зарегистрировал dll в качестве администратора в командной строке, сregsvr32 ContextIcons.dll
которой работал успешно, но Я не вижу изменений в контекстном меню. Я даже перезагружал компьютер, незарегистрирован и снова регистрировал dll, но без изменений. Я пытаюсь скомпилировать источник в VS2015!У меня недостаточно репутации, чтобы оставить комментарий, но, похоже, эта информация содержится внутри shell32.dll. Файлы были скомпилированы, поэтому трудно понять, какие в них функции, но, похоже, это одна из них.
Представляет интерес (экспорт реестра):
HKEY_CLASSES_ROOT \ CLSID {3ad05575-8857-4850-9277-11b85bdb8e09}
(По умолчанию) REG_SZ Копировать / Переместить / Переименовать / Удалить / Связать объект
AppID REG_SZ {3ad05575-8857-4850-9277-11b85bdb8e09}
LocalizedString REG_EXPAND_SZ @% SystemRoot% \ system32 \ shell32.dll, -50176
Под ключом InProcServer32 он ссылается на shell32.dll. Есть еще пара с соответствующими звучащими именами. Возможно также интерес представляет windows.storage.dll
источник