问题标签 [shell-namespace-extension]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
517 浏览

c++ - 如何在文件保存对话框中获取虚拟文件夹的路径?

----------------------------------更新--------------- -------------------- 如果我执行以下ParseDislayName类似操作,对话框将报告“文件已存在,您要替换它吗?”:


我使用shell命名空间扩展在Windows 7上创建了一个虚拟文件夹。然后我在另一个应用程序中弹出一个文件“另存为”对话框,并在对话框中的虚拟文件夹中选择一个特定的“文件夹”,文件对话框无法获取虚拟文件夹的路径。经过几次实验,我可以在文件“打开”对话框中获取文件夹的路径,如以下链接所述: 无法获取Windows 7 C ++上虚拟文件夹的路径(shell命名空间扩展相关) 但是当我使用类似的方式时实现文件“另存为”对话框,它不起作用。

我在上面的代码中添加了断点IFACEMETHODIMP OnFileOk(IFileDialog *) { return S_OK; };,但是在我单击文件对话框中的“保存”按钮后它永远不会触发。正如您在上面代码中的注释中看到的那样,在对话框出现后,它永远不会在hr = pfd->Show(NULL);. 每次点击“保存”按钮,总是报错或者抛出异常。

我试图在虚拟文件夹 dll 中实现以下内容,

但是当它返回时E_NOTIMPL,对话框会报“未实现”错误,如果返回S_OK,对话框会抛出异常。 在此处输入图像描述

我不是想在虚拟素材下创建一些东西,我只是想获得用户试图保存的路径。

0 投票
1 回答
164 浏览

c++ - 如何检索 ISearchBoxInfo 接口?

我想捕获 Windows 的搜索框,因为我发现我可以使用 ISearchBoxInfo 界面:

https://msdn.microsoft.com/en-us/library/windows/desktop/dd562062(v=vs.85).aspx

我有 Windows 资源管理器的句柄 - 但我不确定如何获得该界面。任何帮助将不胜感激。

0 投票
1 回答
282 浏览

c++ - 在搜索时接收 IShellFolder/IShellFolder2 EnumObjects 实现的父窗口句柄?

在我正在处理的命名空间扩展项目中接收父窗口句柄时,我摸不着头脑。

用例如下:

  1. 用户通过 Windows 资源管理器浏览到虚拟文件夹
  2. 用户执行搜索(上面的搜索框)
  3. 我需要在搜索开始之前检索搜索框的文本。

