Я ищу способ закрыть процесс, выполняемый под любым пользователем службой Windows, запущенной под учетной записью системы. Я почти все пробовал, но не смог найти решения, кроме как убить процесс.
Почему я не могу убить процесс? Я не могу убить процесс использует значок в трее. Если я убью процесс, значок в трее не исчезнет.
То, что я пробовал до сих пор
Я уже пытался использовать глобальные дескрипторы событий (не работал, потому что дочерний процесс получил очень лаги).
Я также пытался использовать PostMessage/SendMessage для связи с процессом. Это решение не работает, потому что служба Windows не может взаимодействовать с любыми пользовательскими интерфейсами,...
Я нашел еще один вопрос (здесь, в stackoverflow), который точно описывает мою проблему: Закройте дочерний процесс из службы Windows. Этот вопрос не содержит хорошего решения.
Прежде всего, я не использую C++ вместо С#. Следующая проблема заключается в том, что дочерний процесс использует крючок для мыши. Таким образом, он работал очень быстро без многих накладных расходов. В противном случае это будет лагги, что означало бы, что мышь будет отставать от всей системы.
Итак, действительно ли нет простого решения закрыть процесс из службы Windows?
Служба может использовать SetProcessWindowStation()
и SetThreadDesktop()
для присоединения к интерактивному рабочему столу целевого процесса до отправки сообщений в целевой процесс.
В качестве альтернативы служба может использовать CreateProcessAsUser()
для запуска нового процесса в том же сеансе, что и целевой процесс, а затем этот процесс может отправлять сообщения в целевой процесс.
SetThreadDesktop
. Оба не сработали. Я просто не получаю доступ ни к каким пользовательским интерфейсам. Проблема в том, что, как уже упоминалось, «изоляция сеанса 0». Я должен начать процесс в другой сессии.