2008-08-13 3 views
17

можно отобразить и выбрать один файл в окне проводника, как это:Программным выбрать несколько файлов в окне проводника

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

Однако, я не могу работать, как выбрать более одного файла. Ни одна из перестановок выбора, которую я пробовал, работает.

Примечание. Я просмотрел эти страницы для документов, но не помог.

https://support.microsoft.com/kb/314853
http://www.infocellar.com/Win98/explorer-switches.htm

ответ

16

Это должно быть возможно с помощью функции оболочки SHOpenFolderAndSelectItems

EDIT

Ниже приведен пример кода, показывающий, как использовать эту функцию в 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); 
2

это не может быть сделано через explorer.exe

1

В зависимости от того, что вы на самом деле хотите достичь, вы можете быть в состоянии сделать это с AutoHotKey. Это потрясающий бесплатный инструмент для автоматизации вещей, которые вы обычно не можете делать. Он должен поставляться с Windows. Этот скрипт выберет ваш файл и выделит следующие два файла ниже, когда вы нажмете F12.

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

Также можно просто поставить эти две средние строки в текстовом файле, а затем передать это PARM к AutoHotkey.exe. У них есть возможность скомпилировать сценарий, который сделает его автономным exe, который вы могли бы назвать. Отлично работает с файлом большой помощи.

@Orion, можно использовать autohotkey от C#. Вы можете сделать скрипт authotkey в автономный исполняемый файл (около 400 тыс.), Который может быть запущен вашим приложением C# (только так, как вы запускаете проводник). Вы также можете передать параметры командной строки. Он не имеет каких-либо требований времени выполнения.

+0

Не будет работать, если файлы не будут друг после друга? – Svish 2009-12-06 11:56:40

+0

Вот почему я сказал «в зависимости» и «может быть в состоянии». В autohotkey есть много вариантов, включая автоматизацию поиска, я просто привел один пример. – bruceatk 2009-12-08 19:42:54

+1

Я не уверен, почему это отмечено. AutoHotkey - отличное решение, когда вам нужно сделать что-то, что вы просто не можете сделать, используя существующий API. Он имеет множество гарантий, которые могут быть использованы для обеспечения правильной программы. Есть много возможностей. Ответ, отмеченный как ответ, не является ответом. Это просто очевидное утверждение, которое является причиной того, что вопрос был задан в первую очередь. Я бы предложил, чтобы кто-нибудь, отмечающий этот ответ, сначала должен изучить AutoHotkey и узнать, что он может сделать. Он должен быть встроен в окна. – bruceatk 2010-01-20 17:37:11

1

Это один из тех вопросов, где может быть полезно рассмотреть, чего вы пытаетесь достичь, и есть ли лучший метод.

Чтобы добавить некоторый контекст - Наша компания разрабатывает C# клиентское приложение, которое позволяет пользователям загружать файлы и делать вещи с ними, вроде как ITunes управляет MP3-файлов, не показывая вам сам файл на диске ,

Полезно выбрать файл в приложении и выполнить команду «Показывать мне этот файл в Windows Explorer» - это то, чего я пытаюсь достичь, и сделал это для отдельных файлов.

У нас есть ListView, который позволяет пользователям выбирать несколько файлов в приложении и перемещать/удалять/и т. Д. Было бы неплохо, если бы команда «показать мне этот файл в Windows» для нескольких выбранных файлов - по крайней мере, если все исходные файлы находятся в одном каталоге, но если это невозможно, это не является важной особенностью.

0

Предположим, вы можете использовать FindWindowEx, чтобы получить SysListView32 проводника Windows, затем используйте SendMessage с LVM_SETITEMSTATE, чтобы выбрать элементы. Трудность состоит в том, чтобы знать положение предметов ... Возможно, LVM_FINDITEM можно использовать для этого.

0

Grr Я также хотел бы сделать это. Media Player делает это, когда вы выбираете 2+ файла и щелкаете правой кнопкой мыши и делаете «открывать местоположение файла», но не совсем точно знаете, как (и я действительно не хочу тратить время с помощью procmon, чтобы понять это).

5

Истинный способ выбора нескольких файлов в проводнике - следующий

Неуправляемый код выглядит так:

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); 
     } 
    } 
} 
Смежные вопросы