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