Как я могу перечислить открытые окна (~ EnumWindows) другого сеанса пользователя - PullRequest
8 голосов
/ 21 ноября 2008

У меня есть приложение, которое может перечислить открытые окна текущего сеанса. Он использует метод EnumWindows от user32.dll.

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

Итак, вопрос в том, как мне перечислить открытые окна другого сеанса пользователя (например, с определенным пользователем входа в систему)?

Аналогично EnumWindows, я также хотел бы получить окно переднего плана пользовательской сессии (как GetForegroundWindow работает для текущего пользователя).

Ответы [ 3 ]

5 голосов
/ 24 ноября 2008

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

5 голосов
/ 22 ноября 2008

Насколько я знаю, вы не можете получить доступ к окнам одного сеанса из другого. Стоит также отметить, что на самом деле не существует такой вещи, как «текущий сеанс» - может быть несколько пользователей, вошедших в систему через терминальные службы, или быстрое переключение пользователей в XP.

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

4 голосов
/ 22 октября 2010

Принят неправильный ответ.

Итак, вопрос в том, как мне перечислить открытые окна другого сеанса пользователя?

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

Для этого сначала перечислите сеансы с WTSEnumerateSessions . Затем перечислите оконные станции внутри каждого сеанса с помощью EnumWindowStations . Затем перечислите рабочие столы для каждой Window Station с помощью EnumDesktops . Наконец, вы перечислите Windows на этих рабочих столах с помощью EnumWindows .

(например, с определенным пользователем для входа в систему)

Может быть много одновременно зарегистрированных пользователей через службы терминала или быстрое переключение пользователей.

Подобно EnumWindows, я также хотел бы получить окно переднего плана пользовательской сессии (как GetForegroundWindow работает для текущего пользователя).

Это можно сделать, запустив приложение с токеном найденного пользователя в сеансе, Window Station и на рабочем столе. Оттуда вы можете вызывать любой Win32 API, например GetForegroundWindow, и сообщать эту информацию вашему родительскому процессу.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...