2011-11-18 33 views
8

私は簡単にエクスプローラが開き、次を使用してファイルを選択するために取得することができます:私は、次のファイルを開くに来たときに既存のExplorer.exeインスタンスを設定してファイルを選択するにはどうすればよいですか?

string argument = @"/select, " + filePath; 
System.Diagnostics.Process.Start("explorer.exe", argument); 

しかし、私は、エクスプローラの新しいインスタンスを取得します。これにより、集中的な日の終わりまでに数百人の探検家がオープンしたユーザーがオープンする可能性があります。

既に開いているエクスプローラインスタンスを再利用して、必要なファイルを選択するにはどうすればよいですか?

Visual Studioでは、タブを右クリックして、を選択すると開くことができます。エクスプローラが既に同じディレクトリに開かれているを提供しています。どのようにこれを行うことができましたか?

+3

なぜ、最初にエクスプローラを使用する必要がありますか?あなたは何を達成しようとしていますか? – ChrisBint

+0

'System.Diagnostics.Process.Start(filePath)'を使わないのはなぜですか?あなたが割り当てられたデフォルトプログラムでファイルを開く方法です。 – Alex

+0

@ChrisBint私たちのアプリはクライアントを持っています。各クライアントには、さまざまな文書が保存されるフォルダがあります。エクスプローラをクライアントフォルダに開くオプションが必要なので、クライアントのドキュメントを参照/編集/コピーすることができます。 –

答えて

3

いかがembedding the Explorer window into your application?そうすれば、別のフォルダを表示するときに別のフォルダのIExplorerBrowser::BrowseToObjectを呼び出すだけで、ウィンドウを再利用し続けることができます。

既存のエクスプローラウィンドウを無効にしようとすると、ユーザーが見ていないときにそのウィンドウで何をしたのかわからないため、問題があります。たぶん彼らはフォルダペインを使って別のフォルダに行きました。そしてブームあなたはそのフォルダをその下から切り取って別の場所に送りました。あるいは彼らはそれを閉じたかもしれない!新しいエクスプローラウィンドウを開くことは、火の玉のようなものです。ウィンドウの制御を保持したい場合は、より明示的な制御を行う必要があります(例えば上記のExplorerBrowser経由)。

+0

Windows自体は、開かれたエクスプローラウィンドウを再利用するこの動作を使用します。たとえば、フォルダを選択してCtrl + Enterキーを入力すると、新しいウィンドウで開きます。もう一度やり直すと、新しいウィンドウインスタンスが開かれません。 –

+0

これは、既存のウィンドウを更新するのと同じではありません。 –

+0

よく、次にショートカット(Windows 7)でコンテキストメニューを使用して、「ターゲットを探す」または同様のもの(私はスペイン語版がある)をクリックします。ターゲットファイルが開いているウィンドウにある場合、Windowsはそれを再利用します。 –

0

Processクラスのインスタンスを取得し、常にそれを使用してStart()メソッドを呼び出そうとしましたか?

Process myProcess = new Process(); 
string argument = @"/select, " + filePath; 

myProcess.StartInfo.FileName = argument; 
myProcess.Start(); 
+0

これは、以前の呼び出しと同じパスの場合に機能します。さまざまなパスで新しいウィンドウを開きます。 – Alex

+0

[ドキュメント](http://msdn.microsoft.com/en-us/library/system.diagnostics.process.aspx)によると、Start()はプロセスリソースを開始(または再利用)します。つまり、 'myProcess.StartInfo.FileName'の値を変更して、' Start() 'をもう一度呼び出すことができますか? – Widor

+1

@Widorこれは答えではなく、むしろ質問です。それが回答者から働くかどうかを確認せずに、それは純粋な推測です。 – Marek

0

もう1つのアプローチは、Win32 APIの方法です。 ExplorerBrowserオブジェクトを使用して

StringBuilder sb = new StringBuilder(@"C:\temp\"); 
hWnd = (...) // get Handle of the Explorer's address field. 
SendMessage(hWnd, WM_SETTEXT, new IntPtr(sb.ToString().Length), sb) 

// Set the focus to the address field

SendMessage(hWnd, WM_SETFOCUS, IntPtr.Zero, null) 
// Simulate Enter key 
SendMessage(hWnd, WM_KEYDOWN, new IntPtr(VK_RETURN), null) 
+2

アドレスフィールドを取得するポータブルな方法はなく、メッセージを送信して確実に入力をシミュレートすることはできません。 –

+1

エクスプローラプロセスのすべての子ウィンドウを列挙し、CLASSを調べることで、アドレスフィールドを見つけることができます。 Spy ++を見てください。 – Alex

+3

特定のCLASSの狩猟は移植できません。アドレスバーのクラス名は何年にもわたって変化しており、将来的には再び変化する可能性があります。 –

1

パーティーに少し遅れていますが、エクスプローラウィンドウで既に開いているフォルダ内の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つのファイルのみが選択されていますが、複数のファイルを選択するために簡単に拡張できます。

関連する問題