我可以在Windows资源pipe理器中显示和select一个文件,如下所示:
explorer.exe /select, "c:\path\to\file.txt"
但是,我不能找出如何select多个文件。 我没有尝试工作的select排列组合。
注:我看了这些页面的文档,都没有帮助。
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); } } }
它不能通过explorer.exe来完成
根据你真正想要完成的事情,你可以用AutoHotKey来完成。 这是一个惊人的免费工具,用于自动化您通常无法做到的事情。 它应该与Windows一起来。 这个脚本将选择你的文件,并在你点击F12时突出显示下面的两个文件。
F12:: run explorer.exe /select`, "c:\path\to\file.txt" SendInput {Shift Down}{Down}{Down}{Shift Up} return
也可以把这两个中间行放在一个文本文件中,然后将它传递给autohotkey.exe。 他们也可以选择编译脚本,这将使其成为一个独立的exe文件,您可以调用。 很好的帮助文件。
@Orion,可以使用C#中的autohotkey。 你可以将一个autohotkey脚本变成一个独立的可执行文件(大约400k),可以由你的C#应用程序启动(就像启动资源管理器一样)。 你也可以传递它的命令行参数。 它没有任何运行时要求。
这是其中一个问题,考虑你想要达到的目标,以及是否有更好的方法。
添加更多的上下文 – 我们公司开发了一个C#客户端应用程序,它允许用户加载文件并用它们做东西,就像iTunes管理你的MP3文件,而不显示你的磁盘上的实际文件。
在应用程序中选择一个文件是非常有用的,并且在Windows资源管理器命令中显示这个文件 – 这是我正在尝试实现的,并且已经为单个文件完成了。
我们有一个ListView允许用户选择应用程序中的多个文件,并移动/删除/等等。 这将是很高兴有这个“让我看看这个文件在Windows中”的命令工作多个选定的文件 – 至少如果所有的源文件在同一目录,但如果这是不可能的,那么它不是一个主要的功能。
我想你可以使用FindWindowEx
来获取Windows资源管理器的LVM_SETITEMSTATE
,然后使用SendMessage
和LVM_SETITEMSTATE
来选择项目。 难以知道项目的位置……也许LVM_FINDITEM
可以用于这个。
Grr我也想这样做。 媒体播放器,当你选择2+文件,并右键单击,并执行“打开文件的位置”,但不完全确定如何(也不是真的觉得花时间w / procmon搞清楚)。