パーティーに少し遅れていますが、エクスプローラウィンドウで既に開いているフォルダ内の1つ以上のファイルを選択する場合は、shell32の方法SHOpenFolderAndSelectItems
で行うことができます。このメソッドは、既存のウィンドウがあればそれを再利用し、そうでなければ新しいウィンドウを開きます。
[DllImport("shell32.dll")]
private static extern int SHOpenFolderAndSelectItems(IntPtr pidlFolder, uint cidl, [MarshalAs(UnmanagedType.LPArray)] IntPtr[] apidl, uint dwFlags);
[DllImport("shell32.dll")]
private static extern void SHParseDisplayName([MarshalAs(UnmanagedType.LPWStr)] string name, IntPtr bindingContext, out IntPtr pidl, uint sfgaoIn, out uint psfgaoOut);
public static void ShowFileInExplorer(string folderPath, string filePath)
{
Shell32.SHParseDisplayName(Path.GetFullPath(folderPath), IntPtr.Zero, out IntPtr folder, 0, out uint psfgaoOut);
if (folder == IntPtr.Zero)
{
return;
}
Shell32.SHParseDisplayName(Path.GetFullPath(filePath), IntPtr.Zero, out IntPtr file, 0, out psfgaoOut);
if (file != IntPtr.Zero)
{
IntPtr[] files = { file };
Shell32.SHOpenFolderAndSelectItems(folder, (uint)files.Length, files, 0);
Marshal.FreeCoTaskMem(file);
}
Marshal.FreeCoTaskMem(folder);
}
このサンプルでは1つのファイルのみが選択されていますが、複数のファイルを選択するために簡単に拡張できます。
なぜ、最初にエクスプローラを使用する必要がありますか?あなたは何を達成しようとしていますか? – ChrisBint
'System.Diagnostics.Process.Start(filePath)'を使わないのはなぜですか?あなたが割り当てられたデフォルトプログラムでファイルを開く方法です。 – Alex
@ChrisBint私たちのアプリはクライアントを持っています。各クライアントには、さまざまな文書が保存されるフォルダがあります。エクスプローラをクライアントフォルダに開くオプションが必要なので、クライアントのドキュメントを参照/編集/コピーすることができます。 –