Задача состоит в следующем:
Ф-ция GetForegroundWindow не возвращает хендл некоторых окон (системных), таких как открыть документ из файла (выскакивает окно выбора файла) и т.д. Можно ли как-то узнать хоть какую-либо информацию таких окон (hendle,id,name и т.д.)?
yellowmew: На предприятии развернута СЭД. Имеется ограниченное кол-во лицензий и очень много "нехороших" пользователей которые добросовестно эти лицензии освобождать не хотят. Написал скрипт который проверяет запущена ли СЭД у пользователя и работает ли он в нем (с помощью GetForegroundWindow ). Как только пользователь переключился на сторонню программу вкл таймер (15 мин) и если время истекло пользователя предупреждают что отключат его (или просят самого закрыть). Проблема в том что у некоторых менюшек невозможно определить хендл и соответственно узнать чье это меню (в таких случаях запускается мой тайме на 15 мин) т.е если вдруг пользователь "затупил" и открывает файл 15 мин (facepalm) то ео и отключить может. Все впринципе и так работает, но просто все хочется сделать "поправильному")
а если поставить юзверей перед фактом - 15/30 или сколько там минут не пользуются СЕДом - будут выкинуты?
а про менюшки, я тут покопался на досуге. есть такая фигня, ВАСП называется. просто модуль к повершелу: https://wasp.codeplex.com/. он слегка облегчает работу с окошками и элементами окошек. ставим его.
для примера берем нотпад, запускаем его.
в ИСЕ повершеловском пишем:
import-module wasp
do
{
Select-Window | where processname -Match notepad | Select-ChildWindow; Start-Sleep -Milliseconds 500
}
while($true)
запускаем этот бесконечный скрипт. идем в нотпад и открываем меню файл или любое другое. можно диалог открытия файла открыть. в процессе поглйдываем в ИСЕ - там с задержкой в полсекунды будут показаны хендл,имя окна (если есть) и класс окна/меню.
теперь к вопросу как определить если пользователь открыл файл в другом приложении из, допустим, диалога открытия файла нотпада (меню открыть, сменить отображение на все файлы, правой кнопкой на вордовский файл, открыть).
gwmi win32_process | where {(get-process -id $_.parentprocessid -ErrorAction SilentlyContinue).ProcessName -match "notepad"} | select name
этот однострочник даст список процессов, у которых родительский процесс содержит строку "нотпад". в случае с выше приведенным примером список будет содержать винворд.ехе.
а теперь самое главное - два этих куска выше нужно подогнать и запихнуть в логику, которая позволит достигнуть задуманного. без доступа к вашей СЭД я не смогу написать такую логику, но если я правильно понимаю задачу и примеры выше не содержат подводных камней - у вас теперь есть все компоненты для написания такой логики.
кстати, про подводные камни. в нотпаде если пойти в меню хелп, смотреть хелп, то у открывшегося окошка родитель будет не нотпад, а свцхост... само собой ВАСПовский скрипт его не увидит ибо оно никакого отношения к нотпаду не имеет хоть и было из него запущено. также будет и с однострочником - родительский процесс не нотпад, так что он ничего не найдет.
azarij: Доброго времени суток. Я тут приболел и только взялся за работу)
WASP хорошая штука, вот только я немного вас дезинформировал - handle и мой скрипт определял, а вот по хендлу этому получить id или еще хоть какую-нибудь информацию не получается.
Кстати, GetForegroundWindow и WASP возвращают разные handle но всеравно по ним я не могу определить хотя бы id процесса.
С однострочником вы мне и до этого помогали (в другом вопросе), за него спасибо!
Для себя вижу лишь один вариант - анализировать Class который возвращает WASP
Или у вас еще есть идеи? Буду рад их услышать!
Заранее спасибо!
azarij: Все, разобрался) СПАСИБО ВАМ ОГРОМНОЕ!!! WASP реально очень помог. Есть замечательная штука Select-Window -ActiveWindow. Там можно узнать имя активного процесса и вот WASP нормально определяет имя процесса для разного рода таких как в вопросе окон (открыть, сохранить как и т.д)