Soru Windows Gezgini'nde programatik olarak birden fazla dosya seçin


Windows Gezgini'nde tek bir dosyayı aşağıdaki gibi görüntüleyebilir ve seçebilirim:

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

Ancak, birden fazla dosya seçmek için çalışamıyorum. Seçme izinlerinin hiçbiri çalışmayı denemedim.

Not: Bu sayfalara dokümanlar için baktım.

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


18
2017-08-13 00:35


Menşei


Aradığınız sayfaları hatırlıyor musunuz? Her iki link de artık güncel değil. - Wolf


Cevaplar:


Bu kabuk fonksiyonu ile mümkün olmalıdır SHOpenFolderAndSelectItems

DÜZENLE

Aşağıda, C / C ++ işlevinin, hata denetimi yapılmadan nasıl kullanılacağını gösteren örnek kod verilmiştir:

//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);

17
2018-06-10 02:36



Bu yöntemi kullanmayla ilgili daha fazla bilgi yardımcı olabilir ... üzerinde pinvoke.net'de bir şey yok gibi görünüyor ve birlikte çalışma ile pek iyi değilim. - devios1
Gönderiyi örnek C / C ++ kodu içerecek şekilde güncelledim - flashk
Bir şey not: seçim / sayım değişkenleri gibi görünmüyor, ama sonunda bir 0-sınırlayıcı içerir. Bu olmadan SHOpenFolderAndSelectItems işlevi istenen tüm dosyaları seçmedi (bu, calloc () durumunda, öğe sayısını + 1) içermez. - Karsten
Kendiniz bir program oluşturmak istemezseniz, bülten taşmasıyla adamların cevaplarını kullanarak yazdığım bir aracı kullanabilirsiniz: github.com/aurire/windows-explorer-files-selector . Kaynağı kontrol edin, değiştirmek için çekinmeyin veya sadece derlenmiş bir exe dosyası kullanın ve talimatları yükleyin. Seçilecek dosyaların listesine sağ tıklayın ve seçili dosyaları seçin, işte bu kadar. - Aurimas Rekštys


Explorer'da birden fazla dosya seçmenin gerçek yolu bir sonraki

Yönetilmeyen kod bu gibi görünüyor (hataların düzeltilmesiyle Çin kod mesajlarından derlenmiştir)

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);
        }
    }
}

5
2017-08-26 15:02



Bu gerçekten harika, çok işe yaradı - joshcomley


explorer.exe ile yapılamaz


2
2017-08-13 00:47





Gerçekte yapmak istediğin şeye bağlı olarak bunu yapmak mümkün olabilir. AutoHotKey. Normalde yapamayacağınız şeyleri otomatikleştirmek için inanılmaz bir ücretsiz araçtır. Windows ile birlikte gelmelidir. Bu betik dosyanızı seçecek ve F12'ye bastığınızda aşağıdaki iki dosyayı vurgulayacaktır.

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

Ayrıca bu iki orta satırı bir metin dosyasına yerleştirmek ve daha sonra autohotkey.exe dosyasına geçmek de mümkündür. Komut dosyasını da derlemek için bir seçenek var, bu da onu arayabileceğiniz bağımsız bir exe yapar. Harika bir yardım dosyasıyla harika çalışır.

@ Orion, C # 'den autohotkey kullanmak mümkündür. Bir autohotkey komut dosyasını C # uygulamanız tarafından başlatılabilen (400 k kadar) bağımsız bir çalıştırılabilir dosyaya dönüştürebilirsiniz (sadece gezgini başlattığınız gibi). Ayrıca komut satırı parametrelerini de geçirebilirsiniz. Herhangi bir çalışma zamanı gereksinimi yoktur.


1
2017-08-13 05:56



