C# 从我的Winform C执行并关闭其他应用程序#
它是我程序的一小部分,我的程序需要从DataGridView(内容单击事件)启动程序,它只是完美地执行该程序,但无法关闭它,因为一些传入程序的进程名与文件名不同。我也尝试过获取processid,但它引发了以下错误(你能给我提供一个工作代码吗,因为我可以获取winform进程的id,但如何从我的程序中获取外部启动的应用程序的processid。 我试过了,它抛出了以下错误 System.dll中发生类型为“System.ArgumentException”的未处理异常 其他信息:Id为16924的进程未运行。)” 下面是我获取进程id但失败的代码C# 从我的Winform C执行并关闭其他应用程序#,c#,visual-studio,process,wmic,C#,Visual Studio,Process,Wmic,它是我程序的一小部分,我的程序需要从DataGridView(内容单击事件)启动程序,它只是完美地执行该程序,但无法关闭它,因为一些传入程序的进程名与文件名不同。我也尝试过获取processid,但它引发了以下错误(你能给我提供一个工作代码吗,因为我可以获取winform进程的id,但如何从我的程序中获取外部启动的应用程序的processid。 我试过了,它抛出了以下错误 System.dll中发生类型为“System.ArgumentException”的未处理异常 其他信息:Id为16924
private void button1_Click(object sender, EventArgs e)
{
var processid = Process.Start("Calc");
pn =processid.ProcessName;
pid = processid.Id;
}
int pid;
String pn;
private void button2_Click(object sender, EventArgs e)
{
var process1 = Process.GetProcessById(pid);
process1.Kill();
}
虚拟代码如下所示
我已经试过:
private void button1_Click(object sender, EventArgs e)
{
Process.Start("Calc");
}
private void button2_Click(object sender, EventArgs e)
{
foreach (var process in Process.GetProcessesByName("Calc"))
{
process.Kill();
}
}
我的代码:
private void button1_Click(object sender, EventArgs e)
{
Process.Start("THIS PATH WILL COME FROM DATABASE");
}
private void button2_Click(object sender, EventArgs e)
{
foreach (var process in Process.GetProcessesByName("PROCESS NAME WHICH MY PROGRAM STARTED"))
{
process.Kill();
}
}
启动进程时,获取进程的
Id
,并将其存储。然后,您可以通过Id获取进程以终止它。这不仅确保您不需要知道进程的名称(以防它与启动它的路径不同)但是,如果有多个实例正在运行,其中一些实例不是由您的程序启动的,则可以确保杀死正确的实例。您是将其存储在单个变量中,还是最好将其存储在列表中,并在列表中进行迭代?@Symon这取决于程序的性质及其需要实际操作。您是否打算启动多个实例,然后将其全部杀死?您是否打算一次只运行一个实例?是否有一个按钮可以杀死所有正在运行的实例,或者有不同的按钮可以杀死不同的实例?您想做的事情将影响您存储数据的方式。其他程序是否为窗口应用程序(如Windows窗体)。如果是这样,你可能想在杀死他们时更加礼貌。给他们发送一条WM_QUIT
消息,然后,如果他们在一段时间内没有自杀,就退出进程。kill
shotgun。要做到这一点,你需要找到与该进程相关联的顶级窗口。@Symon实际上,WINFORM需要关闭在处理所有应用程序时关闭所有应用程序。因此,在我的实践或虚拟代码中,我希望我的按钮关闭所有已启动的应用程序。(顺便说一句,谢谢大家,我相信我最终会很开心的。)@Flydog57它们可能是,也可能不是,用户将添加程序并相应地执行它们…请停止这样写,因为你不应该只选择随机的大写字母。对不起@JamesZ,谢谢:)你在回复中做了完全相同的事情?