我的目的是想在命令提示符中捕获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);
但是TerminateProcess
和DuplicateHandle
,我无法为此找到处理程序。
答案 0 :(得分:2)
从我们称之为监视程序的其他进程中,您必须获得要监视终止(目标进程)的进程的句柄。您可以使用DuplicateHandle
创建一个句柄,并通过IPC机制进行通信。如果您知道目标流程的PID,则可以使用OpenProcess
或System.Diagnostics.Process.GetProcessById
。如果监视程序生成目标进程,您将获得CreateProcess
或System.Diagnostics.Process.Start
的句柄。或者您可以枚举正在运行的进程,例如使用System.Diagnostics.Process.GetProcessesByName
。
在任何情况下,一旦掌握了流程,就可以将其传递给其中一个等待函数,例如WaitForSingleObject
,WaitForMultipleObjects
或MsgWaitForMultipleObjectsEx
。当进程停止运行时,例如因为TASKKILL终止它,进程句柄就会发出信号并等待完成。
如果您使用.NET Process
类及其WaitForExit
方法,请注意,与Win32等待函数不同,没有多句柄版本;你需要专注于整个线程。
一种可能更简单的方法是使用WMI并订阅处理事件。我倾向于不自己使用WMI,但如果你在看门狗和目标之间没有父/子关系,那么它可能会很有用,这使得手柄难以获得。你可以在这个博客上阅读它: