【发布时间】:2012-11-21 00:26:32
【问题描述】:
我可以安全地假设 Windows 资源管理器总是从 Windows 系统目录启动吗?另外,它的进程是否总是命名为“explorer.exe”?
如果没有,如何获取其完整的文件路径?
编辑: 忘了提——我需要它来稍后找出在给定用户会话中运行的 Windows 资源管理器的进程 ID。因此我在寻找它的完整路径。
编辑 2:感谢所有做出贡献的人,尤其是 sehe!在他的帖子之后,我找到了this page,它解释了如何设置自己的 shell。我通过用自己的进程完全替换 explorer.exe 进行了疯狂测试,结果如下: 这是full-size link,如果你重新调整大小的话。
如您所见,从技术上讲,我可以用我想出的任何进程替换 explorer.exe。正如您在我的屏幕截图中看到的那样,Windows 让我可以完全控制 Shell(屏幕截图是我的整个窗口。)
因此,最重要的是,获取“explorer.exe”文件路径(或使用的任何 Shell 进程)的唯一方法是使用我上面引用的链接中的那些注册表项 - 非常接近 sehe 建议的内容,只需再做一些检查,但这是一个非常简单的事情。
至于 Sean Cline 的建议,只有当我们运行带有具有特定类名的托盘窗口的“普通”Windows 资源管理器时,这将是一个非常优雅的解决方案。
【问题讨论】:
-
您可能希望更具体地了解您要完成的工作。根据您想要做什么,可能没有必要对 shell 的名称或位置做出任何假设。
-
是的,我很抱歉。我需要知道在给定用户会话中运行的 Windows 资源管理器的进程 ID。因此我在寻找它的完整路径。
-
我自己想不出有什么理由知道 shell 进程的 PID,但我已经更新了我的答案。希望它能为您指明正确的方向。
-
如果您解释为什么需要 pid,也许有人可以解决您的实际问题。你不能用 explorer 的 pid 做很多事情。您应该使用适当的 shell API。有explorer不是shell的终端服务场景,当然也有运行多个explorer副本的情况。
-
@RaymondChen:我需要 Windows Explorer 的 PID 来确定特定进程是由用户启动还是由系统启动。这是一个完全不同的讨论,但简而言之,我使用子父进程树来确定这种继承。
标签: c++ winapi windows-explorer