第一步,新建一个C#控制台应用程序项目WinProcess
第二步。建一个 ProcessInfo类
1)先添加两个命名空间
using System.Management;
using System.Diagnostics;
2)在引用这边添加引用
3)代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Management;
using System.Diagnostics;
namespace WinProcess
{
public class ProcessInfo
{
// defenition of the delegates
public delegate void StartedEventHandler(object sender, EventArgs e);
public delegate void TerminatedEventHandler(object sender, EventArgs e);
// events to subscribe
public StartedEventHandler Started = null;
public TerminatedEventHandler Terminated = null;
// WMI event watcher
private ManagementEventWatcher watcher;
/// <summary>
/// Construction that binds specific application with event declared
/// </summary>
/// <param name="LocalServerName"></param>
/// <param name="appName"></param>
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 + "'";
string scope = @"//127.0.0.1/root/CIMV2";
// create the watcher and start to listen
watcher = new ManagementEventWatcher(scope, queryString);
watcher.EventArrived += new EventArrivedEventHandler(this.OnEventArrived);
watcher.Start();
}
/// <summary>
/// Destruction function
/// </summary>
public void Dispose()
{
watcher.Stop();
watcher.Dispose();
}
/// <summary>
/// Get all processes that running in local machine
/// </summary>
/// <returns></returns>
public static DataTable RunningProcesses()
{
// 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 ManagementScope(@"//127.0.0.1/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;
}
/// <summary>
/// Get all processes that running in specific server
/// </summary>
/// <param name="sServerName"></param>
/// <param name="sUserName"></param>
/// <param name="sPassword"></param>
/// <returns></returns>
public static DataTable RunningProcesses(
string sServerName,
string sUserName,
string sPassword)
{
// The second way of constructing a query
string queryString =
"SELECT Name, ProcessId, Caption, ExecutablePath" +
" FROM Win32_Process";
SelectQuery query = new SelectQuery(queryString);
//Set connection parameters
ConnectionOptions options = new ConnectionOptions();
options.Username = sUserName;
options.Password = sPassword;
//Create management scope
ManagementScope scope = new ManagementScope(
string.Format(@"//{0}/root/CIMV2", sServerName),
options);
//To connect
try
{
scope.Connect();
}
catch (Exception err)
{
Debug.WriteLine(err.Message);
return null;
}
catch
{
return null;
}
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;
}
/// <summary>
/// Event handle function
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnEventArrived(object sender, System.Management.EventArrivedEventArgs e)
{
try
{
string eventName = e.NewEvent.ClassPath.ClassName;
Debug.WriteLine(eventName);
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)
{
Debug.WriteLine(ex.Message);
}
}
}
}
第三步,写主函数代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace WinProcess
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("请启用QQ应用程序!");
ProcessInfo notePad = new ProcessInfo("QQ.exe");
notePad.Started += new ProcessInfo.StartedEventHandler(NotepadStarted);
notePad.Terminated += new ProcessInfo.TerminatedEventHandler(NotepadTerminated);
Console.ReadKey();
}
static void NotepadStarted(object sender, EventArgs e)
{
Console.WriteLine("进程已启动");
}
static void NotepadTerminated(object sender, EventArgs e)
{
Console.Write("进程已关闭");
}
}
}