Открыть и выделить файлы в проводнике

Тема в разделе "WASM.BEGINNERS", создана пользователем ActioN, 29 апр 2006.

  1. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine


    О том, что лист вью чем-то отличается от других стандартных контролов и блокирует доступ из других процессов. На самом деле, всему виной не лист вью, а защищённый режим, который изолирует адресные пространства процессов, но его всегда можно обойти, хоть в лоб, хоть через DLL, хоть через эксплоит, хоть через удалённый тред, хоть простыми (без адресных зависимостей) сообщениями.
     
  2. Sharp

    Sharp New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2003
    Сообщения:
    143
    Адрес:
    Ukraine
    Конкретно эта задача решается с помощью одной функции - SHOpenFolderAndSelectItems
     
  3. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Sharp

    Аплодисменты.
     
  4. ActioN

    ActioN New Member

    Публикаций:
    0
    Регистрация:
    1 апр 2005
    Сообщения:
    160
    Адрес:
    Ukraine
    Quantum, получить хендл ListView не составит труда, если буду знать хендл родителя. Например, запускаю проводник через ShellExecute с параметром "explore", потом как лучше узнать его хендл? На разных по-мощности компьютерах запуск будет отличаться, поэтому по-таймеру надо проверять? И еще, если будет открыто несколько окон explorera, у них же одинаковое имя класса ("ExploreWClass"). Не вызовет ли это трудностей?



    Sharp, IceStudent, у этого метода есть немалый недостаток: Minimum operating systems - Windows XP
     
  5. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Sharp



    XP only :dntknw: Интересно, а как пути сконвертировать в массив IDLIST'ов? Тут описан принцип, но неужели это всё нужно ручками делать?
     
  6. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    ActioN



    Это не так просто как кажется, IMHO.





    Окна создаются быстро, но заполняются, иногда, долго. К примеру, открытие файловой системы дефективного CD может длиться от нескольких секунд до бесконечности... Простого Sleep(1000) в общем случае может не хватить. Можно попробовать опрашивать это окно по SendMessageTimeout пока оно не начнёт нормально откликаться и тогда уже выделять в нём файлы.





    Кроме класса можно проверять ещё и заголовок, а там будет путь к заданной папке.
     
  7. ActioN

    ActioN New Member

    Публикаций:
    0
    Регистрация:
    1 апр 2005
    Сообщения:
    160
    Адрес:
    Ukraine
    Quantum

    Это не так просто как кажется, IMHO.

    Я уже проверял, хендл нашел почти без проблем. Щас попробую команду SendMessageTimeout.

    Нащет заголовока: если в проводнике открыт будет корень диска С, то заголовок будет "Локальный диск С". А на разных компьютерах - это разный текст. Как же тут быть?
     
  8. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine


    Я тоже нашёл (см. мой последний код), но в общем случае надо рекурсивно опрашивать всех детей, пока не будет найден SysListView32.





    Если открыть проводник не через шелл, а через CreateProcess (как завещали великие даосы), то через последний параметр этой функции можно узнать PID процесса. Потом, по мере нахождения главных окон проводника, можно вызывать GetWindowThreadProcessId и сравнивать PID процесса окна с PID процесса, что открыл CreateProcess.
     
  9. ActioN

    ActioN New Member

    Публикаций:
    0
    Регистрация:
    1 апр 2005
    Сообщения:
    160
    Адрес:
    Ukraine
    Спасибо, завтра попробую, сегодня уже голова слабо варит, время позднее. А у Вас под рукой случайно нету готового кода?
     
  10. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    > "SHOpenFolderAndSelectItems - XP only :dntknw:"

    Насколько я понимаю взаимодействие с эксплорером в shell осуществляеется через интерфейсы IShellFolder, IShellView и др., которые реализованы во всех Win32 (с win 95 и NT 4.0).

    С ходу разобраться в этих наворотах действительно не так просто - неблагозвучные PIDL'ы отпугивают :)) Поэтому я в свое время и не стал с этим возиться - достаточно было один файл подсвечивать, а это делается просто запуском эксплорера с командной строкой /select, "имя_файла"
     
  11. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    leo



    И не говорите :) Это чтоб всяким извращенцам, кодящим на асме или чистом С неповадно было туда лезть.





    Полезная фишка! Спасибо! Жаль, что только один файл выделяет.
     
  12. ActioN

    ActioN New Member

    Публикаций:
    0
    Регистрация:
    1 апр 2005
    Сообщения:
    160
    Адрес:
    Ukraine
    Спасибо всем за помощь, особенно Quantum, leo. Буду исполььзовать этот метод. Слишком много мороки из-за одной простенькой (казалось бы:) )функции.