问题标签 [shell32]
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.
winapi - SHChangeNotify 与 SHCNE_RMDIR 行为在 Windows 7 和 Windows 10 之间不一致
概述
我使用SHChangeNotify
withSHCNE_RMDIR
来通知 shell 已从我的shell 命名空间扩展中删除的文件夹。我的期望是,这将导致其文件夹视图导航到已删除文件夹(或其任何子文件夹)的任何资源管理器(或其他 shell)窗口被导航到已删除文件夹的父文件夹。此预期行为正在 Windows 10 上发生。但是,在 Windows 7 上,这些窗口被导航到已删除的文件夹。
问题
Windows 7 上的这种行为是否是一个错误,和/或我可以做些什么(没有针对 Windows 7 的特殊代码)来获得两个操作系统的相同行为?
重现问题的详细步骤
以下是如何从头开始创建和观察问题的演练。这涉及使用称为Shell Instance Object的“内置”Microsoft 命名空间扩展(而不是我真正的命名空间扩展)。为了简单起见,我使用它来表明它与我的特定命名空间扩展无关。这个示例命名空间扩展所做的只是在“我的电脑”下创建一个图标,该图标将浏览到您的 %TEMP% 目录。
安装命名空间扩展并在“我的电脑”下注册。为此,请在注册表中输入以下内容:
这是一个 .reg 文件,它将为您自动执行该操作:
以下 .reg 文件将允许您轻松删除上述注册表项:
/li>此时,当您打开资源管理器窗口并浏览“我的电脑”时,您应该会看到“我的命名空间扩展”。浏览它应该会显示您的 %TEMP% 目录文件夹/文件。
在您的文件夹中创建一个
%TEMP%
名为FolderToRemove
. 在其中FolderToRemove
创建一个名为subFolder
.打开 3 个资源管理器窗口并浏览到以下位置:
- 我的电脑\我的命名空间扩展
- 我的电脑\我的命名空间扩展\FolderToRemove
- 我的电脑\我的命名空间扩展\FolderToRemove\subFolder
在 Windows 7 上,执行以下 C++ 代码:
/li>执行上述代码后,您会注意到唯一更改的资源管理器窗口是最初导航到
My Computer\My Namespace Extension\FolderToRemove\subFolder
. 请注意,它现在指向My Computer\My Namespace Extension\FolderToRemove
:期望两个资源管理器窗口已更改,以便它们都被导航到
My Computer\My Namespace Extension
(已删除文件夹的父文件夹)。这是预期行为的图像(这是在 Windows 10 上发生的情况):
补充说明
我发现我可以通过在
SHChangeNotify
. 例如:但是,当我在 Windows 10 上执行此代码时,它当然会导致将窗口导航回
My Computer
不希望的位置。如果我采用这种解决方法,我将需要针对不同操作系统的不同代码。
c# - 阅读视频拍摄日期
是否可以读取视频的拍摄日期而不是创建日期或修改日期...我试图检查视频详细信息,但我总是看到拍摄日期为空
c# - 在c#中查询桌面选定的项目不返回任何内容
我在堆栈溢出时在这里找到了这段代码,并将其修改为返回一个列表而不是一个数组列表。每当我按下一个键时都会调用该函数,虽然该函数被调用正常,但 SelectedItems() 每次似乎都是空的,即使我在桌面上突出显示了一些东西。我也在资源管理器窗口中尝试过,结果相同。有谁知道为什么它什么都不返回?stackoverflow 上的其他人似乎能够让它工作我的有什么问题?
vb.net - 无法将“system.__comObject”类型的 COM 对象转换为接口类型“shell32.shell”
我在win 7和xp中运行我的项目,但是有一条错误消息,在这个项目中我使用shell32.shell复制和提取自动exe文件,shell32.shell在windows 7和xp中不起作用吗?如果可以,请建议sheell32.shell可以运行
winapi - FTP PIDL 的 SHGetNameFromIDList 失败
如果我在 Windows 上添加一个 FTP 网络位置,它会创建一个指向该位置的 .lnk 文件。如果我通过IShellLink打开链接,获取其IShellFile目标,并将其绑定到IShellFolder ,我可以使用IShellFolder::EnumObjects枚举远程位置上的文件(登录后),并返回正确的文件。
但是,如果我尝试通过SHGetNameFromIDList或IShellItem::GetDisplayName获取那里的任何文件的名称,则该函数将失败并显示0x80070057
(无效参数)HRESULT。我确定 PIDL 是有效的,因为我可以构造IShellItem,并且它的大小是 72 字节,但是任何获取路径的尝试都失败了。访问我在IShellItem2上从 PIDL 构造的任何我能想到的属性也会失败,并且只需调用SHGetPathFromIDList。
那么,我如何从 PIDL 中获取任何有意义的名称,最好是在 PIDL 中SIGDN_PARENTRELATIVEPARSING
?为什么所有这些操作都失败了?我认为任何 PIDL 至少是一个文件路径或一个 CLSID,但是这个 PIDL 根本无法查询任何东西。
我知道访问 FTP 有很多更好的解决方案,但我一般对 Shell32 有这个问题,而不是专门针对 FTP。
我还通过ILSaveToStream将 PIDL 转换为字节,我可以看到文件名肯定在那里。
c# - 在 C# 中使用 SHAssocEnumHandlers
我正在努力在 C# 中调用 WinAPI SHAssocEnumHandlers。
当调用 SHAssocEnumHandlers 我只得到一个
“意外错误:HRESULT:0x80004005 (E_FAIL)”
堆栈跟踪显示了例外情况
我想我可能错过了一些实现。但我不知道是什么。
更新 1
此错误仅在 Windows 7 上发生。在 Windows 10 机器上它工作正常。(在各种win7和win10机器上测试过)
c# - 使用 c# 和 shell32 递归 android 设备
因为我想递归我使用 Shell32 的任何文件夹的完整结构,它可以连接到字母驱动器 c:\;d:\ 等以及连接的没有字母的设备,例如 Android 平板电脑。
我的问题是我无法从 FolderItem 中提取文件夹进行递归。
谢谢。