2008-11-21 5 views
8

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

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

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

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

ответ

5

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

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

+1

И, по сути, по многим причинам лучше всего использовать весь пользовательский интерфейс в тех приложениях для каждого пользователя, контролируя их из службы через какой-то IPC. – atzz 2008-11-22 16:41:51

5

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

+0

Поскольку мне нужно выполнить этот вызов не один раз, но регулярно, я получаю услугу, которая сразу же запускает приложение пользовательского сеанса в каждом интерактивном сеансе. Таким образом, я получаю решение, предложенное DavidK/atzz (имеющее сервис-подобное скрытое приложение). Но хорошо знать об этом! Спасибо! ;) – 2008-11-24 13:20:20

4

Неверный принятый ответ.

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

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

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

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

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

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

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

You can learn more about how Sessions, Window Stations, and Desktops work here.

+0

Это не работает: EnumWindowStations всегда перечисляет оконные станции для текущего сеанса. – 2010-10-31 11:04:52

Смежные вопросы