Nota : Esta questão se aplica apenas ao Windows 11.
Quero abrir uma pasta em uma nova guia de uma janela de shell existente. Parece que não existe uma API oficial.
Eu tentei dois métodos:
A primeira, mais óbvia, foi a ShellExecute
função com o verbo opennewtab
(Este verbo vem de dentro da chave Shell da pasta ProgID no registro - [HKEY_CLASSES_ROOT\Folder\shell\opennewtab]
). Mas não funcionou. A função apenas abre uma nova janela para a pasta.
Para uma segunda chance, examinei o opennewtab
verbo no registro. É implementado como um IExecuteCommand
(através de DelegateExecute
). Portanto, minha segunda tentativa foi recuperar as interfaces de seu servidor COM , definir os parâmetros necessários por meio dos métodos que eles fornecem (a SetXXX
família de funções para IExecuteCommand
, o Initialize
método de IInitializeCommand
etc.) e, finalmente, chamar o Execute
método.
Para saber o que o Windows Shell passa para esses métodos e em que ordem ele os chama, implementei minha implementação de verbo personalizada e seu servidor COM , e substituí o antigo servidor COM registrado pelo opennewtab
meu servidor.
Aqui você pode ver a saída exibida pelo DebugView (minha implementação de verbo gera saídas usando OutputDebugString
).
Como você pode ver, ele não chama todos os métodos das interfaces. Então, pensei que deveria ter sido bem fácil definir os mesmos parâmetros. Mas, sim, há algumas coisas que não levei em consideração. Essa abordagem gerou uma Null
exceção de desreferenciação sem sucesso.
Nota : Estou ciente de que o segundo é "hacky" .
Nota : O CLSID
que implementa o manipulador de verbos padrão é CLSID_ExecuteFolder
.
Como podemos abrir uma pasta em uma nova aba?