在C#中设置进程名称

时间:2013-09-13 17:14:14

标签: c# process

我编写了一个启动第三方程序的应用程序,该程序从我的程序中的电视频道下载媒体流。我使用的程序是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” 。这样的东西,以确定哪些已经开始并且正在运行。可能吗?我找不到设置友好名称的方法。

5 个答案:

答案 0 :(得分:2)

您无法更改进程名称,但您可以:

答案 1 :(得分:2)

扩展阿列克谢所说的 - 你可以创建一个字典< int,string>跟踪您创建的进程ID /描述性名称。也许您应该将其写入文件以防程序崩溃 - 但是您需要一些特殊的启动处理来处理退出的进程。

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

答案 2 :(得分:1)

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

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);
            }
        }
    }
}

答案 3 :(得分:1)

将进程信息写入文件(或内存映射文件)可能是最佳选择;

但是,您也可以查看Windows消息。即向每个进程发送消息;并让他们回复他们的“内部名称”。

基本上你有一切都在那个队列上听;您首先发送一个命令,命令其他进程报告其内部名称,然后将它们与自己的进程ID一起转储到消息队列中;

请参阅MSMQ

答案 4 :(得分:1)

我对自己也有同样的问题,因为我的解决方案创建了一个新类 -  MyProcess 继承 流程添加了属性 - 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; }
}