Подтвердить что ты не робот

Что происходит "за" экраном блокировки окон?

Я работал над автоматизацией и мониторингом окон.

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

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

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

Ответ 2

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

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

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