سؤال

لا يمكن عرض واختر ملف واحد في مستكشف ويندوز مثل هذا:

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

ومع ذلك, لا يمكن العمل على كيفية اختيار أكثر من ملف واحد.أيا من التباديل من تحديد حاولت العمل.

ملاحظة:نظرت في هذه الصفحات على مستندات, لا يساعد.

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

هل كانت مفيدة؟

المحلول

هذا ينبغي أن يكون من الممكن مع شل وظيفة 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.فمن مذهلة أداة مجانية لأتمتة الأشياء التي عادة لا تستطيع أن تفعل.يجب أن تأتي مع ويندوز.هذا السيناريو سوف حدد الملف وتسليط الضوء على المقبلين الملفات أدناه عندما تضغط F12.

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

فمن الممكن أيضا أن مجرد وضع هذين منتصف خطوط في ملف نصي ومن ثم تمرير وهو بارما إلى autohotkey.exe.لديهم خيار تجميع السيناريو أيضا ، التي من شأنها أن تجعل مستقل exe التي يمكن أن تتصل.يعمل كبيرة مع ملف المساعدة.

@أوريون ، فمن الممكن استخدام اوتو هات كي-autohotkey من C#.يمكنك جعل اوتو هات كي-autohotkey النصي في مستقل قابل للتنفيذ (حوالي 400 ألف) التي يمكن إطلاقها بواسطة C# التطبيق (فقط بالطريقة التي كنت إطلاق explorer).يمكنك أيضا تمرير معلمات سطر الأوامر.أنه ليس لديه أي وقت المتطلبات.

هذا هو واحد من تلك الأسئلة التي قد يكون من الجيد أن تنظر ما تحاول تحقيقه ، وما إذا كانت هناك طريقة أفضل.

لإضافة المزيد من السياق شركتنا يطور C# التطبيق العميل الذي يسمح للمستخدمين لتحميل الملفات و هل الاشياء معهم مثل ما اي تيونز يدير ملفات MP3 الخاص بك دون أن تظهر لك الملف الفعلي على القرص.

من المفيد تحديد ملف في التطبيق ، 'عرض هذا الملف في" مستكشف Windows " ` الأمر - وهذا هو ما أحاول تحقيقه ، و به ملفات واحد.

لدينا ListView الذي يسمح للمستخدمين لتحديد ملفات متعددة داخل التطبيق ، و نقل/حذف/etc لهم.سيكون من الجميل أن يكون هذا 'عرض هذا الملف في ويندوز' قيادة العمل متعددة الملفات المحددة - على الأقل إذا كانت جميع الملفات المصدر في نفس الدليل ، ولكن إذا كان من غير الممكن بعد ذلك ليس سمة رئيسية.

أعتقد يمكنك استخدام FindWindowEx للحصول على SysListView32 من "مستكشف Windows" ثم استخدام SendMessage مع LVM_SETITEMSTATE لتحديد العناصر.صعوبة أن نعرف موقف من العناصر...ربما LVM_FINDITEM يمكن استخدام هذا.

Grr وأود أن تفعل ذلك أيضا.وسائل الاعلام لاعب يفعل ذلك عند تحديد 2+ ملفات انقر بزر الماوس الأيمن ثم هل "فتح موقع الملف" ولكن ليس متأكدا بالضبط كيف (ولا أشعر حقا مثل قضاء الوقت w/ procmon إلى معرفة ذلك).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top