1

Windows エクスプローラーが常に Windows システム ディレクトリから起動されると想定しても問題ありませんか? また、そのプロセスは常に「explorer.exe」という名前ですか?

そうでない場合、その完全なファイルパスを取得する方法は?

編集:言及するのを忘れました-特定のユーザーセッションで実行されているWindowsエクスプローラーのプロセスIDを後で見つけるためにこれが必要です。したがって、そのフルパスを検索します。

編集 2:貢献してくれた皆さん、特に sehe に感謝します! 彼の投稿の後、独自のシェルをセットアップする方法を説明するこのページを見つけました。explorer.exeを自分のプロセスに完全に置き換えてワイルド テストを行ったところ、結果は次 ここに画像の説明を入力 のようになりました。

ご覧のとおり、技術的には、explorer.exe を思いついたプロセスに置き換えることができます。私のスクリーンショットでもわかるように、Windows ではシェルを完全に制御できます(スクリーンショットは私のウィンドウ全体です)。

要するに、「explorer.exe」ファイル パス (または使用されているシェル プロセス) を取得する唯一の方法は、上で引用したリンクからこれらのレジストリ キーを使用することです。さらにいくつかのチェックを行う必要がありますが、それは非常に簡単なことです。

Sean Cline の提案に関しては、その特定のクラス名を持つトレイ ウィンドウが付属する「ストック」Windows Explorer を実行している場合にのみ、非常にエレガントなソリューションになります。

4

3 に答える 3

4

何年も移動していないため、explorer.exe は常に %windir% または %SystemRoot% にあると想定しても問題ありません。ただし、Explorer を介して何かを呼び出そうとする場合は、代わりにShellExecute () 関数を使用する可能性があります。

本当にパスが必要な場合は、最初の引数として FOLDERID_Windows を使用してSHGetKnownFolderPath () を呼び出すのが最も簡単な方法です。

編集: これは、シェルプロセスの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 Explorer は常に にあり%WINDIR%\Explorer.exeます。

于 2012-11-21T00:37:31.063 に答える