我正在编写一个C#应用程序,其中包括自动关闭用户退出游戏后某些游戏显示的广告。我的程序在检测到用户已退出游戏时通过杀死游戏进程来完成此操作。我的程序类似于由别人编写的Autohotkey脚本,它执行类似的事情,但它增加了一些功能和GUI。这两种杀死进程的方法有什么区别?
当然,我使用了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有什么不同。我希望既可以工作也可以同时失败。另外,任务管理器能够很好地杀死进程,但我认为它只是像Process.Kill一样使用TerminateProcess win32调用。任何人都可以阐明不同行为的原因吗?如果重要,我正在运行Windows XP。
编辑:wj32解释了为什么WMI的工作原理,但任何人都可以解释为什么我可以用任务管理器杀死进程,但不能用我自己的程序?
任务管理器可以杀死它呢?任务管理器有什么特别之处吗? – 2010-01-15 03:30:22