Selectați programatic mai multe fișiere în Windows Explorer

Pot afișa și selecta un singur fișier în Windows Explorer astfel:

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

Cu toate acestea, nu pot lucra cum să selectați mai mult de un fișier. Nici una dintre permutările selectate nu am încercat să lucrez.

Notă: M-am uitat la aceste pagini pentru documente, nici nu am ajutat.

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

0
fr hi bn

6 răspunsuri

nu se poate face prin explorer.exe

0
adăugat

Aceasta este una dintre acele întrebări în care ar fi bine să vă gândiți la ceea ce încercați să realizați și dacă există o metodă mai bună.

Pentru a adăuga un alt context - Compania noastră dezvoltă o aplicație client C#, care permite utilizatorilor să încarce fișiere și să facă chestii cu ele, cum ar fi modul în care iTunes gestionează fișierele MP3 fără să vă arate fișierul real pe disc.

Este util să selectați un fișier din aplicație și să faceți o comandă "Arătați-mi acest fișier în Windows Explorer" - aceasta este ceea ce încerc să realizez și am făcut-o pentru fișierele unice.

Avem un ListView care permite utilizatorilor să selecteze mai multe fișiere din aplicație și să le mute/șterge/etc. Ar fi frumos să aveți acest "arătați-mi acest fișier în lucrarea de comandă Windows" pentru mai multe fișiere selectate - cel puțin dacă toate fișierele sursă sunt în același director, dar dacă nu este posibil atunci nu este o caracteristică majoră.

0
adăugat
Înlocuiți "arătați-mi acest fișier în ferestre" cu "arată în folderul ferestrelor" ("Windows" este opțional aici) - problema a fost rezolvată.
adăugat autor jfs, sursa
@FlakDiNenno: Am vrut să spun că (ca o opțiune inferioară) ai putea să deschizi folderul părinte care conține fișierele (fără a selecta fișierele). răspunsul flashk arată cum se deschide folderul și se selectează fișierele .
adăugat autor jfs, sursa
@ J.F.Sebastian Îmi pare rău ... v-ați putea expune puțin. Nu înțeleg cum rezolvă această problemă a lui OrionEdwards.
adăugat autor Flak DiNenno, sursa
ahh luat-o. nu m-ai cedat pentru că ți-ai cerut să explici ceva mai mult?
adăugat autor Flak DiNenno, sursa

În funcție de ceea ce doriți să realizați, este posibil să o faceți cu AutoHotKey . Este un uimitor instrument gratuit pentru automatizarea lucrurilor pe care nu le puteți face în mod normal. Ar trebui să vină cu Windows. Acest script va selecta fișierul dvs. și va evidenția următoarele două fișiere de sub el atunci când ați lovit F12.

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

Este, de asemenea, posibil să puneți doar cele două linii de mijloc într-un fișier text și apoi treceți-l este parm către autohotkey.exe. Ei au de asemenea opțiunea de a compila scenariul, ceea ce ar face ca acesta să fie un exe independent pe care să-l puteți apela. Funcționează excelent cu un fișier de ajutor excelent.

@Orion, Este posibil să utilizați autohotkey de la C #. Puteți face un script de auto-cheie într-un executabil standalone (aproximativ 400k) care poate fi lansat de aplicația dvs. C# (așa cum lansați exploratorul). De asemenea, puteți trece parametrii liniei de comandă. Nu are cerințe de rulare.

0
adăugat
De aceea am spus "depinde" și "poate fi capabil". Există multe opțiuni în cadrul tastei automate, inclusiv automatizarea unei căutări, am dat doar un exemplu.
adăugat autor bruceatk, sursa
Nu sunt sigur de ce acest lucru este marcat. AutoHotkey este o soluție excelentă atunci când trebuie să faci ceva ce nu poți să faci folosind un API existent. Are multe garanții care pot fi utilizate pentru a se asigura că programul corect este vizat. Există multe posibilități. Răspunsul care este marcat ca răspuns nu este un răspuns. Este doar o declarație evidentă, care este motivul pentru care întrebarea a fost întrebată în primul rând. Mi-ar sugera pe oricine să marcheze acest răspuns, ar trebui să privească mai întâi în AutoHotkey și să învețe ce poate face. Ar trebui să fie construit în
adăugat autor bruceatk, sursa
Nu va funcționa bine dacă fișierele nu sunt reciproce între ele?
adăugat autor Svish, sursa
@bruceatk fost de acord. Votat. RATM. Probabil cineva a fost prea pedantic cu privire la modul în care SO nu-i place când rezolvați problemele cu sugestiile bibliotecii, dar acest tip de răspuns (specific pentru context, cod exemplu și explicație a limitărilor și a puterii) este total în limitele și aplicabil problemei la mana.
adăugat autor Max von Hippel, sursa

Presupun că puteți utiliza FindWindowEx pentru a obține SysListView32 din Windows Explorer, apoi utilizați SendMessage cu LVM_SETITEMSTATE pentru a selecta elementele. Dificultatea de a cunoaște poziția articolelor ... Poate că LVM_FINDITEM poate fi folosită pentru acest lucru.

0
adăugat

This should be possible with the shell function SHOpenFolderAndSelectItems

EDIT

Iată câteva exemple de cod care arată modul de utilizare a funcției în C/C ++, fără a verifica erorile:

//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);
0
adăugat
Orice mai multe informații despre utilizarea acestei metode ar fi de ajutor ... nu pare să existe nimic la pinvoke.net pe ea, și nu sunt grozav cu interop.
adăugat autor devios1, sursa
Am actualizat postarea mea pentru a conține un exemplu de cod C/C ++
adăugat autor flashk, sursa
Ceva de notat: variabilele de selecție/numărare nu arată așa, dar conțin un 0 delimitator la sfârșit. Fără aceasta funcția SHOpenFolderAndSelectItems nu a selectat toate fișierele solicitate (adică în cazul calloc (), trece numărul de elemente + 1).
adăugat autor Karsten, sursa

Modul adevărat de selectare a mai multor fișiere în Explorer este următorul

Codul neadministrat arata astfel (compilate din posturile din China cu fixarea bug-urilor)

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);
        }
    }
}
0
adăugat
Acest lucru este într-adevăr minunat, a lucrat un tratament mulțumesc
adăugat autor joshcomley, sursa