我已经设法在具有 ISearchBoxInfo 界面的测试控制台应用程序上做到这一点(https://msdn.microsoft.com/en-us/library/windows/desktop/dd562062%28v=vs.85%29.aspx?f= 255&MSPP错误=-2147217396 )

有两种方法可以接收指向此接口的指针:

  1. 使用 IObjectWithSite::SetSite 调用 - 这不相关,因为搜索是在不同的线程中进行的,我无法在这些线程之间共享 COM 对象
  2. 通过 IWebBrowser2 接口识别窗口句柄并检索 ISearchBox。

这两种方法都不起作用,因为当我执行搜索时,EnumObjects是通过不同的线程调用的,我找不到识别谁是父资源管理器窗口的方法。

在进行搜索时,来的 hwnd 始终为 null,如下所示: 搜索时的 EnumObjects

这是 EnumObjects 代码:

除了我的测试之外,我还实现了IShellFolderViewCB.MessageSFVCB,它在正确的线程上运行,我可以检索 IShellBrowser 并因此检索句柄 - 当我进行搜索时,我遇到以下消息:

之后,不再发布消息(无论我是否重新搜索) - 第一个断点始终位于 EnumObjects 方法,我没有关于父窗口的上下文。

任何光脱落都会很好。

== 编辑 ==

我想出了一些解决方法 - 这并不适合所有情况,但适用于大多数情况 - 其他选项仍然很好。

每当使用 hwnd = NULL 调用 EnumObjects 时,我都会执行以下操作:(它在 C# 中 - 但它也可以在 C++ 中轻松使用)

基本上我正在浏览所有资源管理器窗口,试图找到一个确实是“explorer.exe”+ 不是空的搜索字符串(LocationName)+ 忙... + 标题包含当前文件夹名称的名称。

当 2 个窗口很忙并且标题中具有相同的文件夹名称时,它将失败 - 但这可能已经足够好了......这里不确定。

0 投票
1 回答
229 浏览

c++ - 如何通过 shell 命名空间扩展在 windows 上的文件夹视图中添加背景照片/文本

我使用 miscrosoft SDK 示例通过 shell 命名空间扩展创建了一个虚拟文件夹: 在此处输入图像描述

在这个虚拟文件夹中,它有几个文件夹。其中一个文件夹是空的。我想更改空文件夹的文件夹视图的背景,例如: 在此处输入图像描述

所以对于包含文件的文件夹,显示文件,但对于空文件夹,显示“此文件夹中没有文件”。有没有办法做到这一点?我在想也许我可以 PS 一张包含文本的照片并将照片显示为空文件夹的背景照片。但是怎么做呢?在 SDK 示例代码中,他们只是使用默认的文件夹视图:

- - - - - - - - - - - - - -更新 - - - - - - - - - - - --------

根据@DenisAnisimov 的评论,当我将函数修改为上述代码时。但它不起作用。当我单击该文件夹时,Windows 资源管理器没有响应然后崩溃。------------------------------------更新第二次------------ --------

或者

或者

或者

这次空文件夹仍然没有显示任何内容,没有任何字符串作为背景。------------------------------更新第三次--------

或者

这次我通过添加断点来调试它char* tt = (char*)lParam;tt确实变成了“无项目”。但它在后台显示错误的字符串:

在此处输入图像描述

---------------------------------------最终更新------这次成功了!

0 投票
0 回答
123 浏览

windows - CFileDialog中无法显示为虚拟文件夹创建的新文件夹按钮

通过使用 shell 命名空间扩展,我创建了一个虚拟文件夹并在工具栏上添加了一个“新建文件夹”按钮,当我使用 Windows 资源管理器打开它时,我可以看到该按钮: 在此处输入图像描述

“新建文件夹”按钮的相关代码很简单:

“新建文件夹”按钮只是在单击时弹出一个消息框。但是当我CFileDialog用来浏览这个虚拟文件夹时,我在工具栏中找不到任何“新建文件夹”按钮:

在此处输入图像描述

我可以在 CFileDialog 中的“文档”或 C 驱动器下看到所有其他系统文件夹的“新建文件夹”按钮,但是当我在 CFileDialog 中打开虚拟文件夹时,虚拟文件​​夹的“新建文件夹”按钮会消失。如何解决这个问题?

0 投票
1 回答
361 浏览

com - 快速访问和命名空间扩展:取消固定对象

当我右键单击一个 lnk 文件 - 命名空间扩展中的虚拟文件夹上的链接 - 时,会调用我的实现的函数CreateViewObject和/或。这些函数使用as 参数调用。此外,当调用 QueryContextMenu 时,也会设置该标志。这意味着 1)我知道应该显示一个菜单,以及 2)因为这个菜单是由 .lnk 文件查询的标志,并且(来源 Microsoft):GetUiObjectOfIShellFolder/IShellFolder2IID_IContextMenu(riid)CMF_VERBSONLY (0x00000002)CMF_VERBSONLY

0x00000002。快捷菜单是快捷文件(通常为 .lnk 文件)的菜单。快捷菜单处理程序应忽略此值。

大多数情况下,当此标志存在时,我不会添加菜单项。右键单击 .lnk 文件时,Windows 将返回 .lnk 文件的标准菜单,并提供删除此文件的机会。我在 Windows 7 上的收藏夹文件夹中也有同样的机会。由于 Windows 10 和快速访问的“介绍”,它不再可能了。默认情况下不会显示“取消固定”菜单项。

由于命名空间扩展非常困难,因此假设IID_IContextMenuCMF_VERBSONLY知道对象是否在快速访问中固定以及如何取消固定它 - 我可能必须打开自动跳转列表文件夹,然后根据我的对象检查所有跳转列表文件displayname - ,我想知道是否有更简单的方法来处理这个问题(最后跳转列表是 lnk 文件的串联)。

谢谢你的帮助

0 投票
0 回答
117 浏览

c++ - 使用 FILEGROUPDESCRIPTOR 和 FILECONTENTS 在长路径上失败

