我正在編寫一個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