我可以在Windows资源管理器中显示和选择单个文件,如下所示:
explorer.exe /select, "c:\path\to\file.txt"
但是,我无法弄清楚如何选择多个文件.没有选择的排列我尝试过工作.
注意:我查看了这些页面的文档,但没有帮助.
https://support.microsoft.com/kb/314853
http://www.infocellar.com/Win98/explorer-switches.htm
这应该可以使用shell函数 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); } } }