Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - Активное окно

Ответить
Настройки темы
VBS/WSH/JS - Активное окно

Новый участник


Сообщения: 24
Благодарности: 1

Профиль | Отправить PM | Цитировать


Изменения
Автор: beginer
Дата: 15-12-2020
Здравствуйте.

Подскажите, пожалуйста как изменить следующую функцию, чтобы "захват" производился только с активного окна?
Мне это нужно для дела(вредительством не занимаюсь). Нужно как-бы "просеять" все открытые окна-проводники и отделить от них только активное.
Да, могу выделить нужное содержимое ориентируясь на путь, но проблемы начинаются тогда, когда открыто сразу ДВА! (и более) проводника с одинаковым путём.
Вот здесь-то и нужно определиться с какого из них "захватывать" выделенные объекты.

Вот код:
Код: Выделить весь код
Function GetSelectedFiles() 'Returns paths as array of strings
  Dim FileList, Window, SelectedItem
  'avoid duplicates by storing paths in dictionary keys
  Set FileList = CreateObject("Scripting.Dictionary")

  With CreateObject("Shell.Application")
    For Each Window In .Windows
      ' Document type IShellFolderViewDual3
      If InStr(1, typename(Window.Document),"IShellFolderView", 1) > 0 Then
        For Each SelectedItem In Window.Document.SelectedItems
          FileList(SelectedItem.Path) = Null
        Next
      End If
    Next
  End With
    
  GetSelectedFiles = FileList.Keys 'array of paths
End Function
И ещё один вопрос, если позволите. Тоже по теме, но это скорее вопрос к ОС.
Есть такая замечательная комбинация клавиш как Alt+Esc (активация предыдущего приложения). К сожалению, такого же антипода не нашёл(альтернатива - только Alt+TAB). Хорошо, допустим. Но почему игнорируются окна c флагом "поверх остальных"? Например, я запустил "Диспетчер задач" и выставил ему(его окну) этот флаг. Далее переключился, например, на Total Commander. А вот теперь начинается самое интересное. Почему по нажатию вышеуказанной комбинации клавиш я не попадаю на окно "Диспетчера задач", а на какое-то др. окно?


Очень надеюсь на вашу помощь.
Скрытый текст
Данное сообщение было отредактировано в связи с замечанием администратора

Отправлено: 20:22, 10-12-2020

 

(*.*)


Сообщения: 36567
Благодарности: 6698

Профиль | Сайт | Отправить PM | Цитировать


Цитата beginer:
Тоже по теме, но это скорее вопрос к ОС. »
Не разводите оффтоп (ответы будут удалены). Одна проблема/вопрос - одна тема. Вопросы по ОС задавайте в осевых форумах.

-------
Канал Windows 11, etc | Чат @winsiders


Отправлено: 16:39, 12-12-2020 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 24
Благодарности: 1

Профиль | Отправить PM | Цитировать


Vadikan, хорошо. Вас понял. Тогда может ли кто-нибудь помочь мне с первой частью?
Как в вышеприведённой функции отфильтровать все остальные окна, кроме целевого (если мне известен заголовок целевого окна) ?


Добавлено:
Дополнительное условие, типа:
Код: Выделить весь код
If Window.Visible = True Then
не подходит, так как все открытые окна проводника являются видимыми. И те, которые нужно отсеять и целевое окно.

Последний раз редактировалось beginer, 15-12-2020 в 14:30.


Отправлено: 14:18, 15-12-2020 | #3


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


beginer, в чём исполняется код?

Отправлено: 16:27, 15-12-2020 | #4


Новый участник


Сообщения: 24
Благодарности: 1

Профиль | Отправить PM | Цитировать


Iska, в том-то и дело, что не через w(с)script.
Код выполняется в PureBasic'е. Там через такие дебри производится пуск, что самое простое для меня это поправить сам скрипт (по-возможности).
Единственный вариант, который могу выполнить - это перед выполнением закрыть окно проводника с идентичным путём или временно скрыть его, чтобы сработало условие выше. Но это некрасиво. И хотелось более элегантного решения. Спрашивал здесь как читать заголовок каждого окна во время перебора(в уже существующем цикле) и соответственно сравнивать его с определённой строкой каждую итерацию. В этом и заключалась суть вопроса. Если из vbs можно вызывать API ОС, то это бы решило/существенно упростило задачу. "Я так думаю" (С). Не скрою, что пример скрипта взял уже готовый. Он потребовался дабы выяснить отмеченные объекты. Иных решений данного вопроса увы не встречал. Неудобство данного варианта заключается в том, что скрипт "хватает" всё что "видит". Повторюсь, что отсеять проводники с уникальными путями не составляет особого труда. НО с идентичным путём(ями) - это проблема!


