问题标签 [windows-shell]
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++ - IShellBrowser::QueryActiveShellView 方法的实现者是否应该为调用者调用 AddRef?
我正在尝试实现 IShellBrowser。一种方法是:
这将获取调用者的活动 shell 视图指针(在我的例子中,在任何给定时间只有一个 shell 视图)。
但是很不清楚我是否应该代表调用者调用 AddRef,或者实际上调用者是否有责任自己做 AddRef/Release?
我根本不喜欢通过副作用进行编程——这正是 AddRef 的样子——对调用者的隐藏期望,调用者不一定知道。
并查看 IShellBrowser::QueryActiveShellView 的文档,他们根本没有提及它。但是查看 IUnknown::AddRef,我们看到任何复制接口指针的方法都应该调用 AddRef - http://msdn.microsoft.com/en-us/library/ms691379%28VS.85%29.aspx
为您创建的接口指针的每个新副本调用此方法。例如,如果要从方法传回指针的副本,则必须对该指针调用 AddRef。
c++ - Is there an OS function to translate a REFIID to a helpful name?
Short of writing a function manually that translates a few known REFIID to names, such as:
Is there a system call that would return a reasonable debugging string for well-known (or even all) REFIIDs?
c++ - 有谁知道我在哪里可以找到标准的 Windows 文件对话框工具栏图标?
我正在尝试推出自己的 IShellBrowser 实现,因为我需要一个比 Windows 允许的功能更全面的文件打开和另存为对话框,它与 XP 兼容(理想情况下与 W2000 兼容)*
此时我需要添加您在对话框右上角看到的标准工具栏(XP 和更早版本的清单样式) - 后退按钮、父文件夹按钮、新文件夹按钮和“工具”下拉菜单.
但到目前为止,我一直未能找到这些图标/图像。我查看了 USER32.dll、comdlg32.dll、comctl32.dll,但没有找到任何完全匹配的内容。
我可以简单地截取可以找到它们的应用程序的屏幕截图 - 但了解它们的来源可能更有用,因此我可以访问这些按钮的各种版本(高 rez、低 rez、浅色、深色, ETC。)。
有任何想法吗?
[编辑:我还需要它与 Vista 和 Windows 7 兼容。只是从 Vista 开始,他们打破了旧的通用对话框模型,他们的新模型对 IMO 造成了脑损伤——我不再有足够的权限访问对话框的状态来执行我们的对话框过去所做的必要职责——所以我们被迫从另一个角度解决问题]
c++ - IThumbnailProvider 和 IinitializeWithItem
我正在尝试开发一个IThumbnailProvider
在 Windows 7 中使用的。由于这个特定的缩略图也将依赖于同一目录中的一些其他文件,所以我需要使用除了IInitializeWithStream
要使用的路径之外的东西,这就是IInitializeWithItem
. (或者,我可以使用IInitializeWithFile
,但显然更不赞成。)
无论我做什么,我都无法让它发挥作用。我有 Microsoft 的FileTypeVerifier.exe
工具,它为使用提供了绿灯IInitializeWithItem
,但是当资源管理器调用它时,它似乎只尝试IInitializeWithStream
过。(这是通过临时实现所述接口并在其中发出 Beep() 来测试的Initialize()
)我是否忘记配置某些东西?
简而言之:我如何让它发挥作用?
c++ - 如何获得在 IShellView 上下文菜单中显示的 IContextMenu?
构建文件打开对话框替换。它现在大部分工作,但我想直接从外壳视图对象生成工具栏的视图模式下拉菜单。
查看 IShellView2,我可以看到 IShellView2::GetView() 会给我 FOLDERVIEWMODE 的支持。但是,这并没有给我这些模式的名称,也没有为我格式化弹出菜单,也没有立即给我一种实际设置其中一种模式的方法(看起来有必要破坏 shell 视图窗口并创建当前文件夹的替换文件夹并指定所需的新 FOLDERVIEWMODE ... 是的)。
无论如何,如果右键单击 IShellView 窗口,则会获得一个上下文菜单,其中的第一个子菜单正是我想要放置在我的下拉工具栏按钮中的内容(即“视图”弹出菜单(例如小图标、中图标等))。
似乎应该有一种方法可以直接从 IShellView 中获取该子菜单,而不必对我的值进行硬编码(这样,如果给定的 IShellView 实例支持额外的视图模式,它们就会在那里。同样,那些应该禁用它,因为它都在 IShellView 的控制之下)。
我已阅读 Raymond Chen 的优秀How to host an IContextMenu。不幸的是,这只是给了我一个非常简单的上下文菜单-文件夹本身或给定文件夹中的文件的上下文菜单,而不是 IShellView 的外壳视图窗口的上下文菜单(我可以从中获得视图飞出)。
根据陈的文章,我尝试了以下方法:
不幸的是,查询 m_shell_view(它是一个 IShellView*)的 IContextMenu 接口的尝试失败了。这“有效”:
但是在这里,我在上下文菜单中只得到了很少的选项(打开、探索,...)。如果我只是右键单击外壳视图本身,则不是我得到的详细上下文菜单。
我不知道如何进行。帮助?!;)
c - 如何告诉 Windows 资源管理器刷新其图标?
一旦我的安装程序完成安装应用程序 exe 的新版本,我想告诉 Explorer 使用新 exe 的图标作为其快捷方式。但是,我无法弄清楚如何做到这一点。
从网上阅读,问题似乎是系统图像列表正在缓存旧版本的图标。我尝试使用参数调用SHChangeNotifySHCNE_UPDATEIMAGE
。我尝试调用SHUpdateImage。我什至尝试了广播的大锤方法WM_SETTINGCHANGE
。似乎没有任何效果。
我完全有可能只是做错了什么。任何帮助,将不胜感激。
警告:下面是非常丑陋的测试代码。
c++ - 如何获取 IShellFolder 的 PIDL
如果我有一个IShellFolder
接口指针。我怎样才能获得它的 PIDL?
我可以看到如何枚举它的孩子,我可以看到如何使用它来比较任何两个孩子。但是我怎么能得到它自己的pidl呢?
我问是因为我想知道:
这是 IShellFolder == 另一个 IShellFolder
我可以使用IShellFolder::CompareIDs()
,但我必须拥有两个文件夹的 ID。
c++ - 创建新文件夹的“Shell 命名空间”方式是什么?
显然,这与 win32 api - CreateDirectory() 无关。但我正在尝试托管一个 IShellView,并希望以最面向 shell 的方式来执行此操作。我原以为会有一个 createobject 或 createfolder 或来自 IShellFolder 的一些类似的东西。但是 IShellView 和 IShellFolder 甚至 IFolderView 似乎都没有这样的东西。
是否有一种 Shell 编程方式来创建新文件夹?还是我需要使用路径名创建一个文件夹,这是老式的方式?
如果我必须通过 CreateDirectory() 来完成,那么我的下一个问题可能是:关于如何让 IShellView / IFolderView 真正看到这个新对象并将其显示给用户的任何想法?
动机:创建我自己的文件对话框替换,我想提供标准 XP 样式文件对话框的“新文件夹”工具栏图标功能。
编辑:我继续使用 CreateDirectory 创建了一些基本有效的东西。但是,我仍然希望有更好的方法来做到这一点,但这样你就可以看到它是如何工作的,并提供更好的想法来更好地解决这个问题:
c++ - Global Shell Hook 只注册本地事件
我正在尝试使用全局 shell 挂钩来侦听 Windows 创建和销毁的事件,但似乎我的程序只是为本地线程注册了被销毁的事件。根本没有创造事件,也绝对不是我认为应该是的全球事件。
我花了最后一天搜索谷歌以及 codeguru、codeproject 和 msdn,但在我看来我做得对,虽然我显然不是。有人可以帮我指出正确的方向吗?
这是我连接到 shell 的代码,这对我来说似乎都是正确的,但同样,它没有给出正确的输出。现在,ShellProc 函数只是设置为在窗口创建和销毁消息上进行微不足道的变量递增,只是为了在一行上放置一个断点,但程序只为本地窗口的销毁消息打断点。再次,任何帮助都会很棒,非常感谢您。
c++ - 当然有一种方法可以获取当前文件夹视图的完整视图下拉菜单吗?
动机:创建我们自己的文件对话框,其外观和行为与标准通用对话框非常相似
问题:如何获取当前文件夹/shell容器的视图下拉
明显的死胡同:
- 查询 IShellFolder 的 IContextMenu < NULL 接口指针。
- 查询 IShellView 的 IContextMenu < NULL 接口指针。
- IShellFolder::CreateViewObject(IID_IContextMenu...) < 非常有限的上下文菜单(新)。
- IShellFolder::GetUIObjectOf(IID_IContextMenu...) < 有限的上下文菜单(打开、探索、...)。
- 实现 IShellBrowser 的 InsertMenusSB、RemoveMenusSB 和 SetMenuSB
我花了一些时间阅读实现文件夹视图和如何托管 IContextMenu。这似乎表明上面的最终方法(实现 InsertMenuSB,...)应该有效。IShellView 应该使用适当的项目填充 IShellBrowser 的共享菜单,包括其视图子菜单。但是,到目前为止,我从中得到的只是一个空菜单(除非我用项目填充它——在这种情况下,我只得到我用它填充的项目)。
当然有办法做到这一点。Windows 资源管理器从某个地方到达它显示的菜单(如果您在 Vista 或更高版本上按下 ALT)。而且我无法想象这个菜单是由 Explorer 本身静态构建的 - 它肯定是动态创建的,与当前显示的 IShellView 一致,以允许 shell 扩展显示正确的视图选项列表(和其他菜单选项)。
但是有关InsertMenuSB、RemoveMenuSB和SetMenuSB的文档令人困惑。这似乎表明,作为容器服务器,我应该填充提供的OLEMENUGROUPWIDTHS,“在元素 0、2 和 4 中以反映它在文件、视图和窗口菜单组中提供的菜单元素的数量。”
我已实施以下措施以尝试正确履行本合同:
有没有人实现了一个类似资源管理器的项目,可以正确地向最终用户公开当前 IShellView 的菜单?
是否有关于IOLEInPlaceFrame实现的文档/示例可以阐明这个模糊的主题?
啊!@ - 我觉得我必须很接近 - 但还不够接近!