Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Windows窗体-检测外部应用程序关闭以触发事件_C#_.net - Fatal编程技术网

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软件包。我还更详细地阅读了代码,据我所知,它直接与一个程序挂钩,这个程序可能很容易触发任何防热软件,这是我试图避免的,因为我不想让人们无缘无故地被禁止。谢谢你的代码,即使我现在没有任何用处,它仍然非常有用!