Имя пользователя:
Пароль:
 | Правила  

Компьютерный форум 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

 

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


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

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


Iska, говорил про модуль(вызовы WinAPI).
Ну нет, так нет. Видимо прийдётся закрывать одинаковые. Получить Z-Order - не проблема. Недопонял только что это даст? Хэндл активного окна мне и так известен(причём заранее и достоверно). То есть его не нужно искать непосредственно в скрипте. Если бы его теперь сравнивать с каждым найденным окном(цикл скрипта), тогда да. Будет толк. Или даже не хэндл, а заголовок окна. Повторюсь, что мне не нужно искать активное окно проводника! Я спрашивал совсем не об этом. А о возможности добавить в скрипт дополнительное условие(в момент перебора окон). Представьте, что у Вас есть ещё одна переменная(естественно в поле зрения скрипта), в которой находится хэндл или заголовок активного окна проводника(как угодно). Как эту переменную сделать видимой самим скриптом - тоже не есть вопрос данной темы.

Отправлено: 21:43, 16-12-2020 | #11



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

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


Ветеран


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

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


Цитата beginer:
Хэндл активного окна мне и так известен

Если бы его теперь сравнивать с каждым найденным окном(цикл скрипта), тогда да. Будет толк. Или даже не хэндл, а заголовок окна. »
Именно хэндл. Заголовок не годится — он не уникален.

WSH:
Код: Выделить весь код
Option Explicit

Dim objWebBrowser

For Each objWebBrowser In WScript.CreateObject("Shell.Application").Windows()
	With objWebBrowser
		If InStr(1, TypeName(.document), "ShellFolderViewDual", vbTextCompare) > 0 Then
			WScript.Echo .hwnd, vbTab, .document.Folder.self.Path
		End If
	End With
Next

WScript.Quit 0
Сравнивайте:
Код: Выделить весь код
		If InStr(1, TypeName(.document), "ShellFolderViewDual", vbTextCompare) > 0 Then
			WScript.Echo .hwnd, vbTab, .document.Folder.self.Path
			
			If .hwnd = ... Then
				...
			End If
		End If

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


Старожил


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

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


@beginer VB языку трудно с получением

поэтому часто советуют запустить повершелл обертку win32 API которая даст вам
ответ
например
Код: Выделить весь код
param(
  [int]$sleep = 10
)
start-sleep -second $sleep
# based on https://social.technet.microsoft.com/Forums/en-US/4d257c80-557a-4625-aad3-f2aac6e9a1bd/get-active-window-info?forum=winserverpowershell
add-type -name Utils -namespace Win32 -memberdefinition @'
[DllImport("user32.dll")]
public static extern IntPtr GetForegroundWindow();
'@
$windowHandle = [Win32.Utils]::GetForegroundWindow()
Get-Process | where-Object { $_.mainWindowHandle -eq $windowHandle } | 
  select-Object -property processName, MainWindowTItle, MainWindowHandle
Код: Выделить весь код
PS C:\Users\Serguei> . .\get_window_has_focus.ps1 -sleep 4

ProcessName MainWindowTitle                  MainWindowHandle
----------- ---------------                  ----------------
vivaldi     Get Active Window Info - Vivaldi            67038
в вашем скрипте эту информацию прочитаете и найдете которое активное

кстати если будете гуглить то ищите по английски это назваетется
Window has Focus

напр

find which window has focus

https://social.technet.microsoft.com...rverpowershell - то что я привел выше (добавил задержку чтобы тестировать было время поднять другое окно

Отправлено: 03:57, 19-12-2020 | #13


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


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

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


Serguei Kouzmine, спасибо большое за желание помочь, но PS не подходит. Да и запускается он откровенно/неприлично долго. Хотел только подстроиться под уже готовый vbscript, так как он благополучно "прикручен" к основной программе. И в принципе, работа скрипта вполне устраивает, за исключением этой небольшой оказии. И, да, конечная цель заключалась совсем не в поиске активного окна. Почему изначально сделал акцент на это и тему так назвал, так это для того, чтобы задавая вопрос объяснить/сразу дать понять, что ищу способ сепарации/разделения. Скрипт этот захватывает выделенные объекты из открытых окон-проводников. Если у Вас на ПК, допустим, открыты проводники с путями "С:\TEST" и "D:\TEST" + в обоих что-то выбрано, то этот случай просто решается. А вот если открыто два окна(две копии проводника) с "С:\TEST"(сейчас не важно что там покажет title, полный путь или нет) и допустим, что у вас в этом каталоге есть след. файлы: "1.txt", "2.txt", "3.txt", "4.txt" и "5.txt". Допустим в одном окне вы выбрали файлы 1, 3, 5, а во втором 2 и 4. Так вот в этом случае в результат будут включены все пять файлов. И это есть нехорошо и неправильно. И обойти это не представляется возможным, кроме как закрыть или временно скрыть идентичный проводник(и). Надеюсь, что доходчиво объяснил суть задачи. Естественно, случай с двумя идентичными проводниками, но когда объекты выделены только в одном из них - тоже не представляет опасности.

Iska, Вам тоже спасибо за участие.

Как уже говорил выше, тут мне видится разве что вариант с закрытием окон проводников с идентичными путями(не трогая при этом уникальные, если таковые имеются/открыты). Правда это может раздражать пользователя (мелькающие окна). Будем считать этот случай большой редкостью и что нужно очень постараться/сделать это умышленно, чтобы его достичь.

Всем спасибо!

Отправлено: 10:54, 19-12-2020 | #14


Ветеран


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

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


beginer, да зачем закрывать-то? Получили хэндл «верхнего» окна Проводника — WinAPI. Перечислили все окна Проводника, отобрали из них только то, которое имеет ранее полученный хэндл, получили из этого окна перечень выделенных объектов Проводника (необязательно файлов или папок) — COM/Automation.

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



Компьютерный форум 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




 
Переход