Как я могу перечислить открытые окна (~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, и сообщать эту информацию вашему родительскому процессу.

Вы можете узнать больше о работе сессий, оконных станций и рабочих столов здесь.

Другие вопросы по тегам