【发布时间】:2015-04-05 12:13:45
【问题描述】:
我正在开发 Windows 文件管理器应用程序,它本质上包含 IExplorerBrowser,为我提供了与 Windows 资源管理器中一样的精确控制。
我已经使用 Mutex 和 IPC 实现了单实例来传递参数。
所以现在我希望能够在您从 ie 打开目录时将我的文件管理器注册为默认应用程序。桌面
所以我创建了这样的注册表脚本:
REGEDIT4
[HKEY_CURRENT_USER\Software\Classes\Drive\shell]
@="AppName"
[HKEY_CURRENT_USER\Software\Classes\Drive\shell\AppName]
@="Open in AppName"
[HKEY_CURRENT_USER\Software\Classes\Drive\shell\AppName\command]
@="\"<app-path>\" %1"
[HKEY_CURRENT_USER\Software\Classes\Directory\shell]
@="AppName"
[HKEY_CURRENT_USER\Software\Classes\Directory\shell\AppName]
@="Open in AppName"
[HKEY_CURRENT_USER\Software\Classes\Directory\shell\AppName\command]
@="\"<app-path>\" \"%1\""
它按预期工作,如果我双击目录它会启动我的应用程序,并且由于我实现了单个实例,它不会产生多个实例。
由于我的应用程序中有选项卡式界面,因此每次打开目录时,它都会使用 IExplorerBrowser 控件创建新选项卡。
问题是,现在 IExplorerBrowser 控件的行为发生了变化,当我从控件打开目录时,我得到了新选项卡,而不是在控件内部导航,这是合乎逻辑的(它总是调用注册表命令来启动我的应用程序,并将目录作为 arg)
TL;博士;
Windows 资源管理器如何处理这个问题? Windows 资源管理器如何知道目录是否从 ie 打开。桌面,还是从 Windows 资源管理器内部导航到“listview”而不是打开新窗口?
【问题讨论】:
-
Explorer 从文件夹的 IContextMenu 中查询 IObjectWithSite 接口,并调用 IObjectWithSite.SetSite 对象实现 IServiceProvider。打开命令处理程序使用站点并获取 IShellBrowser 接口。如果找到 IShellBrowser 打开命令处理程序使用它进行导航。
-
@DenisAnisimov 我正在使用 IExplorerBrowser 的 Windows-API-Code-Pack-1.1 C# 实现,如果我理解正确的话,HResult Microsoft.WindowsAPICodePack.Controls.IServiceProvider.QueryService 应该为 RIID 和接口指针返回 HResult.Ok?
标签: c# winapi registry windows-explorer single-instance