Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C中设置进程名称#_C#_Process - Fatal编程技术网

C# 在C中设置进程名称#

C# 在C中设置进程名称#,c#,process,C#,Process,我编写了一个应用程序,启动一个第三方程序,从我的程序上的电视频道下载媒体流。我正在使用的程序是rtmpdump.exe。它们作为独立进程运行,如下所示: ProcessStartInfo startInfo = new ProcessStartInfo(); startInfo.FileName = path + rtmpdump; startInfo.Arguments = rtmpdump_argument; startInfo.WorkingDirectory = path; startI

我编写了一个应用程序,启动一个第三方程序,从我的程序上的电视频道下载媒体流。我正在使用的程序是rtmpdump.exe。它们作为独立进程运行,如下所示:

ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = path + rtmpdump;
startInfo.Arguments = rtmpdump_argument;
startInfo.WorkingDirectory = path;
startInfo.WindowStyle = ProcessWindowStyle.Minimized;
Process p = Process.Start(startInfo);

但是我想给这些进程命名,因此如果我的程序崩溃或必须重新启动,那么我可以检查当前进程的名称,看看是否有一个名为“BBC World-News at 7”的进程。类似这样的东西,以确定哪些已经启动并且当前正在运行。可能吗?我找不到设置友好名称的方法。

您不能更改进程名称,但可以:

  • 用于标识流程(Id:“…系统生成的流程唯一标识符…”)
  • 获取进程命令行并查看是否有任何有趣的内容(可能需要一些PInvoke/WMI)
扩展Alexei所说的内容-您可以创建一个字典,以跟踪您创建的进程ID/描述性名称。也许你应该把它写进一个文件,以防你的程序崩溃——但是你需要一些特殊的启动处理来处理退出的进程


启动时,您希望读取该文件,检查当前进程是否与现有进程匹配,并删除任何不再存在的进程(错误的进程id或exe名称)。您可能希望在每次创建新进程并写入文件时都这样做。

以下是一些您可以使用的代码

public class ProcessTracker {
    public Dictionary<int, string> Processes { get; set; }

    public ProcessTracker() {
        Processes = new Dictionary<int, string>();
    }

    public void AddProcess(Process process, string name) {
        Processes.Add(process.Id, name);
    }

    //Check if what processes are still open after crash.
    public void UpdateProcesses() {
        List<Process> runningProcesses =
            Process.GetProcesses().ToList();

        Processes = Processes
            .Where(pair => runningProcesses
                .Any(process => process.Id == pair.Key))
            .ToDictionary(pair => pair.Key, pair => pair.Value);
    }

    //Use this to see if you have to restart a process.
    public bool HasProcess(string name) {
        return Processes.Any(pair => pair.Value != name);
    }

    //Write the file on crash.
    public void ReadFile(string path) {
        if (!(new FileInfo(path).Exists))
            return;

        using (StreamReader reader = new StreamReader(path)) {
            foreach (string line in  reader.ReadToEnd()
                .Split(new[] {"\n"}, StringSplitOptions.RemoveEmptyEntries)) {
                string[] keyPair = line.Split(',');

                Processes.Add(int.Parse(keyPair[0]), keyPair[1]);
            }
        }
    }

