Что происходит «за» экраном блокировки Windows? - PullRequest
20 голосов
/ 05 марта 2012

Я занимаюсь автоматизацией и мониторингом окон.

Что именно происходит, когда я блокирую экран машины с Windows?

В настоящий момент я работаю с Windows 7, есть ли большие различия в поведении, если я переключаюсь на Vista или серверверсии?Есть ли еще рабочий стол, к которому можно получить доступ через API?Я знаю, что все еще могу отправлять нажатия клавиш и щелчки мышью в определенные окна (через ControlSend и ControlClick ), но, похоже, сам "рабочий стол" отсутствует.

Может ли кто-нибудь пролить свет на все это или указать мне читаемый источник, где я мог бы получить обзор по теме?

Ответы [ 2 ]

29 голосов
/ 05 марта 2012

В основном происходит то, что Windows переключается на защищенный рабочий стол, делает его текущим, поэтому с ним теперь связан ввод данных.

Старый рабочий стол остается там, где он был: все HWND на рабочем столевсе еще там, и любой поток, подключенный к этому рабочему столу, может получить доступ к этим HWND, узнать их местоположение и так далее.Вы все еще можете отправлять сообщения в окна на этом рабочем столе, если поток, отправляющий сообщение, также находится на этом рабочем столе.

Однако, поскольку рабочий стол теперь неактивен, он не может получать ввод.GetForegroundWindow вернет NULL (IIRC), и вы больше не можете использовать SendInput, так как ввод теперь принадлежит [потоку] на другом рабочем столе;никакие элементы управления на этом неактивном рабочем столе не могут получить фокус.

Обратите внимание, что отправка сообщений о нажатии клавиш элементу управления, который не имеет фокуса, может иногда вызывать непредвиденное поведение, поскольку приложение или элемент управления обычно не ожидают получения ввода с клавиатуры без предварительной фокусировки.(Это может быть проблематично для элементов управления, которые устанавливают некоторый входной контекст в WM_SETFOCUS и очищают его, например, в WM_KILLFOCUS.)

Короче говоря, пользовательский интерфейс все еще существует: вы можете выполнять определенные запросы к нему, но вы больше не можете автоматизировать его, как на обычном рабочем столе, отправляя ввод, и некоторые другие функции, связанные с фокусом или вводом, могут не работать.

Я не очень знаком с AutoHotKey, но названиеи описание функциональности предполагает, что он сильно зависит от базового Win32 SendInput API.Это не работает вообще для ввода с клавиатуры, когда рабочий стол неактивен.

Чтобы получить достаточный обзор работы рабочих столов и их связи с рабочими станциями, заблокированным рабочим столом и т. Д., Ознакомьтесь с Настольная статья на MSDN .

Одна проблема, с которой я сталкивался в прошлом с настольными компьютерами и автоматизацией, заключается в следующем: как оставить длительный тест, использующий некоторую форму автоматизации пользовательского ввода (мышь, симуляция клавиатуры), но все еще блокирую мой компьютер, чтобы кто-то не мог просто пройти и помешать емуПосле блокировки ПК рабочий стол становится неактивным, и автоматизация перестает работать.Аналогичная проблема возникает, если включается заставка: рабочий стол переключается, и автоматизация не срабатывает.

Одно из решений состоит в том, чтобы использовать два ПК: назовем их Main и Test: из Main откройте клиент служб удаленного терминала натестовый компьютер, а затем запустите автоматический тест на тестовом компьютере, но из окна клиента служб терминалов на главном компьютере.Теперь классная часть: вы можете минимизировать это окно TSC или даже заблокировать основной компьютер (или позволить скринсейверу включиться), и этот виртуальный сеанс будет продолжать работать, думая, что он все еще активен - просто никто его не платитвнимание.Это один из способов создания «подключенного» сеанса с активным рабочим столом, но тот, которому никто не может помешать, поскольку он защищен за заблокированным рабочим столом основного компьютера.

2 голосов
/ 05 марта 2012

Я не знаю деталей, но я считаю, что экран блокировки представляет собой отдельный «рабочий стол» и, возможно, также отдельную «оконную станцию» (насколько я понимаю, оконная станция - это просто контейнер для рабочих столов). Надеемся, что раздел MSDN на оконных станциях должен быть полезен: http://msdn.microsoft.com/en-us/library/windows/desktop/ms687098%28v=vs.85%29.aspx

Чтобы получить доступ к рабочему столу, вам нужно будет использовать обычные API-интерфейсы Windows из потока на этом рабочем столе. SetThreadDesktop, вероятно, будет самым простым способом сделать это в C, если рабочий стол не находится на другой оконной станции.

К сожалению, это уже трудно для обычного привилегированного приложения, и использование AutoHotkey усложняет его еще больше. Поскольку у вас нет контроля над потоками или инициализацией процесса, вам, вероятно, придется создать новый процесс на другом рабочем столе (вы можете сделать это с помощью API CreateProcess, который, как представляется, имеет оболочку, доступную для AHK, к которой вы можете укажите имя рабочего стола: http://www.autohotkey.com/forum/topic1952.html). Для этого вашему процессу потребуются специальные привилегии; я не уверен, что достаточно даже запуска от имени администратора.

...