C#使用Process类杀死进程,执行命令等

本文介绍了C#中Process类的应用,包括根据进程名获取进程用户名的方法、获取当前活动进程的详细信息、终止指定进程及通过Process类调用外部程序和执行DOS命令的技术要点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

c#之process类相关整理

一、根据进程名获取进程的用户名?

需要添加对 System.Management.dll 的引用

using System.Diagnostics;
using System.Management;

static void Main(string[] args)
{
foreach (Process p in Process.GetProcesses())
{
Console.Write(p.ProcessName);
Console.Write("----");
Console.WriteLine(GetProcessUserName(p.Id));
}

Console.ReadKey();
}

private static string GetProcessUserName(int pID)
{
string text1 = null;

SelectQuery query1 = new SelectQuery("Select * from Win32_Process WHERE processID=" + pID);
ManagementObjectSearcher searcher1 = new ManagementObjectSearcher(query1);

try
{
foreach (ManagementObject disk in searcher1.Get())
{
ManagementBaseObject inPar = null;
ManagementBaseObject outPar = null;

inPar = disk.GetMethodParameters("GetOwner");

outPar = disk.InvokeMethod("GetOwner", inPar, null);

text1 = outPar["User"].ToString();
break;
}
}
catch
{
text1 = "SYSTEM";
}

return text1;
}

 

进程名 是 p.ProcessName

二、获取进程

using System.Diagnostics;

【注】System.Diagnostics 命名空间提供特定的类,使您能够与系统进程、事件日志和性能计数器进行交互。

string str = "";
Process[] processes;
//Get the list of current active processes.
processes = System.Diagnostics.Process.GetProcesses();
//Grab some basic information for each process.
Process process;
for(int i = 0;i<processes.Length-1;i++)
{
process = processes[i];
str = str + Convert.ToString(process.Id) + " : " +
process.ProcessName + "\r\n";
}
System.Windows.Forms.MessageBox.Show(str);
txtProcessID.Text = processes[0].Id.ToString();

//显示进程相关信息
string s = "";
System.Int32 processid;
Process process;
processid = Int32.Parse(txtProcessID.Text);
process = System.Diagnostics.Process.GetProcessById(processid);
s = s + "该进程的总体优先级类别:" + Convert.ToString(process.PriorityClass) + " \r\n";
s = s + "由该进程打开的句柄数:" + process.HandleCount + "\r\n";
s = s + "该进程的主窗口标题:" + process.MainWindowTitle + "\r\n";
s = s + " 该进程允许的最小工作集大小:" + process.MinWorkingSet.ToString() + " \r\n";
s = s + "该进程允许的最大工作集大小:" + process.MaxWorkingSet.ToString() + " \r\n";
s = s + "该进程的分页内存大小:" + process.PagedMemorySize + "\r\n";
s = s + "该进程的峰值分页内存大小:" + process.PeakPagedMemorySize + "\r\n";
System.Windows.Forms.MessageBox.Show(s);
}
catch
{
System.Windows.Forms.MessageBox.Show("不合法的进程ID!");
}

 

【注】Int32 值类型表示值介于-2,147,483,648 到+2,147,483,647 之间的有符号整数。

Int32 提供了一些方法,来比较该类型的实例、将实例的值转换为它的String 表示形式以及将数字的String 表示形式转换为该类型的实例。

有关格式规范代码如何控制值类型的String 表示形式的信息,请参阅格式设置概述。

此类型实现接口IComparable、IFormattable 和IConvertible。使用Convert 类进行转换,而不是使用此类型的IConvertible 显式接口成员实现。

值得一提的是,Process 类具有很多成员变量,这些成员变量可以获得进程的几乎每一个细节。上面的例子中只是简单地选择了几个成员加以演示。如果开发中有需要,可以参考MSDN Library,查询Process类成员以获得更详细的信息,这里就不一一列出了。

三、杀死进程

private void button2_Click(object sender, EventArgs e)
{
if (listView1.SelectedItems.Count > 0)
{
try
{
string proName = listView1.SelectedItems[0].Text;
Process[] p = Process.GetProcessesByName(proName);
p[0].Kill();
MessageBox.Show("进程关闭成功!");
GetProcess();
}
catch
{
MessageBox.Show("无法关闭此进程!");
}
}
else
{
MessageBox.Show("请选择要终止的进程!");
}
}

 


四、C#中利用process类调用外部程序以及执行dos命令

private string RunCmd(string command)
{
//实例一个Process类,启动一个独立进程
Process p = new Process();
//Process类有一个StartInfo属性
//设定程序名
p.StartInfo.FileName = "cmd.exe";
//设定程式执行参数 
p.StartInfo.Arguments = "/c " + command;
//关闭Shell的使用 
p.StartInfo.UseShellExecute = false; 
//重定向标准输入 
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardOutput = true;
//重定向错误输出 
p.StartInfo.RedirectStandardError = true; 
//设置不显示窗口
p.StartInfo.CreateNoWindow = true; 
//启动
p.Start(); 
//也可以用这种方式输入要执行的命令
//不过要记得加上Exit要不然下一行程式执行的时候会当机
//p.StandardInput.WriteLine(command);
//p.StandardInput.WriteLine("exit"); 
//从输出流取得命令执行结果
return p.StandardOutput.ReadToEnd();
}

转载出处

