![]() |
Внимание, важное сообщение: Дорогие Друзья!
В ноябре далекого 2001 года мы решили создать сайт и форум, которые смогут помочь как начинающим, так и продвинутым пользователям разобраться в операционных системах. В 2004-2006г наш проект был одним из самых крупных ИТ ресурсов в рунете, на пике нас посещало более 300 000 человек в день! Наша документация по службам Windows и автоматической установке помогла огромному количеству пользователей и сисадминов. Мы с уверенностью можем сказать, что внесли большой вклад в развитие ИТ сообщества рунета. Но... время меняются, приоритеты тоже. И, к сожалению, пришло время сказать До встречи! После долгих дискуссий было принято решение закрыть наш проект. 1 августа форум переводится в режим Только чтение, а в начале сентября мы переведем рубильник в положение Выключен Огромное спасибо за эти 24 года, это было незабываемое приключение. Сказать спасибо и поделиться своей историей можно в данной теме. С уважением, ваш призрачный админ, BigMac... |
|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - Активное окно |
|
VBS/WSH/JS - Активное окно
|
Новый участник Сообщения: 24 |
Здравствуйте.
Подскажите, пожалуйста как изменить следующую функцию, чтобы "захват" производился только с активного окна? Мне это нужно для дела(вредительством не занимаюсь). Нужно как-бы "просеять" все открытые окна-проводники и отделить от них только активное. Да, могу выделить нужное содержимое ориентируясь на путь, но проблемы начинаются тогда, когда открыто сразу ДВА! (и более) проводника с одинаковым путём. Вот здесь-то и нужно определиться с какого из них "захватывать" выделенные объекты. Вот код: 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
|
Профиль | Отправить PM | Цитировать Iska, говорил про модуль(вызовы WinAPI).
Ну нет, так нет. Видимо прийдётся закрывать одинаковые. Получить Z-Order - не проблема. Недопонял только что это даст? Хэндл активного окна мне и так известен(причём заранее и достоверно). То есть его не нужно искать непосредственно в скрипте. Если бы его теперь сравнивать с каждым найденным окном(цикл скрипта), тогда да. Будет толк. Или даже не хэндл, а заголовок окна. Повторюсь, что мне не нужно искать активное окно проводника! Я спрашивал совсем не об этом. А о возможности добавить в скрипт дополнительное условие(в момент перебора окон). Представьте, что у Вас есть ещё одна переменная(естественно в поле зрения скрипта), в которой находится хэндл или заголовок активного окна проводника(как угодно). Как эту переменную сделать видимой самим скриптом - тоже не есть вопрос данной темы. |
Отправлено: 21:43, 16-12-2020 | #11 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ветеран Сообщения: 27449
|
Профиль | Отправить 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 |
|
Отправлено: 22:15, 16-12-2020 | #12 |
Старожил Сообщения: 250
|
Профиль | Отправить 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
|
Профиль | Отправить 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
|
Профиль | Отправить PM | Цитировать beginer, да зачем закрывать-то? Получили хэндл «верхнего» окна Проводника — WinAPI. Перечислили все окна Проводника, отобрали из них только то, которое имеет ранее полученный хэндл, получили из этого окна перечень выделенных объектов Проводника (необязательно файлов или папок) — COM/Automation.
|
Отправлено: 20:21, 19-12-2020 | #15 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Интерфейс - Скрыть активное, работающее окно | 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 |
|