我有一个应用程序,该应用程序当前使用 Copy 和 Past APIFILECONTENTSFILEGROUPDESCRIPTOR.

这可以正常工作,没有问题。不幸的是,如果路径 + 中指定的文件名FILEGROUPDESCRIPTOR超过了最大路径长度,这种方法就会失败。

我还注意到 Outlook(使用相同的方法)也有同样的问题。

我正在开发一个 Windows 资源管理器命名空间扩展。有人知道这种方法的替代方法吗?

0 投票
0 回答
172 浏览

c++ - Windows 10 命名空间扩展 - OpenFileDialog 和临时文件夹

对于一个小项目,我一直致力于命名空间扩展,以直接从 Windows 资源管理器查看和修改自定义存档格式。这工作正常:我可以浏览存档,修改它等,但是当涉及到 windows 文件浏览器以及它如何处理直接从存档打开文件时,我遇到了一个小绊脚石。

无论出于何种原因,当从存档中打开一个文件时,它会在 Windows 缓存文件夹 (C:\Users\User\AppData\Local\Microsoft\Windows\INetCache\IE) 中放置一个副本。它还通过附加“[]”来更改文件名。我注意到 Windows zip 存档处理具有相同的行为。这导致我希望允许直接从存档中选择文件的应用程序出现问题,因为它将文件复制到那里而没有任何子文件夹信息,并且我需要知道所选文件的相对路径(相对于存档)。

所以我的问题是:

  1. 我可以以某种方式/某处覆盖这个临时文件路径,以便我可以完全控制这个临时文件的放置位置以及它的命名方式吗?
  2. 除了 1,我有没有办法从文件(浏览器)中获取原始路径?(将 WPF 用于客户端应用程序)
0 投票
0 回答
408 浏览

windows - 如何在不重启资源管理器的情况下更新 shell 命名空间扩展?

我有一个shell 命名空间扩展,使用文件系统文件夹作为其连接点(通过在文件夹中使用我的扩展的 CLSID 创建一个 desktop.ini 文件)。

升级到新版本的扩展时,我想避免重新启动所有加载了扩展的进程(这是如何正确卸载 C++ Shell 扩展 DLL中的建议答案),以提供更好的用户体验。

我试过了:

以上都没有成功强制资源管理器加载新版本的扩展。

我还尝试为新版本的扩展注册一个全新的 CLSID,并删除旧版本的注册。这通常有效,除非打开任何先前存在的指向文件夹的快捷方式。在这种情况下,既不会加载旧扩展名也不会加载新扩展名,而是使用默认的 shell 文件夹来显示该文件夹。我再次尝试了 SHChangeNotify、SHFlushSFCache 和 SHGetSetFolderCustomSettings,但它们都没有通过快捷方式解决此问题。

我在 Windows 7 和 Windows 10 Fall Creators 上对此进行了测试。

0 投票
1 回答
62 浏览

c++ - “Shared”列的值未在 shell 命名空间扩展中正确显示

我使用 shell 命名空间扩展在 Windows 7 上创建一个虚拟文件夹。我想向这个虚拟文件夹添加列,以便它可以显示虚拟文件的详细信息。但是,“共享”的值无法正确显示。以下是相关代码:

上面的代码位于IFACEMETHODIMP GetDetailsEx(PCUITEMID_CHILD pidl, const PROPERTYKEY *pkey, VARIANT *pv);windows提供的界面函数中。 在此处输入图像描述 我在上面的代码中添加了断点,结果当变量isShared为时true,变量shared确实变为VARIANT_TRUE。但是,当我检查它在 UI 中显示的值时,它会显示no所有对象: 在此处输入图像描述 如您所见,在“共享”列中,所有值都是“否”。实际上,前 3 个文件是共享的,它们应该是“是”。当调试器到达上述代码中的断点时,该值为VARIANT_TRUE这三个文件。这是 WINDOWS 的定义PKEY_IsSahred

我还尝试编辑上面的代码,例如:

它不起作用。如果我替换pv->pboolVal = &shared;pv->boolVal= shared;,它将像这样工作: 在此处输入图像描述 仅对前三个文件显示“是”。

如果我使用VARIANT_TRUEand VARIANT_FALSEpv->boolVal它仍然只显示“是”。

-----工作更新--------

这个对我有用!