为啥 Windows Shell 上下文菜单处理程序会破坏 Windows 8/10 上的高级用户菜单 (Win+x)?

Posted

技术标签:

【中文标题】为啥 Windows Shell 上下文菜单处理程序会破坏 Windows 8/10 上的高级用户菜单 (Win+x)?【英文标题】:Why does Windows Shell context menu handler break power-user menu (Win+x) on Windows 8/10?为什么 Windows Shell 上下文菜单处理程序会破坏 Windows 8/10 上的高级用户菜单 (Win+x)? 【发布时间】:2015-04-07 19:51:37 【问题描述】:

我的自定义 Windows shell 上下文菜单处理程序就像一个魅力,适用于从 XP 到 7 的所有 Windows 版本,但在 Windows 8、8.1 和 10 上,安装它会破坏 Win+X 菜单(有时称为 “高级用户菜单”,或 “快速访问菜单”,或 “WinX 菜单”):当点击 Win+X,菜单按预期显示,但它的项目不再工作(当我点击它们时没有任何反应),除了最后四个项目底部仍按预期工作(“搜索”、“运行”、“关闭/退出”、“桌面”):

我很快在 Google 上发现,对于与 Windows 8/10 不“兼容”的大量 shell 扩展,这是一个众所周知的问题。但遗憾的是,我只发现应用程序用户在谈论这个问题及其“解决方案”,而没有开发人员谈论这个问题。而这些用户提出的两个“解决方案”分别是:

    取消注册此 shell 扩展 卸载注册此 shell 扩展的应用程序(导致解决方案 1...)

请参阅 this、this 或 this 以了解人们谈论此问题。

注意:我的shell扩展是针对*文件类型应用的,即所有文件。

几天后,我在shell扩展源代码中找到了这个问题的原因,所以我认为它可以帮助其他开发人员在***上分享它,作为一个自我回答的问题(我没有找到这个问题) .请参阅上面的答案。

【问题讨论】:

【参考方案1】:

我首先查看了微软提供的shell extension sample code(不会导致此问题),将其与我的代码进行比较,并逐步将我的部分代码替换为微软的代码,并在每次替换后对其进行测试。

我发现阻止高级用户菜单工作的原因是您在方法 InvokeCommand()IContextMenu 接口中返回的内容:如果您的扩展程序无法处理给定的动词,它将始终返回 E_FAIL 以便 Windows 尝试与IContextMenu 的其他实现一起使用(有关更多详细信息,请参阅Microsoft documentation)。似乎当单击高级用户菜单项时,Windows首先调用了我的扩展(*文件类型),然后由于它没有为这个未知动词返回E_FAIL,Windows认为我的shell扩展已经处理了这个事件,所以它没有通过名义上的高级用户菜单回调来处理它。

顺便说一句,我觉得有三件事很奇怪:

    为什么 Windows 甚至 尝试 处理这个带有 shell 文件扩展名的超级用户菜单事件?此菜单是否使用与任何其他资源管理器的文件上下文菜单相同的设计/机制进行编码?

    为什么这个错误还没有产生更多的副作用?我的意思是这应该从一开始就破坏了整个 shell 扩展系统,不是吗?

    为什么这么多应用程序都有这个错误? (这意味着为什么这么多应用程序没有按预期返回E_FAIL?)。写这段代码已经有一段时间了,我真的不记得它来自哪里,但我猜它来自 Microsoft 示例或任何 Microsoft 员工教程(太面向 Microsoft,无法自己编写代码) .如果是这样,那可能会回答为什么这么多 shell 扩展会导致这个问题的问题......

如果有人对此主题有一些想法可以分享,我会很感兴趣! 顺便说一句,我希望我的帖子可以帮助其他开发者。当看到新的 Microsoft 示例时,我首先害怕不得不从他们的示例中重写我所有的 shell 扩展,而不知道我的代码有什么问题!

【讨论】:

另外,请参阅:blogs.msdn.com/b/oldnewthing/archive/2012/05/16/10305605.aspx @Stefan 谢谢,这是一篇有用的博文,我认为它证实了我的回答(包含更多细节)。然而,我很想知道为什么这个问题是唯一一个有如此错误的 shell 扩展的问题:我认为会以编程方式调用更多动词......也许与扩展排序有关(电源菜单扩展放在最后的扩展名列表,所以它们总是在所有其他扩展名之后被调用?...)

以上是关于为啥 Windows Shell 上下文菜单处理程序会破坏 Windows 8/10 上的高级用户菜单 (Win+x)?的主要内容,如果未能解决你的问题,请参考以下文章

Windows 资源管理器 - 删除上下文菜单中的条目

如何从“右键单击”上下文菜单(Windows 资源管理器)中选择多个文件以启动同一个应用程序

我应该使用什么命令来使用Windows注册表从上下文菜单中启动jar文件?

shell脚本之流程控制

无法修改git bash Windows快捷方式

为啥这个自定义 nemo 操作没有出现在上下文菜单中?