注意:此问题仅适用于 Windows 11。
我想在现有 shell 窗口的新选项卡中打开一个文件夹。官方好像没有API。
我尝试过两种方法:
第一个,也是最明显的一个,是ShellExecute
带有动词的函数opennewtab
(该动词来自注册表中文件夹 ProgID 的 Shell 键内部 - [HKEY_CLASSES_ROOT\Folder\shell\opennewtab]
)。但是,这没有用。该函数只是为该文件夹打开一个新窗口。
为了第二次机会,我检查了opennewtab
注册表中的动词。它被实现为IExecuteCommand
(through DelegateExecute
)。因此,我的第二次尝试是从COM服务器检索接口,通过它们提供的方法(SetXXX
for 的函数系列IExecuteCommand
、Initialize
方法IInitializeCommand
等)设置所需的参数,最后调用该Execute
方法。
为了了解Windows Shell传递给这些方法的内容以及调用它们的顺序,我实现了自定义动词实现及其COM服务器,并替换了在我的服务器上注册的旧COMopennewtab
服务器。
在这里您可以看到 DebugView 显示的输出(我的动词实现使用 输出OutputDebugString
)。
正如您所看到的,它并没有调用接口的所有方法。所以,我认为通过设置相同的参数应该很容易。但是,是的,有些事情我没有考虑到。此方法生成了Null
解除引用异常,但没有成功。
注意:我知道第二个是“hacky”的。
注意:CLSID
实现默认动词处理程序的 是CLSID_ExecuteFolder
。
我们如何在新选项卡中打开文件夹?
第一个解决方案是使用官方的UI Automation API。
此代码打开一个
c:\temp
文件夹(或选择一个已打开的文件夹)并向资源管理器窗口添加一个新选项卡:为了能够对 UIA 进行编程,您通常首先分析窗口的结构,例如使用Windows SDK 中的Inspect 工具或较新的Accessibility Insights来了解您应该执行哪些操作。这是突出显示的资源管理器的“添加新选项卡”按钮的检查屏幕截图,它告诉我们该按钮的Automation Id属性设置为“AddButton”:
PS:有时,这不太明显,因为自动化 ID并不总是设置。
另一个解决方案是使用未记录的 Explorer 的
WM_COMMAND
0xA21B (41499),它直接要求 Explorer 打开一个新选项卡。因此,使用前面的示例代码,在按住窗口后,您可以简单地用此替换所有 UIA 代码ShellTabWindowClass
:打开新选项卡后,它会被视为一个新窗口(视图),因此您可以
CLSID_ShellWindows
再次(重新)开始使用并使用我在此处所做的操作将此新视图导航到任何文件夹https://stackoverflow.com /a/78272475/403671通话Navigate2
。