C# Windows窗体-检测外部应用程序关闭以触发事件
我需要一个解决方案,在外部应用程序关闭时触发代码C# Windows窗体-检测外部应用程序关闭以触发事件,c#,.net,C#,.net,我需要一个解决方案,在外部应用程序关闭时触发代码 我无法使用System.Diagnostics Process.GetProcessByName来检测进程是否正在运行,因为它可能会与防发热系统冲突。我只需要在程序关闭时才触发代码片段。我做了一个很好的基于事件的实现 class Monitor { public event EventHandler ProgramStarted; public event EventHandler ProgramC
我无法使用
System.Diagnostics Process.GetProcessByName
来检测进程是否正在运行,因为它可能会与防发热系统冲突。我只需要在程序关闭时才触发代码片段。我做了一个很好的基于事件的实现
class Monitor
{
public event EventHandler ProgramStarted;
public event EventHandler ProgramClosed;
public Monitor(string process)
{
string pol = "2";
if (!process.EndsWith(".exe")) process += ".exe";
var queryString =
"SELECT *" +
" FROM __InstanceOperationEvent " +
"WITHIN " + pol +
" WHERE TargetInstance ISA 'Win32_Process' " +
" AND TargetInstance.Name = '" + process + "'";
var s = @"\\.\root\CIMV2";
ManagementEventWatcher watcher = new ManagementEventWatcher(s, queryString);
watcher.EventArrived += new EventArrivedEventHandler(OnEventArrived);
watcher.Start();
}
private void OnEventArrived(object sender, EventArrivedEventArgs e)
{
if (e.NewEvent.ClassPath.ClassName.Contains("InstanceDeletionEvent"))
{
EventHandler handler = ProgramClosed;
handler?.Invoke(this, e);
}
else if (e.NewEvent.ClassPath.ClassName.Contains("InstanceCreationEvent"))
{
EventHandler handler = ProgramStarted;
handler?.Invoke(this, e);
}
}
}
要使用它,只需创建类的实例并设置事件。例如:
static void Main(string[] args)
{
var mon = new Monitor("chrome");
mon.ProgramClosed += Mon_ProgramClosed;
mon.ProgramStarted += Mon_ProgramStarted;
Console.ReadKey(true);
}
private static void Mon_ProgramStarted(object sender, EventArgs e)
{
MessageBox.Show("Program started.");
}
private static void Mon_ProgramClosed(object sender, EventArgs e)
{
MessageBox.Show("Program closed.");
}
如果您使用的是控制台应用程序,请确保添加对System.Drawing的引用,对于winforms,请调整修改器。向我们展示您到目前为止拥有的内容。请记住,
GetProcessByName
使用该名称,但没有扩展名.exe
。我刚才提到GetProcessByName是一个解决方案,我不能使用,因为它可能会触发反作弊,尽管该程序不是恶意的,除了浪费系统资源。您在问题中没有这样说。你说“我不能用它”意味着你用错了GetProcessByName
工作得非常好。你不能使用它,因为一个与框架无关的非正统原因。我的措辞不好,我会继续更新它,让它更明显一点,谢谢你如果你根本不能使用进程
对象,你必须自己滚动。首先,我要看看过程对象是如何工作的(),如果没有帮助,然后,您将开始做一些非常粗糙的事情:出于某种原因,System.Management在我的.net framework 4.7.1版本中不包含ManagementEventWatcher,甚至不包含ArriveDeventargs,尽管文档清楚地显示了他们提出了任何想法?@Hazel请在参考中添加对System.Management的参考我设法找到了答案,eventho系统。管理是框架的一部分,我仍然需要nugget软件包。我还更详细地阅读了代码,据我所知,它直接与一个程序挂钩,这个程序可能很容易触发任何防热软件,这是我试图避免的,因为我不想让人们无缘无故地被禁止。谢谢你的代码,即使我现在没有任何用处,它仍然非常有用!