<think>好的,我现在要解决用户在C# WPF应用程序中正确退出窗口并终止相关进程的问题。用户需要示例代码,所以我得先理清楚WPF窗口关闭和进程终止的关系,然后考虑如何正确实现。 首先,用户提到关闭窗口并杀死进程。在WPF中,关闭窗口通常使用Close()方法,但有时候可能因为后台进程或子进程未正确终止,导致应用程序仍在运行。需要确保所有进程都被终止。 我记得在WPF中,Application.Shutdown()方法可以关闭所有窗口并终止应用程序。这可能比单纯关闭窗口更有效。不过,用户可能希望针对特定窗口关闭时执行操作,所以得考虑在窗口的Closed或Closing事件中处理进程终止。 然后是关于杀死进程的部分。用户提到需要杀死相关进程,可能包括子进程。在C#中,Process可以用来启动和终止进程。例如,如果应用程序启动了外部进程,应该在关闭窗口时检查这些进程是否还在运行,并调用Kill方法终止它们。但需要注意,强制终止进程可能会有资源未释放的风险,所以最好先尝试正常关闭,再强制终止。 另外,用户提供的引用中有提到,当父进程被终止时,子进程可能不会自动终止。这可能需要设置子进程的依赖关系,但Windows本身不直接支持子进程依赖父进程。可能需要手动管理,比如在父进程关闭时遍历并终止所有子进程。 现在,我需要编写示例代码。假设用户有一个主窗口,在关闭时需要终止所有相关进程。可能的步骤是: 1. 在窗口的Closing事件中,遍历所有相关进程并终止它们。 2. 调用Application.Current.Shutdown()确保应用程序完全退出。 需要注意,直接调用Kill()可能会有异常,需要处理。例如,进程可能已经退出,或者在终止时出现权限问题。因此,在调用Kill前应检查HasExited属性。 此外,如果进程是窗口内启动的,比如通过Process.Start,应该在级别保持对Process对象的引用,以便在关闭时访问它们。 现在,可能的代码结构: 在MainWindow.xaml.cs中: private Process myProcess; public MainWindow() { InitializeComponent(); myProcess = new Process(); myProcess.StartInfo.FileName = "some.exe"; myProcess.Start(); this.Closing += MainWindow_Closing; } private void MainWindow_Closing(object sender, CancelEventArgs e) { if (!myProcess.HasExited) { myProcess.Kill(); } myProcess.Dispose(); Application.Current.Shutdown(); } 不过,这样可能不够全面。如果有多个进程,需要存储在一个列表里。此外,确保所有资源被正确释放,比如使用using语句或确保Dispose被调用。 另一个情况是,如果应用程序本身可能有多个实例或后台线程,需要确保所有线程在关闭时正确终止。但WPF应用程序通常在主UI线程运行,关闭窗口并调用Shutdown应该结束所有线程。 但用户的问题更侧重于进程而非线程,所以重点放在终止外部进程上。 此外,用户提供的引用[1]中提到,如果进程未退出则杀死它,代码示例是if (!process.HasExited) process.Kill();,这可以应用到示例中。引用[2]提到子进程不会随父进程终止,所以需要显式杀死。引用[3]展示了创建Form实例,可能对WPF窗口的关闭方式有参考,但WPF通常用Shutdown。 综上,正确的步骤应该是: 1. 在窗口关闭时,终止所有启动的外部进程。 2. 确保应用程序完全关闭,调用Application.Shutdown()。 示例代码需要包括如何启动进程,存储引用,并在关闭时终止它们。同时处理可能的异常。</think>在C# WPF应用程序中正确关闭窗口并终止相关进程的实现步骤如下: ### 分步实现 1. **关闭窗口时终止关联进程** ```csharp using System.Diagnostics; using System.Windows; public partial class MainWindow : Window { private Process _externalProcess; public MainWindow() { InitializeComponent(); // 启动外部进程示例 _externalProcess = Process.Start("notepad.exe"); } private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) { // 终止关联进程 if (_externalProcess != null && !_externalProcess.HasExited) { _externalProcess.Kill(); _externalProcess.Dispose(); } // 强制关闭应用程序 Application.Current.Shutdown(); } } ``` 2. **通过按钮触发关闭** ```xml <!-- XAML中定义关闭按钮 --> <Button Content="关闭窗口" Click="CloseButton_Click"/> ``` ```csharp private void CloseButton_Click(object sender, RoutedEventArgs e) { this.Close(); // 触发Closing事件 } ``` ### 关键点说明 1. **进程终止逻辑** - `Process.Kill()`会强制终止进程,需先检查`HasExited`属性避免异常[^1] - 使用`Dispose()`释放资源 - 建议添加异常处理: ```csharp try { if (_externalProcess != null && !_externalProcess.HasExited) { _externalProcess.Kill(); } } catch (InvalidOperationException ex) { // 处理进程已退出的情况 } ``` 2. **应用程序关闭** - `Application.Current.Shutdown()`会终止所有窗口和消息循环 - 使用`Environment.Exit(0)`可替代,但不够优雅 3. **子进程管理** - 若需要跟踪多个子进程,建议使用`List<Process>`集合 - 可通过`Process.GetProcessesByName()`查找特定进程 ```mermaid graph TD A[用户点击关闭按钮] --> B[触发Closing事件] B --> C{有外部进程?} C -- 是 --> D[检查进程状态] D --> E{进程未退出?} E -- 是 --> F[调用Kill()] F --> G[释放进程资源] C -- 否 --> H[直接关闭] G --> I[执行Application.Shutdown] H --> I I --> J[应用程序终止] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值