    //Read the file on startup.
    public void SaveFile(string path) {
        using (StreamWriter writer = new StreamWriter(path, false)) {
            foreach (KeyValuePair<int, string> process in Processes) {
                writer.WriteLine("{0},{1}",
                    process.Key, process.Value);
            }
        }
    }
}
公共类ProcessTracker{
公共字典进程{get;set;}
公共进程跟踪器(){
进程=新字典();
}
public void AddProcess(进程进程,字符串名称){
processs.Add(process.Id,name);
}
//检查崩溃后哪些进程仍处于打开状态。
public void UpdateProcesses(){
列出运行进程=
Process.getprocesss().ToList();
进程=进程
.Where(pair=>runningprocesss
.Any(进程=>process.Id==pair.Key))
.ToDictionary(pair=>pair.Key,pair=>pair.Value);
}
//使用此选项查看是否必须重新启动进程。
公共bool HasProcess(字符串名称){
返回进程.Any(pair=>pair.Value!=name);
}
//在崩溃时写入文件。
公共void读取文件(字符串路径){
如果(!(新文件信息(路径).Exists))
返回;
使用(StreamReader=新StreamReader(路径)){
foreach(reader.ReadToEnd()中的字符串行)
.Split(新[]{“\n”},StringSplitOptions.RemoveEmptyEntries)){
string[]keyPair=line.Split(',');
Add(int.Parse(keyPair[0]),keyPair[1]);
}
}
}
//启动时读取文件。
公共void保存文件(字符串路径){
使用(StreamWriter=newstreamwriter(路径,false)){
foreach(进程中的KeyValuePair进程){
writer.WriteLine({0},{1}),
过程、关键、过程、价值);
}
}
}
}

将流程信息写入文件(或内存映射文件)可能是一种方法

不过,您也可以查看windows消息传递。i、 e.向每个流程发送消息;并让他们回复“内部名称”

基本上,你可以在队列中听到所有内容;首先发送命令,命令另一个进程报告其内部名称,然后将其与自己的进程id一起转储到消息队列中


参见

我也有同样的问题,因为我的解决方案创建了一个新类- MyProcess继承了Process的,并添加了一个属性-ProcessId

在我的例子中,我将ProcessId存储在一个与其他数据相关的数据库中。根据其他数据的状态,我决定终止进程

然后我将进程存储在一个字典中,如果需要,可以将该字典传递给其他类,在这些类中可以访问以终止进程

因此,当我决定终止一个进程时,我通过ProcessId从字典中提取该进程,然后终止它

样本如下:

public class Program
{
    private static Dictionary<string, MyProcess> _processes;

    private static void Main()
    {
        // can store this to file or db
        var processId = Guid.NewGuid().ToString();

        var myProcess = new MyProcess
        {
            StartInfo = { FileName = @"C:\HelloWorld.exe" },
            ProcessId = processId
        };

        _processes = new Dictionary<string, MyProcess> {{processId, myProcess}};

        myProcess.Start();

        Thread.Sleep(5000);

        // read id from file or db or another
        var pr = _processes[processId];

        pr.Kill();

        Console.ReadKey();
    }
}

public class MyProcess : Process
{
    public string ProcessId { get; set; }
}
公共类程序
{
私有静态字典\u进程;
私有静态void Main()
{
//可以将其存储到文件或数据库中
var processId=Guid.NewGuid().ToString();
var myProcess=新的myProcess
{
StartInfo={FileName=@“C:\HelloWorld.exe”},
ProcessId=ProcessId
};
_进程=新字典{processId,myProcess};
myProcess.Start();
睡眠(5000);
//从文件或数据库或其他文件读取id
var pr=_进程[processId];
pr.Kill();
Console.ReadKey();
}
}
公共类MyProcess:进程
{
公共字符串ProcessId{get;set;}
}

您是在尝试这样做,以便进程在windows中运行时显示不同的名称,还是只需要在内部有一个标识符?最好使用共享内存(内存映射文件)您的评论有误导性,我刚刚尝试过,它仍然有效,请解释您认为它不起作用的原因,或者将其删除。如果我打开windows任务管理器,则不会根据“ProcessID”字符串设置进程名称OP所追求的确切解决方案无法实现,因此答案中提供了备选方案。我的解决方案是另一种选择,我个人使用它。每次应用程序启动一个新进程时,您都会将其id记录在一个键值对中,这可能与其他数据关联。您可以让其他应用程序预先定期监控每个进程,根据它们的状态,用户可能会决定启动一个新进程。因此,您可以查看另一个应用程序的输出(生成进程的状态),而不是查看任务管理器中的名称。然后采取相应行动。希望能有帮助。谢谢你,我错了。我