【发布时间】:2010-01-15 02:54:35
【问题描述】:
我正在编写一个 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)
}
我使用 System.Management 命名空间将 Process.KIll 替换为我的程序中的 WMI 调用,我的程序现在能够终止该进程。
我不明白 WMI 与 Process.Kill 有何不同之处。我希望两者都能工作或都失败。此外,任务管理器能够很好地终止进程,但我认为它只是像 Process.Kill 一样使用 TerminateProcess win32 调用。任何人都可以阐明不同行为的原因吗?如果重要的话,我正在运行 Windows XP。
编辑:wj32 解释了 WMI 工作的原因,但任何人都可以解释为什么我可以使用任务管理器而不是我自己的程序来终止进程吗?
【问题讨论】: