17

私の目標は、特定のファイルを選択して、Windowsエクスプローラーウィンドウを開くC#コードを作成することです。そのような窓がすでに開いているなら、私はそれを前面に持ってきたいです。私は2つのオプションを試しました。

まず、明示的に呼び出すことから始めexplorer.exeます:

arg = "/select, " + pathToFile;
Process.Start("explorer.exe", arg);

これにより、ウィンドウが開いて正常に選択されますが、問題は、ウィンドウが存在する場合でも、常に新しいウィンドウが開くことです。だから私はこれを試しました:

Process.Start(pathToDir);

これにより、新しいウィンドウが開くか、古いウィンドウがフォーカスされますが、ファイルを選択するオプションがありません。

私に何ができる?explorerの引数を調べましたが、使用できるものが見つかりません。私が思いつくことができる最後の手段のオプションは、すでに開いているウィンドウのリストを取得し、それを処理するためにいくつかのWINAPIレベルのコードを使用することですが、それはやり過ぎのようです。

4

1 に答える 1

15

プロセス開始を使用して可能かどうかはわかりませんが、次のコードは、必要な場合にのみ(フォルダーが既に開いているか、別のファイルで選択されている場合は再利用されます)、含まれているフォルダーでWindowsエクスプローラーを開き、目的のファイルを選択します。

SHOpenFolderAndSelectItems関数でp/invoke相互運用コードを使用しています。

public static void OpenFolderAndSelectFile(string filePath)
{
    if (filePath == null)
        throw new ArgumentNullException("filePath");

    IntPtr pidl = ILCreateFromPathW(filePath);
    SHOpenFolderAndSelectItems(pidl, 0, IntPtr.Zero, 0);
    ILFree(pidl);
}

[DllImport("shell32.dll", CharSet = CharSet.Unicode)]
private static extern IntPtr ILCreateFromPathW(string pszPath);

[DllImport("shell32.dll")]
private static extern int SHOpenFolderAndSelectItems(IntPtr pidlFolder, int cild, IntPtr apidl, int dwFlags);

[DllImport("shell32.dll")]
private static extern void ILFree(IntPtr pidl);
于 2013-01-30T10:25:02.873 に答える