Программно выбрать несколько файлов в проводнике Windows

Я могу отобразить и выбрать один файл в проводнике Windows следующим образом:

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

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

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

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

13.08.2008 00:35:50
Можете ли вы вспомнить, какие страницы вы искали? Обе ссылки уже устарели.
Wolf 17.05.2018 09:20:01
8 ОТВЕТОВ
РЕШЕНИЕ

Это должно быть возможно с помощью функции оболочки 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);
18
14.06.2010 16:52:02
Любая дополнительная информация об использовании этого метода была бы полезна ... на pinvoke.net, кажется, ничего нет, и я не очень хорош в Interop.
devios1 14.06.2010 15:02:02
Что-то заметное: переменные selection / count не похожи на это, но они содержат 0-разделитель в конце. Без этого функция SHOpenFolderAndSelectItems не выбрала все запрошенные файлы (это означает, что в случае calloc (), передать количество элементов + 1).
Karsten 16.04.2018 16:05:01
Если вы не хотите создавать программу самостоятельно, вы можете использовать инструмент, который я написал, используя ответы ваших парней в переполнении стека: github.com/aurire/windows-explorer-files-selector . Проверьте исходный код, не стесняйтесь изменять, или просто используйте скомпилированный исполняемый файл и инструкции по установке. Щелкните правой кнопкой мыши список файлов для выбора и нажмите «Выбрать файлы», вот и все.
Aurimas Rekštys 24.06.2018 17:33:54

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

2
13.08.2008 00:47:43
Есть ли другой инструмент, который будет работать?
u01jmg3 8.12.2019 21:21:13
откуда вы знаете?
Paul Sumpner 14.04.2020 05:26:48

В зависимости от того, чего вы на самом деле хотите достичь, вы можете сделать это с помощью 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, можно использовать autohotkey из C #. Вы можете превратить скрипт autohotkey в автономный исполняемый файл (около 400 КБ), который может быть запущен вашим приложением C # (именно так, как вы запускаете проводник). Вы также можете передать ему параметры командной строки. Он не имеет никаких требований времени выполнения.

1
21.08.2008 16:18:59
Не будет работать хорошо, если файлы не друг за другом, хотя?
Svish 6.12.2009 11:56:40
Вот почему я сказал «зависит» и «может быть в состоянии». В autohotkey есть много опций, включая автоматизацию поиска, я только что привел один пример.
bruceatk 8.12.2009 19:42:54
Я не уверен, почему это отмечено вниз. AutoHotkey - отличное решение, когда вам нужно сделать что-то, что вы просто не можете сделать с помощью существующего API. Он имеет много мер безопасности, которые могут быть использованы для обеспечения того, что правильная программа нацелена. Есть много возможностей. Ответ, помеченный как ответ, не является ответом. Это просто очевидное утверждение, которое является причиной, по которой вопрос был задан в первую очередь. Я бы посоветовал любому, отмечающему этот ответ, сначала заглянуть в AutoHotkey и узнать, что он может сделать. Это должно быть встроено в окна.
bruceatk 20.01.2010 17:37:11
@bruceatk согласился. Проголосовал. РАТМ. Возможно, кто-то был чрезмерно педантичен о том, что SO не нравится, когда вы решаете проблемы с предложениями библиотек, но этот тип ответа (специфический для контекста, примера кода и объяснения ограничений и возможностей) полностью в пределах и применим к проблеме под рукой.
Max von Hippel 16.07.2015 18:01:25

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

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

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

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

1
23.12.2009 23:57:54
Заменить «показать мне этот файл в windows» на «показать в папке windows» (здесь «windows» необязательно) - проблема решена.
jfs 3.12.2008 23:55:06
@JFSebastian извините ... не могли бы вы рассказать об этом немного? Я не понимаю, как это решает проблему OrionEdwards ... tia.
Flak DiNenno 5.11.2014 14:27:02
@FlakDiNenno: я имел в виду, что (в качестве низшей опции) вы можете просто открыть родительскую папку, содержащую файлы (без выбора файлов). Ответ flashk показывает, как открыть папку и выбрать файлы .
jfs 1.12.2014 17:25:55
ааа понял Вы не понизили меня за то, что я просто попросил вас объяснить немного больше, не так ли?
Flak DiNenno 2.12.2014 15:33:09

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

0
24.10.2008 11:17:33

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

0
3.12.2008 23:48:47

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

Неуправляемый код выглядит следующим образом (скомпилировано из публикаций кода в Китае с исправлением ошибок)

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);
        }
    }
}
7
26.08.2010 15:02:26

Есть интерфейсы COM Automation LateBinding IDispatch, они просты в использовании из PowerShell, Visual Basic.NET и C #, некоторые примеры кода:

$shell = New-Object -ComObject Shell.Application

function SelectFiles($filesToSelect)
{
    foreach ($fileToSelect in $filesToSelect)
    {
        foreach ($window in $shell.Windows())
        {
            foreach ($folderItem in $window.Document.Folder.Items())
            {
                if ($folderItem.Path -eq $fileToSelect)
                {
                    $window.Document.SelectItem($folderItem, 1 + 8)
                }
            }
        }
    }
}

-

Option Strict Off

Imports Microsoft.VisualBasic

Public Class ExplorerHelp
    Shared ShellApp As Object = CreateObject("Shell.Application")

    Shared Sub SelectFile(filepath As String)
        For Each i In ShellApp.Windows
            For Each i2 In i.Document.Folder.Items()
                If i2.Path = filepath Then
                    i.Document.SelectItem(i2, 1 + 8)
                    Exit Sub
                End If
            Next
        Next
    End Sub
End Class

https://docs.microsoft.com/en-us/windows/win32/shell/shellfolderview-selectitem

0
29.12.2019 05:51:52