无法在 C# 中终止进程?
Posted
技术标签:
【中文标题】无法在 C# 中终止进程?【英文标题】:Unable to kill a process in C#? 【发布时间】:2020-05-23 13:08:00 【问题描述】:我目前正在开发一个可以将 Lua 脚本注入 Roblox 的程序(是的,我知道),到目前为止一切正常,除了 kill 进程。 由于 Roblox 作为单个进程运行,我不需要杀死树。我已经对该主题进行了一些研究,但没有一个有效。
Roblox 作为一个名为 RobloxPlayer.exe 的进程运行,我相信 Process.GetProcessesByName
应该通过它的名称获取该进程。成为 Roblox,而不是 RobloxPlayer.exe
Process[] processes = Process.GetProcessesByName("Roblox");
foreach (Process process in processes)
process.Kill();
process.WaitForExit();
【问题讨论】:
"我认为 Process.GetProcessesByName 应该通过它的名称获取进程。作为 Roblox,而不是 RobloxPlayer.exe" 你为什么这么认为?你有没有试过看看当你使用GetProcessByName("RobloxPlayer")
时会发生什么?
感谢您的建议,虽然这不起作用。
可以给我脚本的代码吗?
@jwu 我会在发布时将它放在 GitHub 上,它现在没有很多功能。
【参考方案1】:
您可以对所有进程进行字符串匹配并终止任何符合您的条件的进程。
String findThisProcess = "Roblox";
foreach (Process process in Process.GetProcesses()) //provides you with a list of all running processes
try
if (process.ProcessName.Contains(findThisProcess, StringComparison.InvariantCultureIgnoreCase))
Console.WriteLine($"Process: Path.GetFileName(process.MainModule.FileName), Name: process.ProcessName");
process.Kill();
process.WaitForExit();
catch (Exception ex)
Console.WriteLine("Couldn't terminate process: " + ex);
编辑:添加了 InvariantCultureIgnoreCase
以便它匹配进程,无论它们的大小写如何。例如。即使您输入vsdebug
,VsDebugConsole.exe
也会被匹配。
【讨论】:
完美运行,谢谢。没有意识到这是一个可行的解决方案。完成!【参考方案2】:在变量中获取当前进程的名称。
var appName = Process.GetCurrentProcess();
var isInstanceAlready = Process.GetProcessesByName(appName.ProcessName).Where(p => p.Id != appName.Id).FirstOrDefault();
【讨论】:
"我相信Process.GetProcessesByName
应该通过它的名称来获取进程。作为Roblox,而不是RobloxPlayer.exe "
是的,但您提供的解决方案与问题无关。您可以更改您的 p.Id 来检查名称,并且您有一个有效的答案。另外,请注意,任何给定应用程序可能运行多个实例,以 chrome 为例,您可能有 10 个 chrome 进程正在运行。
你测试了吗? @乔尔
他要求通过匹配来查找特定进程,而不是当前进程。您的回答没有为此类匹配提供任何输入。以上是关于无法在 C# 中终止进程?的主要内容,如果未能解决你的问题,请参考以下文章
ERROR_BROKEN_PIPE 无法读取进程终止前产生的进程输出
Powershell 中的“Git Log”命令 - 无法终止进程
无法启动SQL Sever(MSSQLSERVER)服务(位于本地计算机上)错误 1067进程意外终止?怎么解决啊???求解