Ответ 1
В основном происходит то, что Windows переключается на безопасный рабочий стол, делает его текущим, поэтому теперь он связан с ним.
Старый рабочий стол остается там, где он был: все HWND на рабочем столе все еще существуют, и любой поток, прикрепленный к этому рабочему столу, может получить доступ к этим HWND, получить их местоположение и т.д. Вы все равно можете отправлять сообщения в окна на этом рабочем столе, пока поток, отправляющий сообщение, также находится на этом рабочем столе.
Однако, поскольку рабочий стол теперь неактивен, он не может принимать входные данные. GetForegroundWindow вернет NULL (IIRC), и вы больше не сможете использовать SendInput, так как вход теперь принадлежит [потоку] на другом рабочем столе; никакие элементы управления на этом неактивном рабочем столе не могут получить фокус.
Обратите внимание, что отправка сообщений нажатия клавиш в элемент управления, который не имеет фокуса, может иногда приводить к неожиданному поведению, поскольку приложение или элемент управления обычно не ожидают ввода клавиатуры без предварительного фокусирования. (Это может быть проблематично для элементов управления, которые настраивают какой-то входной контекст в WM_SETFOCUS и, например, очищают его в WM_KILLFOCUS.)
Вкратце, пользовательский интерфейс все еще существует: вы можете делать с ним определенные запросы, но вы больше не можете его автоматизировать, как на обычном рабочем столе, отправив ввод, а некоторые другие функции, связанные с фокусом или вводом, могут не работать.
Я не очень хорошо знаком с AutoHotKey, но имя и описание функциональности говорят о том, что он сильно зависит от базового API-интерфейса Win32 SendInput. Это не будет работать вообще для ввода клавиатуры, когда рабочий стол неактивен.
Для разумного обзора работы рабочих столов и того, как они относятся к winstations, заблокированного рабочего стола и т.д., проверьте Настольная статья на MSDN.
Одной из проблем, с которыми я столкнулся в прошлом с настольными компьютерами и автоматизации, является: как я могу оставить долговременный тест, используя некоторую форму автоматизации ввода пользователем (мышь, симуляция клавиатуры), но все же заблокировал мой компьютер так что кто-то не может просто пройтись и помешать ему. Как только вы заблокируете ПК, рабочий стол неактивен, и поэтому автоматизация перестает работать. Подобная проблема возникает, если заставка запускается: переключатели рабочего стола и автоматизация завершается с ошибкой.
Одним из решений является использование двух ПК: позвоните на них Main и Test: из Main, откройте клиент служб удаленных терминалов на тестовой машине и затем запустите автоматический тест на тестовом компьютере, но из окна клиентских служб терминалов на главной машине. Теперь классная часть: вы можете свести к минимуму окно TSC или даже заблокировать главную машину (или позволить заставки зайти), и этот виртуальный сеанс продолжит работу, считая, что он все еще активен - это просто, что никто его не платит внимание. Это один из способов создать "подключенный" сеанс с активным рабочим столом, но тот, который никто не может помешать, потому что он защищен за заблокированным рабочим столом главной машины.