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?
A primeira solução é usar a UI Automation API oficial .
Este código abre uma
c:\temp
pasta (ou seleciona uma já aberta) e adiciona uma nova aba à janela do Explorer:Para poder programar o UIA, você geralmente primeiro analisa a estrutura da janela, por exemplo, usando a ferramenta Inspect do Windows SDK ou o mais recente Accessibility Insights para entender quais ações você deve executar. Aqui está uma captura de tela de inspeção no botão "Adicionar nova guia" do Explorer em destaque que nos informa que este botão tem uma propriedade Automation Id definida como "AddButton":
PS: Às vezes, é menos óbvio porque o Automation Id nem sempre está definido.
Outra solução é usar o
WM_COMMAND
0xA21B (41499) do Explorer não documentado, que solicita diretamente ao Explorer para abrir uma nova guia. Portanto, com o código de exemplo anterior, você pode simplesmente substituir todo o código UIA por este, depois de acessar aShellTabWindowClass
janela:Depois de abrir uma nova aba, ela é vista como uma nova janela (visualização), então você pode (re)começar a usar
CLSID_ShellWindows
novamente e navegar nesta nova visualização para qualquer pasta usando algo parecido com o que fiz aqui https://stackoverflow.com /a/78272475/403671 comNavigate2
ligação.