问题标签 [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.
c++ - 如何在文件保存对话框中获取虚拟文件夹的路径?
----------------------------------更新--------------- -------------------- 如果我执行以下ParseDislayName
类似操作,对话框将报告“文件已存在,您要替换它吗?”:
我使用shell命名空间扩展在Windows 7上创建了一个虚拟文件夹。然后我在另一个应用程序中弹出一个文件“另存为”对话框,并在对话框中的虚拟文件夹中选择一个特定的“文件夹”,文件对话框无法获取虚拟文件夹的路径。经过几次实验,我可以在文件“打开”对话框中获取文件夹的路径,如以下链接所述: 无法获取Windows 7 C ++上虚拟文件夹的路径(shell命名空间扩展相关) 但是当我使用类似的方式时实现文件“另存为”对话框,它不起作用。
我在上面的代码中添加了断点IFACEMETHODIMP OnFileOk(IFileDialog *) { return S_OK; };
,但是在我单击文件对话框中的“保存”按钮后它永远不会触发。正如您在上面代码中的注释中看到的那样,在对话框出现后,它永远不会在hr = pfd->Show(NULL);
. 每次点击“保存”按钮,总是报错或者抛出异常。
我试图在虚拟文件夹 dll 中实现以下内容,
但是当它返回时E_NOTIMPL
,对话框会报“未实现”错误,如果返回S_OK
,对话框会抛出异常。
我不是想在虚拟素材下创建一些东西,我只是想获得用户试图保存的路径。
c++ - 如何检索 ISearchBoxInfo 接口?
我想捕获 Windows 的搜索框,因为我发现我可以使用 ISearchBoxInfo 界面:
https://msdn.microsoft.com/en-us/library/windows/desktop/dd562062(v=vs.85).aspx
我有 Windows 资源管理器的句柄 - 但我不确定如何获得该界面。任何帮助将不胜感激。
c++ - 在搜索时接收 IShellFolder/IShellFolder2 EnumObjects 实现的父窗口句柄?
在我正在处理的命名空间扩展项目中接收父窗口句柄时,我摸不着头脑。
用例如下:
- 用户通过 Windows 资源管理器浏览到虚拟文件夹
- 用户执行搜索(上面的搜索框)
- 我需要在搜索开始之前检索搜索框的文本。
我已经设法在具有 ISearchBoxInfo 界面的测试控制台应用程序上做到这一点(https://msdn.microsoft.com/en-us/library/windows/desktop/dd562062%28v=vs.85%29.aspx?f= 255&MSPP错误=-2147217396 )
有两种方法可以接收指向此接口的指针:
- 使用 IObjectWithSite::SetSite 调用 - 这不相关,因为搜索是在不同的线程中进行的,我无法在这些线程之间共享 COM 对象
- 通过 IWebBrowser2 接口识别窗口句柄并检索 ISearchBox。
这两种方法都不起作用,因为当我执行搜索时,EnumObjects是通过不同的线程调用的,我找不到识别谁是父资源管理器窗口的方法。
这是 EnumObjects 代码:
除了我的测试之外,我还实现了IShellFolderViewCB.MessageSFVCB,它在正确的线程上运行,我可以检索 IShellBrowser 并因此检索句柄 - 当我进行搜索时,我遇到以下消息:
之后,不再发布消息(无论我是否重新搜索) - 第一个断点始终位于 EnumObjects 方法,我没有关于父窗口的上下文。
任何光脱落都会很好。
== 编辑 ==
我想出了一些解决方法 - 这并不适合所有情况,但适用于大多数情况 - 其他选项仍然很好。
每当使用 hwnd = NULL 调用 EnumObjects 时,我都会执行以下操作:(它在 C# 中 - 但它也可以在 C++ 中轻松使用)
基本上我正在浏览所有资源管理器窗口,试图找到一个确实是“explorer.exe”+ 不是空的搜索字符串(LocationName)+ 忙... + 标题包含当前文件夹名称的名称。
当 2 个窗口很忙并且标题中具有相同的文件夹名称时,它将失败 - 但这可能已经足够好了......这里不确定。
c++ - 如何通过 shell 命名空间扩展在 windows 上的文件夹视图中添加背景照片/文本
我使用 miscrosoft SDK 示例通过 shell 命名空间扩展创建了一个虚拟文件夹:
在这个虚拟文件夹中,它有几个文件夹。其中一个文件夹是空的。我想更改空文件夹的文件夹视图的背景,例如:
所以对于包含文件的文件夹,显示文件,但对于空文件夹,显示“此文件夹中没有文件”。有没有办法做到这一点?我在想也许我可以 PS 一张包含文本的照片并将照片显示为空文件夹的背景照片。但是怎么做呢?在 SDK 示例代码中,他们只是使用默认的文件夹视图:
- - - - - - - - - - - - - -更新 - - - - - - - - - - - --------
根据@DenisAnisimov 的评论,当我将函数修改为上述代码时。但它不起作用。当我单击该文件夹时,Windows 资源管理器没有响应然后崩溃。------------------------------------更新第二次------------ --------
或者
或者
或者
这次空文件夹仍然没有显示任何内容,没有任何字符串作为背景。------------------------------更新第三次--------
或者
这次我通过添加断点来调试它char* tt = (char*)lParam;
,tt
确实变成了“无项目”。但它在后台显示错误的字符串:
---------------------------------------最终更新------这次成功了!
com - 快速访问和命名空间扩展:取消固定对象
当我右键单击一个 lnk 文件 - 命名空间扩展中的虚拟文件夹上的链接 - 时,会调用我的实现的函数CreateViewObject
和/或。这些函数使用as 参数调用。此外,当调用 QueryContextMenu 时,也会设置该标志。这意味着 1)我知道应该显示一个菜单,以及 2)因为这个菜单是由 .lnk 文件查询的标志,并且(来源 Microsoft):GetUiObjectOf
IShellFolder/IShellFolder2
IID_IContextMenu
(riid)
CMF_VERBSONLY (0x00000002)
CMF_VERBSONLY
0x00000002。快捷菜单是快捷文件(通常为 .lnk 文件)的菜单。快捷菜单处理程序应忽略此值。
大多数情况下,当此标志存在时,我不会添加菜单项。右键单击 .lnk 文件时,Windows 将返回 .lnk 文件的标准菜单,并提供删除此文件的机会。我在 Windows 7 上的收藏夹文件夹中也有同样的机会。由于 Windows 10 和快速访问的“介绍”,它不再可能了。默认情况下不会显示“取消固定”菜单项。
由于命名空间扩展非常困难,因此假设IID_IContextMenu
并CMF_VERBSONLY
知道对象是否在快速访问中固定以及如何取消固定它 - 我可能必须打开自动跳转列表文件夹,然后根据我的对象检查所有跳转列表文件displayname - ,我想知道是否有更简单的方法来处理这个问题(最后跳转列表是 lnk 文件的串联)。
谢谢你的帮助
c++ - 使用 FILEGROUPDESCRIPTOR 和 FILECONTENTS 在长路径上失败
我有一个应用程序,该应用程序当前使用 Copy 和 Past APIFILECONTENTS
和FILEGROUPDESCRIPTOR
.
这可以正常工作,没有问题。不幸的是,如果路径 + 中指定的文件名FILEGROUPDESCRIPTOR
超过了最大路径长度,这种方法就会失败。
我还注意到 Outlook(使用相同的方法)也有同样的问题。
我正在开发一个 Windows 资源管理器命名空间扩展。有人知道这种方法的替代方法吗?
c++ - Windows 10 命名空间扩展 - OpenFileDialog 和临时文件夹
对于一个小项目,我一直致力于命名空间扩展,以直接从 Windows 资源管理器查看和修改自定义存档格式。这工作正常:我可以浏览存档,修改它等,但是当涉及到 windows 文件浏览器以及它如何处理直接从存档打开文件时,我遇到了一个小绊脚石。
无论出于何种原因,当从存档中打开一个文件时,它会在 Windows 缓存文件夹 (C:\Users\User\AppData\Local\Microsoft\Windows\INetCache\IE) 中放置一个副本。它还通过附加“[]”来更改文件名。我注意到 Windows zip 存档处理具有相同的行为。这导致我希望允许直接从存档中选择文件的应用程序出现问题,因为它将文件复制到那里而没有任何子文件夹信息,并且我需要知道所选文件的相对路径(相对于存档)。
所以我的问题是:
- 我可以以某种方式/某处覆盖这个临时文件路径,以便我可以完全控制这个临时文件的放置位置以及它的命名方式吗?
- 除了 1,我有没有办法从文件(浏览器)中获取原始路径?(将 WPF 用于客户端应用程序)
windows - 如何在不重启资源管理器的情况下更新 shell 命名空间扩展?
我有一个shell 命名空间扩展,使用文件系统文件夹作为其连接点(通过在文件夹中使用我的扩展的 CLSID 创建一个 desktop.ini 文件)。
升级到新版本的扩展时,我想避免重新启动所有加载了扩展的进程(这是如何正确卸载 C++ Shell 扩展 DLL中的建议答案),以提供更好的用户体验。
我试过了:
- SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NULL, NULL)
- SHFlushSFCache,在Reload a namespace extension in explorer.exe 中建议,之前加载失败
- 使用FCS_FORCEWRITE的 SHGetSetFolderCustomSettings,如http://microsoft.public.platformsdk.shell.narkive.com/6r9JXG8r/explorer-in-vista-does-not-react-to-a-change-of-clsid-in-desktop中所建议-ini
以上都没有成功强制资源管理器加载新版本的扩展。
我还尝试为新版本的扩展注册一个全新的 CLSID,并删除旧版本的注册。这通常有效,除非打开任何先前存在的指向文件夹的快捷方式。在这种情况下,既不会加载旧扩展名也不会加载新扩展名,而是使用默认的 shell 文件夹来显示该文件夹。我再次尝试了 SHChangeNotify、SHFlushSFCache 和 SHGetSetFolderCustomSettings,但它们都没有通过快捷方式解决此问题。
我在 Windows 7 和 Windows 10 Fall Creators 上对此进行了测试。
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_TRUE
and VARIANT_FALSE
,pv->boolVal
它仍然只显示“是”。
-----工作更新--------
这个对我有用!