Выборочный выбор множества папок и множества файлов в OpenFileDialog. Как это возможно?


#1


#2

Там есть 2 свойства которые рядом по точке отображаются. 1 даёт 1 файл, а другое все файлы.

Пройдитесь по всех свойствам и методам перед тем как вопросы задавать. Ну не сложно же описания прочитать.


#3

вы видимо картинку не смотрели. я понимаю такие вопросы затрагивают ваше самолюбие, не хочу вас обижать, но то о чем вы говорите ушь слишком примитивно, для этого существует свойство Multiselect. Я, же привел пример результата множественного (при этом выборочного) выбора ПАПОК, ПОВТОРЯЮ ПАПОК. НО, есть загвоздка, когда я выбираю ПАПКИ то файлов нет, а когда выбираю ФАЙЛЫ, папок нет в диалоговом окне, в смысле они не отображаются.


#4

А, я подумал у вас проблема с получением имён выбранных файлов… А то что вам надо - я никогда не видел и найти сейчас не могу.

Попробуйте наследовать от 1 из предков OpenFileDialog, или, если не получится - то только писать полностью велосипедный класс-диалог.


#5

у меня возникла мысль, отправить выделенное из одного диалога (который позволяет выделять и папки и файлы но открывает только файлы) в диалог (который открывает папки). Вот только не пойму как выдернуть выделенную область из OptyFileDialog, но точно знаю что он дает перегружать свои методы.

Подскажите, как выдернуть выделенную область из одного стандартного OpenFileDialog и присвоить ее в точно такой же другой OpenFileDialog.


#6

Я вам говорю, попробуйте наследовать от FileDialog. Если там не выйдет - то только инъекциями кода, потому что OpenFileDialog это только оболочка для WinAPI, то есть рефлекция не поможет. Но я в этом не разбираюсь, и сомневаюсь что это возможно, потому что инъекции кода в стандартные неуправляемые библиотеки звучит как что то что бы нарушало безопасность.


#7
    во нарыл Структура BROWSEINFOA
    Содержит параметры для SHBrowseForFolder функцию и получает информацию о папке, 
   выбранной пользователем.
    Тип: hwnd элемента
    Дескриптор окна владельца для диалогового окна.

https://docs.microsoft.com/ru-ru/windows/desktop/api/shlobj_core/ns-shlobj_core-_browseinfoa


#8

Ну, это же то, поверх чего строится System.Windows.Forms.FolderBrowserDialog. Я не увидел среди параметров того, что может разрешить выбирать файлы… А структура эта, вроде, только для создания этого диалога. Ну, попробуйте через тамшнюю возможность валидации имён сделать.


#9

А, как перед закрытием диалогового окна OpenFileDialog, скопировать выделенную область, к примеру имитацией нажатия клавиш (Ctrl + C) = SendKeys.Send("^{c}"); или SendKeys.SendWait("^{c}");


#10

Если пользователь не нажал ok - то, поидее, только имитацией нажатия клавишь. Только SendKeys кривовато работает часто, а в большинстве случаев не работает вообще. Лучше использовать keybd_event.

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


#11

Ну с нажатием я разобрался

//..............................................................................................
        [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true, CallingConvention = CallingConvention.Winapi)]
        public static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int extraInfo);

        [DllImport("user32.dll")]
        static extern short MapVirtualKey(int wCode, int wMapType);
        //..............................................................................................

        keybd_event((int)Keys.ControlKey, (byte)MapVirtualKey((int)Keys.ControlKey, 0), 0, 0); // Control Down

        keybd_event((int)Keys.С, (byte)MapVirtualKey((int)Keys.C, 0), 0, 0); // С Down
        keybd_event((int)Keys.С, (byte)MapVirtualKey((int)Keys.C, 0), 2, 0); // С Up

        keybd_event((int)Keys.ControlKey, (byte)MapVirtualKey((int)Keys.ControlKey, 0), 2, 0); // Control Up       
            //...........................................

Но как отработать, если фокус переносится на кнопку ??? как оставить фокус в окне выбора файлов?


#12

Ну так винда же не даст перевести фокус с окна выбора файла. А если вы про перенос фокуса на другую программу - через WinAPI можно как то получить дескриптор любого окна, в том числе окна выбора файла, и проверять, только если сейчас фокус на этом окне - только тогда посылать Ctrl+C.


#13

функция API DefWindowProc передает сообщения диалоговым окнам

  [DllImport("user32.dll")]
            static extern IntPtr DefWindowProc(IntPtr hWnd, uint uMsg, IntPtr wParam, IntPtr lParam);

Вопрос, как получить hWnd OpenFileDialog ?


#14

Есть какая то функция получающая дескриптор сфокусированного окна. И ещё 1, получающая дескриптор по заголовку окна. Но вообще пройдитесь лучше по всем, может что то ещё найдёте. Я находил когда то на msdn страницу со всеми WinAPI для окон.