23

次のように、Windows エクスプローラーで単一のファイルを表示して選択できます。

explorer.exe /select, "c:\path\to\file.txt"

ただし、複数のファイルを選択する方法がわかりません。私が試した選択の順列はどれも機能しません。

注: これらのページでドキュメントを確認しましたが、どちらも役に立ちませんでした。

https://support.microsoft.com/kb/314853
http://web.archive.org/web/20100716112458/http://www.infocellar.com:80/Win98/explorer-switches.htm

4

8 に答える 8

19

これはシェル関数で可能になるはずですSHOpenFolderAndSelectItems

編集

エラーチェックなしでC/C++で関数を使用する方法を示すサンプルコードを次に示します。

//Directory to open
ITEMIDLIST *dir = ILCreateFromPath(_T("C:\\"));

//Items in directory to select
ITEMIDLIST *item1 = ILCreateFromPath(_T("C:\\Program Files\\"));
ITEMIDLIST *item2 = ILCreateFromPath(_T("C:\\Windows\\"));
const ITEMIDLIST* selection[] = {item1,item2};
UINT count = sizeof(selection) / sizeof(ITEMIDLIST);

//Perform selection
SHOpenFolderAndSelectItems(dir, count, selection, 0);

//Free resources
ILFree(dir);
ILFree(item1);
ILFree(item2);
于 2010-06-10T02:36:47.240 に答える
8

エクスプローラーで複数のファイルを選択する本当の方法は次のとおりです

アンマネージドコードは次のようになります(バグを修正した中国のコード投稿からコンパイルされました)

static class NativeMethods
{
    [DllImport("shell32.dll", ExactSpelling = true)]
    public static extern int SHOpenFolderAndSelectItems(
        IntPtr pidlFolder,
        uint cidl,
        [In, MarshalAs(UnmanagedType.LPArray)] IntPtr[] apidl,
        uint dwFlags);

    [DllImport("shell32.dll", CharSet = CharSet.Auto)]
    public static extern IntPtr ILCreateFromPath([MarshalAs(UnmanagedType.LPTStr)] string pszPath);

    [ComImport]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    [Guid("000214F9-0000-0000-C000-000000000046")]
    public interface IShellLinkW
    {
        [PreserveSig]
        int GetPath(StringBuilder pszFile, int cch, [In, Out] ref WIN32_FIND_DATAW pfd, uint fFlags);

        [PreserveSig]
        int GetIDList([Out] out IntPtr ppidl);

        [PreserveSig]
        int SetIDList([In] ref IntPtr pidl);

        [PreserveSig]
        int GetDescription(StringBuilder pszName, int cch);

        [PreserveSig]
        int SetDescription([MarshalAs(UnmanagedType.LPWStr)] string pszName);

        [PreserveSig]
        int GetWorkingDirectory(StringBuilder pszDir, int cch);

        [PreserveSig]
        int SetWorkingDirectory([MarshalAs(UnmanagedType.LPWStr)] string pszDir);

        [PreserveSig]
        int GetArguments(StringBuilder pszArgs, int cch);

        [PreserveSig]
        int SetArguments([MarshalAs(UnmanagedType.LPWStr)] string pszArgs);

        [PreserveSig]
        int GetHotkey([Out] out ushort pwHotkey);

        [PreserveSig]
        int SetHotkey(ushort wHotkey);

        [PreserveSig]
        int GetShowCmd([Out] out int piShowCmd);

        [PreserveSig]
        int SetShowCmd(int iShowCmd);

        [PreserveSig]
        int GetIconLocation(StringBuilder pszIconPath, int cch, [Out] out int piIcon);

        [PreserveSig]
        int SetIconLocation([MarshalAs(UnmanagedType.LPWStr)] string pszIconPath, int iIcon);

        [PreserveSig]
        int SetRelativePath([MarshalAs(UnmanagedType.LPWStr)] string pszPathRel, uint dwReserved);

        [PreserveSig]
        int Resolve(IntPtr hwnd, uint fFlags);

        [PreserveSig]
        int SetPath([MarshalAs(UnmanagedType.LPWStr)] string pszFile);
    }

