Windows エクスプローラーでプログラムによって複数のファイルを選択する
-
08-06-2019 - |
質問
次のように Windows エクスプローラーで単一のファイルを表示して選択できます。
explorer.exe /select, "c:\path\to\file.txt"
ただし、複数のファイルを選択する方法がわかりません。私が試した選択の順列はどれも機能しませんでした。
注記:これらのページのドキュメントを参照しましたが、どちらも役に立ちませんでした。
https://support.microsoft.com/kb/314853
http://www.infocellar.com/Win98/explorer-switches.htm
解決
これはシェル関数でできるはずです 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);
他のヒント
エクスプローラーで複数のファイルを選択する本当の方法は次のとおりです。
アンマネージ コードは次のようになります (中国のコード投稿からバグを修正してコンパイルされました)
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);
}
}
}
Explorer.exe では実行できません
実際に達成したい内容に応じて、次のように実行できる場合があります。 オートホットキー. 。これは、通常は実行できないことを自動化するための素晴らしい無料ツールです。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#からオートホットキーを使用することが可能です。自動ホットキー スクリプトをスタンドアロンの実行可能ファイル (約 400k) に作成し、C# アプリで起動できるようにすることができます (エクスプローラーを起動するのと同じ方法です)。コマンドラインパラメータを渡すこともできます。実行時の要件はありません。
これは、何を達成しようとしているのか、より良い方法があるかどうかを検討した方がよい質問の 1 つです。
いくつかのコンテキストを追加するために - 当社はC#クライアントアプリケーションを開発します。これにより、ユーザーはファイルをロードしてそれらを使用できるようになります。これは、iTunesがディスク上の実際のファイルを表示せずにMP3ファイルを管理する方法のようなものです。
アプリケーションでファイルを選択し、「Windows エクスプローラーでこのファイルを表示」コマンドを実行すると便利です。これが私が達成しようとしていることであり、単一のファイルに対して実行しました。
ユーザーがアプリケーション内で複数のファイルを選択し、それらを移動/削除などできるようにする ListView があります。この「Windows でこのファイルを表示」コマンドが、選択した複数のファイルに対して機能すると便利ですが、少なくともすべてのソース ファイルが同じディレクトリ内にある場合には便利ですが、それが不可能な場合は、主要な機能ではありません。
使えると思います FindWindowEx
Windows エクスプローラーの SysListView32 を取得するには、次を使用します。 SendMessage
と LVM_SETITEMSTATE
を押して項目を選択します。アイテムの位置がわかりにくいのが難点…多分 LVM_FINDITEM
これに使用できます。
ああ、私もこれをやりたいと思っています。Media Player では、2 つ以上のファイルを選択して右クリックして「ファイルの場所を開く」と実行されますが、その方法が正確にはわかりません (また、それを理解するために procmon に時間を費やす気もありません)。