winapi — Как получить полный путь к проводнику Windows в Stack Overflow

Можно ли предположить, что проводник Windows всегда запускается из системного каталога Windows? Кроме того, его процесс всегда называется «explorer.exe»?

А если нет, как получить полный путь к файлу?

РЕДАКТИРОВАТЬ: Забыл упомянуть — мне нужно это, чтобы позже узнать идентификатор процесса Windows Explorer, запущенного в данной пользовательской сессии. Таким образом, мой поиск его полного пути.

РЕДАКТИРОВАТЬ 2: Спасибо всем, кто внес свой вклад, и особенно в sehe! После его поста я нашел эта страница это объясняет, как настроить свою собственную оболочку. Я сделал дикий тест, полностью заменив explorer.exe своим собственным процессом, и вот результат:
введите описание изображения здесь
Вот полноразмерная ссылка если вас это изменит.

Как видите, технически я могу заменить explorer.exe любым процессом, который мне может понадобиться. Как вы можете видеть на моем скриншоте, Windows дает мне полный контроль над Ракушка (Снимок экрана — все мое окно.)

Итак, суть в том, что единственный способ получить путь к файлу «explorer.exe» (или какой-либо другой процесс Shell) состоит в том, чтобы использовать эти ключи реестра по ссылке, которую я цитировал выше — в значительной степени близко к тому, что предлагал sehe, просто еще несколько проверок, но это довольно простая вещь.

Что касается предложения Шона Клайна, то это было бы очень элегантным решением ТОЛЬКО, если бы у нас был запущен «стандартный» Windows Explorer, который поставляется с окном трея с этим конкретным именем класса.

1

Решение

Вероятно, можно с уверенностью предположить, что explorer.exe всегда находится в% windir% или% SystemRoot%, так как он не перемещался годами. Но если вы пытаетесь вызвать что-то через Проводник, скорее всего, вы хотите использовать ShellExecute() вместо этого.

Если вам действительно нужен путь, самый простой способ получить его — позвонить SHGetKnownFolderPath() используя FOLDERID_Windows в качестве первого аргумента.

Редактировать:
Вот мой пример кода, зная, что вы ищете PID процесса оболочки:

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

Он ищет hwnd панели задач и находит PID-владелец. Скорее всего, вам потребуется добавить обработку ошибок в случае, если проводник не запущен и это окно не существует — маловероятно, но возможно.

4

Другие решения

Нет, вы не можете с уверенностью предположить, что и это не имеет ничего общего с 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"");
}
1

Да, обоим. Проводник Windows всегда находится по адресу %WINDIR%\Explorer.exe,

0
По вопросам рекламы [email protected]