Страницы: 1
RSS
Определить активное окно проводника
 
И снова всем привет. Спрошу еще один вопрос, т.к. в данной теме совсем не силен. Проблема актуальна для надстроек. Можно ли как-то в VBA определить путь активного окна проводника, т.е. какая папка винды активна и открыта в окне перед тобой? Когда макрос работает из конкретного файла, тут все просто, или когда путь известен заранее - тоже можно задать заранее, но вот если просто открыт какой-то документ Excel, и при этом тебе надо что-то сделать с файлами в совсем другой директории и она открыта в проводнике. здесь вопрос, как это сделать.
 
Pачем Вам для этого её определять?
Код
ChDir ThisWorkbook.Path

и Вы точно её знаете :)
 
Нет, активным окном может быть не это. Управление из надстройки.
 
Laider, тогда объясните толком, для чего Вам его знать? Мне приходит в голову только один вариант - активную в Проводнике папку нельзя убить. А для этого достаточно сделать её заведомо неактивной...
 
Получаем путь активного окна проводника макросом и затем по полученному пути уже производим дальнейшие операции над файлами в папке, не открывая их. Т.к. это могут быть даже не файлы Excel.  
 
То есть Вам нужно знать, где там надстройка рылась?
 
Цитата
Laider написал:
вот если просто открыт какой-то документ Excel, и при этом тебе надо что-то сделать с файлами в совсем другой директории и она открыта в проводнике. здесь вопрос, как это сделать.
Мне всегда интересно: на какого пользователя рассчитана такая "СУПЕР-АВТОМАТИЗАЦИЯ"?!
Кто этот несчастный?!  :D
 
Не, тема на самом деле хорошая. Новый уровень, не надо определять по текущим файлам. Просто открыл папку в проводнике и запустил макрос. Вариаций когда при этом находишься в другом файле или в другой папке может быть множество, это может быть какой-то управляющий файл. Но подозреваю что штатными средствами это не решить.
 
Цитата
Laider написал:
Не, тема на самом деле хорошая.
Только в том случае, если исполнять эту "Автоматизацию" будете Вы!  :D  
Изменено: Мотя - 03.06.2018 19:52:14
 
Мне бы только подсказку по части 1. а дальше я разберусь)) Нашел что-то вроде Declare Function GetActiveWindow& Lib "user32" () , но не знаю с той ли оперы.
 
Мне тут Гугль всемогущий намекает, что можно посмотреть в сторону Environ, но так ли это - не знаю, лень на Винду переключаться...
 
Доброе время суток.
Честно говоря, не очень понимаю, зачем такой велосипед? А чем плох вполне себе стандартный FileDialog, применяемого в режиме выбора папки?
Код
Application.FileDialog(msoFileDialogFolderPicker).Show
 
Андрей, а я так понял, что у автора следующая проблема: кто-то неведомый, неведомым способом открыл проводник и пробрался до некой папки - вот автор и хочет узнать этот путь ))
 
Юрий, в любом случае речь идёт о макросе, который нечто должен сделать в папке. Пользователь должен её указать. Я собственно так толкую и предлагаю использовать стандартный подход.
В противном случае возникают вопросы.
Как запускается макрос?
1. Сразу и дожидается когда пользователь закончит выбор в проводнике. Возникает резонный вопрос - а как определить, что пользователь закончил выбор требуемой для работы папки?
2. Пользователь запускает проводник, находит папку, возвращается в Excel и запускает макрос. Но тогда вопрос не по теме. В этом случае активен Excel, а не проводник. GetActiveWindow вернёт Excel. Ну, можно, пройдись по списку открытых окон отобрать все окна проводника и по порядку положения (типа ZOrder) определить - какое из них было активным. Только вот проблема. Пользователь может перед тем как запустить макрос и не запускать проводник (они талантливые). Или когда то пользователь запускал проводник, но, опять же перед запуском макроса, не запустил новую копию проводника или в старом окне проводника не выбрал нужную папку. Ну, и что будет?
Хорошо если макрос только пытается создать в той папке некоторые файлы, а если ещё и чего-то удаляет? А судя по квалификации ТС, удалить может и всё что там есть :)
 
Андрей VG, вы мне напомнили про метод, который может сойти. Хотя хотелось без этого. В корпоративных сетях очень длинные вложенности папок, пока доберешься. А тут ты уже в ней. Хотя если реализация того что я спрашивал сложна, тогда и мучаться не стоит. Очень странно что посчитать открытые окна проводника можно и очень просто (нашел код ниже), а вот определить путь активного почему-то целая проблема.
Код
Set objShellApp = CreateObject("Shell.Application")
WinCol = objShellApp.Windows().Count
MsgBox "В настоящий момент открыто окон Проводника - " & WinCol, vbInformation 
Изменено: Laider - 03.06.2018 22:31:54
 
Цитата
Laider написал:
вот определить путь активного почему-то целая проблема.
Ключевое слово - активного. Когда вы запускаете макрос (пусть даже тот который вы привели) - активен Excel. Не существует никакого активного окна Проводника.
 
Это понятно. Только Excel отдельное приложение. Еxplorer отдельное, получается последнее бывшее активным окно. Вот указанный выше код считает только окна проводника.
 
Цитата
Laider написал:
Еxplorer отдельное, получается последнее бывшее активным окно.
Вот и перебираете, начиная с GetTopWindow просто с аргументом 0, далее перебирая по GetNextWindow, пока первым не встретится тот HWND, который имеет objShellApp.Windows(id).HWND
Страницы: 1
Наверх