Я пишу приложение на C #, которое, помимо прочего, автоматически закрывает рекламу, отображаемую определенной игрой, после выхода пользователя из игры. Моя программа выполняет это, убивая игровой процесс, когда обнаруживает, что пользователь вышел из игры. Моя программа похожа на скрипт Autohotkey, написанный кем-то другим, который делает подобные вещи, но добавляет некоторые функции и графический интерфейс.
Естественно, я использовал метод Process.Kill. Однако это может привести к ошибке «Отказано в доступе». Я заметил, что скрипт Autohotkey использует необычный метод уничтожения процесса. Я спросил об этом автора, и он сказал, что у него тоже были проблемы с уничтожением процесса обычными методами.
Мы подозреваем, что обычные методы завершения процесса не работают - это HackShield программное обеспечение, которое игра использует для борьбы с мошенничеством.
Вот код Autohotkey, который использует скрипт другого парня для уничтожения процесса:
; kills all process instances of a given executable name
; COM AutoHotkey library code omitted
KillProcessInstances(exe)
{
psvc := COM_GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
pset := COM_Invoke(psvc, "ExecQuery", "Select * from Win32_Process Where Name = '" exe "'")
penm := COM_Invoke(pset, "_NewEnum")
Loop, % COM_Invoke(pset, "Count")
If COM_Enumerate(penm, pobj)=0
{
COM_Invoke(pobj, "Terminate")
COM_Release(pobj)
}
COM_Release(penm)
COM_Release(pset)
COM_Release(psvc)
}
Я заменил Process.KIll вызовами WMI в моей программе, используя пространство имен System.Management, и теперь моя программа может завершить процесс.
Чего я не понимаю, так это то, что отличает WMI от Process.Kill. Я ожидал бы, что оба будут работать или оба потерпят неудачу. Кроме того, диспетчер задач может просто нормально завершить процесс, но я думаю, он просто использует вызов win32 TerminateProcess, точно так же, как и Process.Kill. Может ли кто-нибудь пролить свет на причину такого поведения? Если это имеет значение, я использую Windows XP.
Редактировать: wj32 объяснил, почему работает WMI, но кто-нибудь может объяснить, почему я могу завершить процесс с помощью диспетчера задач, но не с моей собственной программой?