如何检测我的应用程序是由命令提示符中的TASKKILL终止的?

时间:2014-10-31 02:32:52

标签: c# windows winforms hook

我的目的是想在命令提示符中捕获TASKKILL事件,并使用此事件。

也许,我认为需要使用kernel32.dll,但我无法为此找到处理程序。

[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool TerminateProcess(IntPtr hProcess, uint uExitCode);

更新

按照@Ben Voigt的建议:

_使用WMI:

步骤1:运行命令mgmtclassgen Win32_Process /n root\cimv2 /o WMI.Win32以生成班级Process。然后将课程Process重命名为Win32_Process

http://notepad.cc/share/3SQfeJgEQR

第2步:创建名为ProcessWatcher

的班级

http://notepad.cc/share/UIR1Tw5twy

步骤3:将此类与while循环一起使用以等待我的应用程序状态。 这很简单,但不是我的选择。

http://notepad.cc/share/JXLGogGbai

_使用Window Hook:

[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool DuplicateHandle(IntPtr hSourceProcessHandle,
           ushort hSourceHandle, IntPtr hTargetProcessHandle, out IntPtr lpTargetHandle,
           uint dwDesiredAccess, [MarshalAs(UnmanagedType.Bool)] bool bInheritHandle, uint dwOptions);

但是TerminateProcessDuplicateHandle,我无法为此找到处理程序。

1 个答案:

答案 0 :(得分:2)

从我们称之为监视程序的其他进程中,您必须获得要监视终止(目标进程)的进程的句柄。您可以使用DuplicateHandle创建一个句柄,并通过IPC机制进行通信。如果您知道目标流程的PID,则可以使用OpenProcessSystem.Diagnostics.Process.GetProcessById。如果监视程序生成目标进程,您将获得CreateProcessSystem.Diagnostics.Process.Start的句柄。或者您可以枚举正在运行的进程,例如使用System.Diagnostics.Process.GetProcessesByName

在任何情况下,一旦掌握了流程,就可以将其传递给其中一个等待函数,例如WaitForSingleObjectWaitForMultipleObjectsMsgWaitForMultipleObjectsEx。当进程停止运行时,例如因为TASKKILL终止它,进程句柄就会发出信号并等待完成。

如果您使用.NET Process类及其WaitForExit方法,请注意,与Win32等待函数不同,没有多句柄版本;你需要专注于整个线程。


一种可能更简单的方法是使用WMI并订阅处理事件。我倾向于不自己使用WMI,但如果你在看门狗和目标之间没有父/子关系,那么它可能会很有用,这使得手柄难以获得。你可以在这个博客上阅读它: