Я пытаюсь отправить сообщение в приложение, работающее под другой учетной записью пользователя (пользователь, который также вошел в систему с другой учетной записью на компьютере, используя быстрый пользовательский переключатель на XP и позже и выполнив приложение).
Фон состоит в том, что мое приложение может обновлять себя, но для этого нужно сначала закрыть все запущенные экземпляры.
Экземпляры должны быть отключены (вместо того, чтобы просто убивать процесс), поэтому программа обновления делает это, отправив им специальное сообщение (с помощью SendMessage
). Чтобы отправить сообщение, мне нужен дескриптор главного окна процесса.
Это работает отлично, используя EnumWindows
- пока экземпляры работают под одной и той же учетной записью пользователя, потому что EnumWindows
не отображает окна, принадлежащие другому пользователю.
Итак, я попробовал другой подход. Я использовал CreateToolhelp32Snapshot
, чтобы сначала перечислить все запущенные процессы в системе, а затем снова итерации через потоки, вызывающие CreateToolhelp32Snapshot
. С помощью этих идентификаторов потоков я мог бы затем перечислить их окна, используя EnumThreadWindows
.
Вновь это работает отлично, но.. еще раз только для текущего зарегистрированного пользователя. Проблема здесь в том, что даже если CreateToolhelp32Snapshot
перечисляет идентификаторы процессов, принадлежащие другому пользователю, он не перечисляет идентификаторы потоков, принадлежащие им. Код для этого немного длинный, но если потребуется, я могу его отредактировать - пожалуйста, оставьте комментарий для этого.
Итак, как я могу заставить дескриптор главного окна моего приложения работать в другой учетной записи пользователя?