No Windows 8 / 8.1 x64, gostaria de atribuir um ícone personalizado aos itens de menu de contexto padrão do Windows, como Copiar , Recortar , Colar , Excluir , Desfazer , Refazer e Enviar para itens, que por padrão possuem qualquer ícone:
Onde posso localizar a "referência" para esses itens do menu de contexto no registro e adicionar um valor de registro "ícone" para eles?
Ou, em outras palavras, como atribuir um ícone a um menu de extensão de shell como o SendTo shellex ?.
Pesquisa
Como comentado por @ Sk8erPeter , parece que:
"Adicionar o
Icon
valor da string a diferentes manipuladores do menu de contexto não funciona como ao adicioná-lo a um item personalizado, como por exemploHKEY_CLASSES_ROOT\*\shell\MYCUSTOMKEY
"
windows-8
context-menu
shell-extensions
ElektroStudios
fonte
fonte
Icon
valor da string em uma chave comoHKEY_CLASSES_ROOT\*\shell\MYCUSTOMITEM
(e o valor daIcon
seria como eg%SystemRoot%\System32\shell32.dll,-133
ou sg. else). MAS adicionar oIcon
valor da string a diferentes manipuladores de menu de contexto não funciona como ao adicioná-lo a esses itens personalizados.SetMenuItemInfo
em resposta aQueryContextMenu
.Respostas:
Aviso de afiliação: sou o autor do software mencionado nesta resposta.
Primeiro, você saberá que aprendi C ++ e Win32 apenas para esta pergunta .
Eu desenvolvi uma extensão de shell de 64 bits que é registrada como um manipulador de menu de contexto. Quando invocado, ele vasculha os itens de menu existentes, procurando entradas interessantes. Se encontrar um, ele colará um ícone nele (que deve ter sido carregado anteriormente). No momento, ele procura Copiar , Recortar , Excluir , Colar , Refazer , Enviar para e Desfazer . Você pode adicionar seu próprio modificando o código; o procedimento para isso é descrito abaixo. (Desculpe, eu não sou bom o suficiente em C ++ para torná-lo configurável.)
Uma captura de tela em ação, com os ícones mais feios conhecidos pelo homem:
Você pode baixar esses ícones, se realmente quiser.
Configurando
Faça o download (do meu Dropbox). Aviso : este arquivo é detectado por um scanner VirusTotal como sendo algum tipo de malware. Isso é compreensível, dado o tipo de coisa que é necessário fazer para destruir as entradas existentes. Confio na minha palavra de que isso não causa danos intencionais ao seu computador. Se você suspeita e / ou deseja modificá-lo e ampliá-lo, consulte o código no GitHub !
Crie uma pasta na sua unidade C:
C:\shellicon
. Criar arquivos BMP com os seguintes títulos:copy
,cut
,delete
,paste
,redo
,sendto
,undo
. (Espero que seja óbvio qual deles faz qual coisa.) Essas imagens provavelmente devem ter 16 por 16 pixels (ou quão grandes as configurações de DPI fazem a margem do menu), mas também tive sucesso com as maiores. Se você deseja que os ícones pareçam transparentes, basta fazer o plano de fundo da mesma cor do menu de contexto. (Esse truque também é empregado pelo Dropbox.) Fiz meus terríveis ícones com o MS Paint; outros programas podem ou não ser salvos de maneira compatível comLoadImageA
. 16 por 16, com profundidade de cor de 24 bits e 96 pixels por polegada, parece ser o conjunto mais confiável de propriedades da imagem.Coloque a DLL em algum lugar acessível a todos os usuários; essa pasta que você acabou de criar é uma boa escolha. Abra um prompt de administrador na pasta que contém a DLL e faça
regsvr32 ContextIcons.dll
. Isso cria informações de registro para os tipos de shell*
,Drive
,Directory
, eDirectory\Background
. Se você quiser remover a extensão do shell, façaregsvr32 /u ContextIcons.dll
.Código relevante
Basicamente, a extensão consulta apenas o texto de cada item de menu de contexto com
GetMenuItemInfo
e, se apropriado, ajusta o ícone comSetMenuItemInfo
.O Visual Studio gera muitos códigos misteriosos mágicos para projetos ATL, mas esse é o conteúdo de
IconInjector.cpp
, que implementa o manipulador de menu de contexto:Observe que os
HBITMAP
s nunca são limpos, mas isso não importa muito, pois o material da DLL desaparece quando o Explorer é encerrado. Os ícones mal tiram qualquer memória de qualquer maneira.Se você está compilando para 32 bits, o primeiro parâmetro para
GetCommandString
é apenas um emUINT
vez de umUINT_PTR
.Se você realmente quer ícones transparentes, você terá que criar uma janela com o ícone desejado e, em seguida, definir
mii.hBmpItem
aHBMMENU_SYSTEM
e colocou a alça para a janelamii.dwItemData
, como descrito na parte inferior do artigo do MSDN sobreMENUITEMINFO
. Não consegui descobrir como criar janelas a partir de extensões de shell.LR_LOADTRANSPARENT
parece promissor como bandeiraLoadImageA
, mas tem suas próprias armadilhas - especificamente, não funciona, a menos que você use bitmaps de 256 cores.Se você tiver problemas com o carregamento de imagens, tente remover o
LR_DEFAULTSIZE
sinalizador dasLoadImageA
chamadas.Alguém com experiência em C ++ provavelmente poderia pegar recursos de outras DLLs e convertê-los em
HBITMAP
s, mas esse alguém não sou eu.Modificando-o
Eu escrevi isso no Visual Studio, que acredito ser o melhor editor para Windows C ++.
Carregue o arquivo SLN no Visual Studio 2015 depois de instalar as ferramentas C ++. Em
IconInjector.cpp
, você pode adicionarHBITMAP
entradas na parte superior e fazerLoadImageA
chamadasInitialize
para adicionar novos ícones. Naelse if
seção, use umawcscmp
chamada para procurar uma correspondência exata ou umawcsstr
chamada para procurar a presença de uma subsequência. Nos dois casos, o&
representa a posição do sublinhado / acelerador ao usar Shift + F10. Defina seu modo como Release e sua arquitetura como x64 e faça Build → Build Solution . Você receberá um erro ao não registrar a saída, mas não se preocupe; você faria isso manualmente de qualquer maneira. End Explorer, copie a nova DLL (\x64\Release\ContextIcons.dll
na pasta da solução) para o local e faça oregsvr32
dança.Atribuições
Muito obrigado aos escritores do MSDN e ao criador do " Guia Completo para Idiotas de Criação de Extensões de Shell ", ao qual me referi bastante.
Elogio
Nas várias instâncias do Explorer que foram mortas na produção dessa extensão de shell: você morreu por uma grande causa, que algumas pessoas na Internet podem ter ícones ao lado de suas palavras.
fonte
C:\shellicon\copy.bmp
, etc. - são ícones de 20x20 pixels no formato BMP) e registrei a dll como um administrador no prompt de comando com oregsvr32 ContextIcons.dll
qual foi executado com êxito, mas Não vejo alterações no menu de contexto. Até reiniciei o computador, não registrei e registrei novamente a dll novamente, mas nenhuma alteração. Estou tentando compilar a fonte no VS2015!Eu não tenho representante suficiente para deixar um comentário, mas parece que esta informação está contida no shell32.dll. Como os arquivos foram compilados, é difícil ver quais funções estão nele, mas parece ser essa.
De interesse (exportação de registro):
HKEY_CLASSES_ROOT \ CLSID {3ad05575-8857-4850-9277-11b85bdb8e09}
(Padrão) REG_SZ Copiar / Mover / Renomear / Excluir / Vincular Objeto
AppID REG_SZ {3ad05575-8857-4850-9277-11b85bdb8e09}
REG_EXPAND_SZ LocalizedString @% SystemRoot% \ system32 \ shell32.dll, -50176
Sob a chave InProcServer32, ele faz referência a shell32.dll. Existem outros também com nomes relevantes. Possivelmente também é interessante windows.storage.dll
fonte