Задетектить начало выполнения процесса - C#

Узнай цену своей работы

Формулировка задачи:

Ребят выручайте, получаю доступ к(уже запущенному) процессу,для получения потоков,выполняющихся в нем,все работает,все прекрасно.
Process[] proc = Process.GetProcessesByName("notepad");
 ProcessThreadCollection processThreads = proc[i].Threads;
Этот способ сканирует уже запущенные процессы,что мне немного не подходит, нужен способ, как бы мягче сказать,который будет ожидать запуска нужного мне имени процесса, и уже дальнейшего доступа к нему,аналогично моему способу,указанному выше.

Решение задачи: «Задетектить начало выполнения процесса»

textual
Листинг программы
 /// <summary>
    /// ProcessInfo class.
    /// </summary>
    internal class ProcessInfo
    {
        // defenition of the delegates
        public delegate void StartedEventHandler(object sender, EventArrivedEventArgs e);
        public delegate void TerminatedEventHandler(object sender, EventArrivedEventArgs e);
        
        // events to subscribe
        public event StartedEventHandler Started = null;
        public event TerminatedEventHandler Terminated = null; 
 
        // WMI event watcher
        private ManagementEventWatcher watcher;
        
        // The constructor uses the application name like notepad.exe
        // And it starts the watcher
        public ProcessInfo(string appName)
        {
            // querry every 2 seconds
            string pol = "2"; 
 
            string queryString = 
                "SELECT *" +
                "  FROM __InstanceOperationEvent " + 
                "WITHIN  " + pol +
                " WHERE TargetInstance ISA 'Win32_Process' "  +                 
                "   AND TargetInstance.Name = '" + appName + "'";
                                
            // You could replace the dot by a machine name to watch to that machine
            string scope = @"\\.\root\CIMV2";
            
            // create the watcher and start to listen
            watcher  = new ManagementEventWatcher(scope, queryString);
            watcher.EventArrived += new EventArrivedEventHandler(this.OnEventArrived);          
            watcher.Start();
        }
        public void Dispose()
        {
            watcher.Stop();
            watcher.Dispose();
        }
        public static DataTable RunningProcesses()
        {
            /* One way of constructing a query
            string className = "Win32_Process";
            string condition = "";
            string[] selectedProperties = new string[] {"Name", "ProcessId", "Caption", "ExecutablePath"};
            SelectQuery query = new SelectQuery(className, condition, selectedProperties);
            */
            
            // The second way of constructing a query
            string queryString = 
                "SELECT Name, ProcessId, Caption, ExecutablePath" + 
                "  FROM Win32_Process";
                                
            SelectQuery query = new SelectQuery(queryString);
            ManagementScope scope = new System.Management.ManagementScope(@"\\.\root\CIMV2");
            
            ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
            ManagementObjectCollection processes = searcher.Get();
            
            DataTable result = new DataTable();
            result.Columns.Add("Name", Type.GetType("System.String"));
            result.Columns.Add("ProcessId", Type.GetType("System.Int32"));
            result.Columns.Add("Caption", Type.GetType("System.String"));
            result.Columns.Add("Path", Type.GetType("System.String"));
            
            foreach(ManagementObject mo in processes)
            {
                DataRow row = result.NewRow();
                row["Name"] = mo["Name"].ToString();
                row["ProcessId"] = Convert.ToInt32(mo["ProcessId"]);
                if (mo["Caption"]!= null)
                    row["Caption"] = mo["Caption"].ToString();
                if (mo["ExecutablePath"]!= null)
                    row["Path"] = mo["ExecutablePath"].ToString();
                result.Rows.Add( row );
            }
            return result;
        } 
        private void OnEventArrived(object sender, System.Management.EventArrivedEventArgs e)
        {
            try 
            {
                string eventName = e.NewEvent.ClassPath.ClassName;
 
                if (eventName.CompareTo("__InstanceCreationEvent")==0)
                {
                    // Started
                    if (Started!=null) 
                        Started(this, e);
                }
                else if (eventName.CompareTo("__InstanceDeletionEvent")==0)
                {
                    // Terminated
                    if (Terminated!=null) 
                        Terminated(this, e);
 
                }               
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine(ex.Message);
            }
        }
        
    }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.667 из 5
Похожие ответы