1

我可以安全地假设 Windows 资源管理器总是从 Windows 系统目录启动吗?另外,它的进程是否总是命名为“explorer.exe”?

如果没有,如何获取其完整文件路径?

编辑:忘了提——我需要这个稍后找出在给定用户会话中运行的 Windows 资源管理器的进程 ID。因此我寻找它的完整路径。

编辑2:感谢所有做出贡献的人,尤其是sehe!在他的帖子之后,我发现这个页面解释了如何设置你自己的 shell。我通过用我自己的进程完全替换 explorer.exe 进行了疯狂测试,结果如下: 如果您重新调整大小,在此处输入图像描述 这是完整大小的链接。

正如你所看到的,我可以用我可能想出的任何进程在技术上替换 explorer.exe。正如您在我的屏幕截图中看到的那样,Windows 让我可以完全控制Shell(屏幕截图是我的整个窗口。)

因此,最重要的是,获取“explorer.exe”文件路径(或使用的任何 Shell 进程)的唯一方法是使用我上面引用的链接中的那些注册表项 - 非常接近 sehe 建议的内容,只需一个还有一些检查要做,但这是一个非常简单的事情。

至于 Sean Cline 的建议,只有当我们运行带有具有特定类名的托盘窗口的“普通”Windows Explorer 时,这将是一个非常优雅的解决方案。

4

3 回答 3

4

假设 explorer.exe 始终位于 %windir% 或 %SystemRoot% 中可能是安全的,因为它已经多年没有移动了。但是,如果您尝试通过 Explorer 调用某些东西,您可能希望使用ShellExecute () 函数。

如果您确实需要该路径,获取它的最简单方法可能是使用 FOLDERID_Windows 作为第一个参数调用SHGetKnownFolderPath ()。

编辑: 这是我知道您正在寻找 shell 进程的 PID 的一些代码:

DWORD trayPID;
HWND trayWnd = FindWindow("Shell_TrayWnd", NULL);
GetWindowThreadProcessId(trayWnd, &trayPID);

它查找任务栏的 hWnd 并找到拥有的 PID。您可能需要为资源管理器未运行且该窗口不存在的情况添加一些错误处理 - 不太可能,但可能。

于 2012-11-21T00:40:03.867 回答
1

不,您不能安全地假设这与 C++ 无关。

此外,您没有显示任何代码。开始:

用于此的注册表项是Software\Microsoft\Windows NT\CurrentVersion\WinLogon\Shell(请参见此处)。

#include <windows.h>
#include <malloc.h>
#include <stdio.h>
#include <string>

LONG GetStringRegKey(HKEY hKey, const std::wstring &strValueName, std::wstring &strValue, const std::wstring &strDefaultValue)
{
    strValue = strDefaultValue;
    WCHAR szBuffer[512];
    DWORD dwBufferSize = sizeof(szBuffer);
    ULONG nError;
    nError = RegQueryValueExW(hKey, strValueName.c_str(), 0, NULL, (LPBYTE)szBuffer, &dwBufferSize);
    if (ERROR_SUCCESS == nError)
    {
        strValue = szBuffer;
    }
    return nError;
}

int main()
{
    HKEY hKey;
    LONG lRes = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"Software\\Microsoft\\Windows NT\\CurrentVersion\\WinLogon", 0, KEY_READ, &hKey);
    bool bExistsAndSuccess (lRes == ERROR_SUCCESS);
    bool bDoesNotExistsSpecifically (lRes == ERROR_FILE_NOT_FOUND);
    std::wstring shell;
    GetStringRegKey(hKey, L"Shell", shell, L"");
}
于 2012-11-21T00:46:05.997 回答
0

两者都是。Windows 资源管理器始终位于%WINDIR%\Explorer.exe.

于 2012-11-21T00:37:31.063 回答