    [Serializable, StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode), BestFitMapping(false)]
    public struct WIN32_FIND_DATAW
    {
        public uint dwFileAttributes;
        public FILETIME ftCreationTime;
        public FILETIME ftLastAccessTime;
        public FILETIME ftLastWriteTime;
        public uint nFileSizeHigh;
        public uint nFileSizeLow;
        public uint dwReserved0;
        public uint dwReserved1;

        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
        public string cFileName;

        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 14)]
        public string cAlternateFileName;
    }

    public static void OpenFolderAndSelectFiles(string folder, params string[] filesToSelect)
    {
        IntPtr dir = ILCreateFromPath(folder);

        var filesToSelectIntPtrs = new IntPtr[filesToSelect.Length];
        for (int i = 0; i < filesToSelect.Length; i++)
        {
            filesToSelectIntPtrs[i] = ILCreateFromPath(filesToSelect[i]);
        }

        SHOpenFolderAndSelectItems(dir, (uint) filesToSelect.Length, filesToSelectIntPtrs, 0);
        ReleaseComObject(dir);
        ReleaseComObject(filesToSelectIntPtrs);
    }

    private static void ReleaseComObject(params object[] comObjs)
    {
        foreach (object obj in comObjs)
        {
            if (obj != null && Marshal.IsComObject(obj))
                Marshal.ReleaseComObject(obj);
        }
    }
}
于 2010-08-26T15:02:26.137 に答える
2

実際に達成したいことによっては、AutoHotKeyでそれを実行できる場合があります。これは、通常は実行できないことを自動化するためのすばらしい無料ツールです。Windowsに付属しているはずです。このスクリプトは、F12キーを押すと、ファイルを選択し、その下にある次の2つのファイルを強調表示します。

F12:: 
 run explorer.exe /select`, "c:\path\to\file.txt"
 SendInput {Shift Down}{Down}{Down}{Shift Up}
return

これらの2つの中間行をテキストファイルに入れて、それをautohotkey.exeに渡すこともできます。スクリプトをコンパイルするオプションもあります。これにより、スクリプトを呼び出すことができるスタンドアロンのexeファイルになります。優れたヘルプファイルでうまく機能します。

@ Orion、C#のautohotkeyを使用することができます。自動ホットキースクリプトをスタンドアロンの実行可能ファイル(約400k)にして、C#アプリで起動できます(エクスプローラーを起動するのと同じ方法で)。コマンドラインパラメータを渡すこともできます。実行時の要件はありません。

于 2008-08-13T05:56:33.527 に答える
2

explorer.exe では実行できません。

于 2008-08-13T00:47:43.337 に答える
1

これは、達成しようとしていること、およびより良い方法があるかどうかを検討するのがよい場合がある質問の1つです。

さらにコンテキストを追加するには-私たちの会社はC#クライアントアプリケーションを開発しています。これにより、ユーザーはファイルをロードして、実際のファイルをディスクに表示せずにMP3ファイルを管理する方法のようにファイルを操作できます。

アプリケーションでファイルを選択し、「Windowsエクスプローラーでこのファイルを表示する」コマンドを実行すると便利です。これは私が達成しようとしていることであり、単一のファイルに対して実行しています。

ユーザーがアプリケーション内で複数のファイルを選択し、それらを移動/削除などできるようにするListViewがあります。少なくともすべてのソースファイルが同じディレクトリにある場合は、この「Windowsでこのファイルを表示する」コマンドを複数の選択したファイルに対して機能させると便利ですが、それが不可能な場合は、主要な機能ではありません。

于 2008-08-17T20:52:22.750 に答える
0

FindWindowExWindows エクスプローラーの SysListView32 を取得し、 with を使用SendMessageLVM_SETITEMSTATEて項目を選択できると思います。アイテムの位置が分かりにくいのが難点・・・LVM_FINDITEMこれはこれで使えるかも。

于 2008-10-24T11:17:33.477 に答える
0

Grr私もこれをやりたいです。Media Player は、2 つ以上のファイルを選択して右クリックし、「ファイルの場所を開く」を実行するとそれを実行しますが、その方法が正確にはわかりません (また、procmon を使用してそれを理解するのに時間を費やす気もありません)。

于 2008-12-03T23:48:47.657 に答える