20

私のアプリケーションでは、プログラムでエクスプローラーを開き、次のコードを使用してファイルを選択できます。

void BrowseToFile(LPCTSTR filename)
{
    CString strArgs; 
    strArgs = _T("/select,\"");
    strArgs += filename; 
    strArgs += _T("\"");

    ShellExecute(0, _T("open"), _T("explorer.exe"), strArgs, 0, SW_NORMAL);
}

私の問題は、この関数を別のファイルでもう一度呼び出すと、同じフォルダー内で、エクスプローラーでの選択が新しいファイルに変更されず、前のファイルに残ることです。

たとえば、関数を で呼び出すとC:\path\to\file1.txt、新しいエクスプローラー ウィンドウが開き、file1.txt選択されます。関数を で 2 回呼び出すとC:\path\to\file2.txt、既存のエクスプローラ ウィンドウがアクティブになりますが、選択はまだ on のままfile1.txtです。

エクスプローラーに選択を強制的に更新させる方法、またはこれを達成するためのより良い方法はありますか?

編集:

上記の動作は Windows XP でのものでした。Vista / Win7 での挙動が違うようです。呼び出しごとに、エクスプローラーの新しいインスタンスが開き、ファイルが選択されます。

私の主な目標は、ドキュメントのOpen Containing Folderに Visual Studio オプションをレプリケートすることです。Visual Studio のこの機能は、XP、Vista、および Win7 で同じように動作します。同じフォルダーを持つ別のインスタンスが既に開いている場合、新しいインスタンスは作成されませんが、選択内容が新しいファイルに更新されます。

Visual Studio がこれをどのように達成するかを知っている人がいれば、ぜひ知りたいです。

4

3 に答える 3

36

私の質問に対する答えが見つかりました。シェル関数を使用する必要がありますSHOpenFolderAndSelectItems。誰かが興味を持っている場合は、関数のコードを次に示します。

void BrowseToFile(LPCTSTR filename)
{
    ITEMIDLIST *pidl = ILCreateFromPath(filename);
    if(pidl) {
        SHOpenFolderAndSelectItems(pidl,0,0,0);
        ILFree(pidl);
    }
}
于 2010-06-10T00:15:13.720 に答える
4

「/n」オプションを試してください。ただし、これにより新しいフォルダーが開きます - おそらく既に開かれています。ただし、少なくとも、指定したファイルが選択されます。

/n,/select,<path_and_filename>

私の場合、SHOpenFolderAndSelectItemsは常に失敗し、その理由がわかりません。ところで、これを呼び出す前に CoInitialize/CoInitializeEx を呼び出す必要があります。

于 2011-12-05T19:07:25.063 に答える
0

概説した場合、ファイルウィンドウは、アクティブ化されたときではなく、初期化されたときにのみファイルを選択するように見えます。

これは面倒なように感じますが、XP を検出し、そのハンドルを使用してダイアログを閉じ、別のファイルを対象とする新しいダイアログを開くことができます。

于 2010-06-09T22:34:28.273 に答える