在从搜索窗口启动的程序中获取资源管理器shell搜索的结果

时间:2015-01-27 09:23:04

标签: windows explorer

当用户打开使用资源管理器搜索找到的文件启动程序时,有没有办法在文件夹中实现有用的'打开下一个/上一个文件'功能?

例如,应用程序与* .jpg相关联。用户在资源管理器中搜索foo * .jpg并打开foobar1.jpg。该应用程序启动。当用户使用应用程序的“文件夹中的下一个文件”命令时,应用程序将打开搜索返回的下一个文件,而不是与foobar1.jpg位于同一文件夹中的下一个文件。

这可能吗?

1 个答案:

答案 0 :(得分:2)

当用户在Windows资源管理器中打开文件时,shell会枚举所有可用的上下文菜单命令并运行第一个默认命令。因此,只需创建新的上下文菜单shell扩展并将其注册到您的文件扩展名ProgID上。您的shell扩展必须实现3个接口:IObjectWithSite,IShellExtInit和IContextMenu。不要忘记创建MayChangeDefaultMenu reg子项。

您可以在任何程序中使用上下文菜单。如果调用者调用IObjectWithSite.SetSite,则表示文件已在Windows资源管理器中打开。如果没有调用IObjectWithSite.SetSite - 文件是从任何其他应用程序打开的。

当shell调用IShellExtInit时,从传递的IDataObject中提取文件名并存储它们。当shell调用IContextMenu.QueryContextMenu时,将命令添加到带有MFS_DEFAULT标志的菜单。当shell调用IContextMenu.GetCommandString(GCS_VERB)时,您必须返回“open”字符串。当shell调用IContextMenu.InvokeCommand运行你的app并在参数中传递filename和CMINVOKECOMMANDINFO.hwnd时。

在您的应用内部分析参数,如果找到hwnd,则表示您必须从hwnd获取文件列表。

查找资源管理器实例:

OleCheck(CoCreateInstance(CLASS_ShellWindows, nil, CLSCTX_INPROC_SERVER or CLSCTX_LOCAL_SERVER, IShellWindows, ShellWindows));
for i := ShellWindows.Count - 1 downto 0 do
  begin
    Dispatch := ShellWindows.Item(i);
    Dispatch.QueryInterface(IServiceProvider, ServiceProvider);
    ServiceProvider.QueryService(SID_STopLevelBrowser, IShellBrowser, ShellBrowser);
    ShellBrowser.GetWindow(Hwnd);
    if Hwnd = HwndFromParams then InstanceFound;
  end;

创建文件列表:

ShellBrowser.QueryActiveShellView(ShellView);
ShellView.QueryInterface(IFolderView, FolderView);
FolderView.Items(SVGIO_ALLVIEW)

现在您拥有了Windows资源管理器实例中的所有文件,您可以在导航中使用它们。