Добавлено:
Пожалуйста не беспокойтесь о случаях, когда в настройках ОС (св-ва папки) не выставлено показывать полный путь. Сейчас говорю про вариации с одинаковыми папками на различных разделах и расположенных на одинаковых уровнях(к примеру, "C:\Test"; "D:\Test"; "E:\Test" и т.д.). Ну и соответственно про одинаковые для такого случая заголовки окон. Это проблема решаема.
В PB прочитать title совсем не сложно (неужели vbs'у это не под силу?). Категорически нужен этот скрипт (без него никак не обойтись).

Последний раз редактировалось beginer, 15-12-2020 в 19:35.


Отправлено: 19:16, 15-12-2020 | #5


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


О, боже ж ты мой


Отправлено: 20:12, 15-12-2020 | #6


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата beginer:
Код выполняется в PureBasic'е. »
У меня в нём ошибка прямо на строке:
Код: Выделить весь код
Function GetSelectedFiles() 'Returns paths as array of strings
Попробуйте это:
Цитата:
Остановлюсь на п.2. В документации говорится, что вызов ShellWindows.Item() без параметров возвращает то же, что и ShellWindows.Item(0). Однако, как я убедился, это не соответствует действительности: стабильно возвращается последнее активное окно в коллекции ShellWindows. Хотя, может быть, это верно не на всех системах…
Отсюда: WSH(+ Реестр): «Найти объект...» в контекстном меню ярлыков (Страница 1) — Windows Script Host, HTA (VBScript, JScript) — Общение — Серый форум.

Отправлено: 21:22, 15-12-2020 | #7


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


У меня, увы, не сработало — под Windows 7 SP1 x64:
Код: Выделить весь код
CreateObject("Shell.Application").Windows().Item(3).document.Folder.self.Path
стабильно возвращает не последнее активное окно, а тупо Desktop текущего пользователя.

Отправлено: 21:54, 15-12-2020 | #8


Новый участник


Сообщения: 24
Благодарности: 1

Профиль | Отправить PM | Цитировать


Iska, спасибо за желание помочь. Но этот код не запустить "напрямую"(с ходу/в лоб). Нужна ещё довольно весомая и мудрёная обвёртка. Так что тот кусочек кода, что выше - это только вершина айсберга. Однако сделана обвёртка достойно/добротно. По всем канонам(всё по-взрослому). Очень много работы с памятью(указателями). Немец постарался и поделился своим титаническим трудом с остальными/общественностью.
К тому же в модуле используются вызовы API-функций. Смотрю, что Вы "качаете" демо-версию, а в ней для вызова API нужно действовать немного по-другому. То есть сначала нужно открыть библиотеку и т.д. В полной же версии эти функции являются как бы "нативные" и не требуют дополнительных телодвижений для их вызова. Работать намного проще и удобней.
Не знаю запрещены ли здесь ссылки на сторонние сайты, но если что поправьте (по крайней мере это точно не варез, а вполне себе open source).
Вот сам модуль-обвёртка, если интересно посмотреть. Но я бы туда без поллитры не лез
Шутка.

Вот чувствую, что не в то русло опять зашёл разговор. Заругают админы(наверное нужно завязывать). Поэтому и просил подправить непосредственно vbscript.


P.S. Когда-то начинал знакомство со скриптами, но это было недолго(довольно быстро перешёл на PB). Поэтому и задаю здесь возможно детский вопрос. + знаю, что на этом форуме обитает/прописано много профессионалов, причём русскоговорящих.

Последний раз редактировалось beginer, 15-12-2020 в 22:18.


Отправлено: 21:58, 15-12-2020 | #9


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата beginer:
К тому же в модуле используются вызовы API-функций. »
beginer, в приведённом Вами коде нет вызовов WinAPI. Чистый COM/Automation.

Цитата beginer:
Поэтому и просил подправить непосредственно vbscript. »
Так нечего поправлять. Я не вижу способов найти средствами Automation «активное окно Проводника». Как бы мы их не тасовали — они возвращаются в порядке создания окон, а не в порядке Z-order. А вот Вы можете, взяв WinAPI наперевес, попробовать пройтись по списку полученных окон.

Отправлено: 22:43, 15-12-2020 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - Активное окно

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Интерфейс - Скрыть активное, работающее окно nyevgen Microsoft Windows 7 6 25-09-2019 17:13
Интерфейс - Как закрепить активное окно? GuitarFan Microsoft Windows 7 0 26-05-2015 13:45
Разное - Постоянно активное окно Prof Хочу все знать 6 11-10-2012 12:39
Интерфейс - Не восстанавливается последнее активное окно Mark012 Microsoft Windows 7 4 22-11-2010 15:43
не могу поймать активное окно SerZzz AutoIt 3 30-05-2009 13:02




 
Переход