Как я могу перечислить открытые окна (~EnumWindows) другого сеанса пользователя
У меня есть приложение, которое может перечислить открытые окна текущего сеанса. Он использует метод EnumWindows от user32.dll.
Я хотел бы запустить этот код из службы Windows, но так как служба не привязана к пользовательской сессии, она ничего не возвращает, очевидно.
Итак, вопрос в том, как я могу перечислить открытые окна другого сеанса пользователя (например, с определенным пользователем входа в систему)?
Как и в EnumWindows, я также хотел бы получить окно переднего плана пользовательской сессии (как GetForegroundWindow работает для текущего пользователя).
3 ответа
Насколько я знаю, вы не можете получить доступ к окнам одного сеанса из другого. Стоит также отметить, что на самом деле не существует такой вещи, как "текущий сеанс" - может быть несколько пользователей, вошедших в систему через терминальные службы, или быстрое переключение пользователей в XP.
Одним из подходов к этому будет добавление программы в профиль каждого пользователя без интерфейса пользователя, который просто взаимодействует с вашим сервисом. Вам все равно придется справиться с тем фактом, что может быть несколько активных сессий.
Согласно этому документу вы можете создать процесс в сеансе входа другого пользователя, используя CreateProcessAsUser, и перечислить там окна. Вам все еще потребуется механизм IPC для связи со службой.
Принятый ответ не верен.
Итак, вопрос в том, как я могу перечислить открытые окна другого сеанса пользователя?
Вы можете перечислить открытые окна любого сеанса, если вы работаете как служба, работающая как локальная системная учетная запись.
Для этого сначала перечислите сеансы с WTSEnumerateSessions. Затем перечислите оконные станции внутри каждого сеанса с помощью EnumWindowStations. Затем перечислите рабочие столы для каждой Window Station с EnumDesktops. Наконец, вы перечислите Windows на этих рабочих столах с помощью EnumWindows.
(например, с определенным пользователем входа в систему)
Может быть много одновременно зарегистрированных пользователей через службы терминалов или быстрое переключение пользователей.
Подобно EnumWindows, я также хотел бы получить окно переднего плана пользовательской сессии (как GetForegroundWindow работает для текущего пользователя).
Это можно сделать, запустив приложение с токеном найденного пользователя в Session, Window Station и на рабочем столе. Оттуда вы можете вызывать любой Win32 API, например GetForegroundWindow, и сообщать эту информацию вашему родительскому процессу.
Вы можете узнать больше о работе сессий, оконных станций и рабочих столов здесь.