Dosyalar birbiri ardına olmuyorsa iyi çalışmaz mı? - Svish
Bu yüzden "bağlı" ve "yapabiliyor" dedim. Otomatik aramada otomatik arama dahil birçok seçenek var, sadece bir örnek verdim. - bruceatk
Bunun neden işaretlendiğinden emin değilim. AutoHotkey, mevcut bir API kullanarak yapamayacağınız bir şey yapmanız gerektiğinde mükemmel bir çözümdür. Doğru programın hedeflendiğinden emin olmak için kullanılabilecek birçok korumaya sahiptir. Birçok olasılık var. Cevap olarak işaretlenen cevap, bir cevap değil. Bu, sorunun en başta sorulmasının nedeni olan açık bir ifadedir. Bu cevabı işaretleyen herkese önce AutoHotkey'e bakmalı ve neler yapabileceğini öğrenmeliyim. Pencerelere yerleştirilmelidir. - bruceatk
@bruceatk kabul etti. Oy verildi. RATM. Muhtemelen birisi kütüphane önerileriyle ilgili problemleri çözdüğünüzde SO'nun nasıl hoşlanmadığı hakkında aşırı derecede titiz davranıyordu, fakat bu tür bir cevap (bağlam, örnek kod ve sınırlamaların ve gücün açıklaması) tamamen sınırlar içinde ve problem için uygulanabilir. elde. - Max von Hippel


Bu, neyi başarmaya çalıştığınızı ve iyi bir yöntem olup olmadığını düşünmenin iyi olabileceği sorulardan biridir.

Daha fazla bağlam eklemek için - Şirketimiz, kullanıcıların dosyaları yüklemelerine ve bunlarla ilgili bir şeyler yapmasına izin veren bir C # istemci uygulaması geliştirmektedir. İTunes, MP3 dosyalarını MP3 dosyalarınızı disk üzerinde gerçek dosyayı göstermeden nasıl yönetmektedir.

Uygulamada bir dosya seçmek ve 'Bu dosyayı Windows Gezgini'nde göster' komutunu yapmak yararlıdır; bu, elde etmeye çalıştığım şeydir ve tek dosya için bunu yapmıştır.

Kullanıcıların uygulama içinde birden fazla dosya seçmelerine ve bunları taşı / sil / etc etmelerine izin veren bir ListView var. Birden çok seçili dosya için bu 'pencerede bu dosyayı göster' komutunun olması güzel olurdu - en azından tüm kaynak dosyalar aynı dizinde bulunuyorsa, ancak mümkün değilse önemli bir özellik değildir.


1
2017-08-17 20:52



'Bu dosyayı Windows'ta göster' yerine 'windows klasöründe göster' ile değiştir ('windows' isteğe bağlı buradadır) - problem çözüldü. - jfs
@ J.F.Sebastian üzgünüm ... bunu biraz açıklayabilir misin? Bunun OrionEdwards'un problemini nasıl çözdüğünü anlamıyorum. - Flak DiNenno
@FlakDiNenno: Ben (daha düşük bir seçenek olarak) dosyaları içeren ana dosyaları (dosyaları seçmeden) açabileceğinizi kastediyorum. flaşın cevabı klasörün nasıl açılacağını gösterir ve dosyaları seç. - jfs
Ahh anladım. Senden biraz daha fazlasını açıklamanı istediğin için beni reddetmedin mi? - Flak DiNenno


Sanırım kullanabilirsin FindWindowEx SysListView32 Windows Gezgini'ni almak için SendMessage ile LVM_SETITEMSTATE öğeleri seçmek için Eşyaların konumunu bilmek zorluğu ... Belki de LVM_FINDITEM Bunun için kullanılabilir.


0
2017-10-24 11:17





Grr bunu da yapmak isterim. Media Player, 2+ dosya seçip sağ tıkla ve "dosya konumunu aç" yap, ama tam olarak nasıl emin olamadığımı (ne zaman anlamaya çalışmak için zaman harcıyor gibi hissetmiyorum) yapar.


0
2017-12-03 23:48