调用Process.Start一次和后续调用,无需启动新进程

时间:2017-08-28 20:53:40

标签: c#

我有一个c#方法,使用第三方可执行文件设置所有监视器的亮度。我使用下面的方法调用它。问题是我需要用不同的参数调用这个可执行文件来改变亮度。但是每次调用SetBrightness时,我的代码都会创建一个新进程。如何使用已经运行的退出流程,并传递不同的参数再次执行它?我没有看到Process类中的任何方法使这变得容易。

编辑:当我使用命令行运行此exe时,该进程在Windows系统托盘中保持打开状态,我看到该进程正在任务管理器中运行。但是,当我运行我的代码时,我有时会在任务管理器中看到exe的两个实例。所以我想我要做的是总是调用相同的实例,但使用不同的参数。每次都重新启动exe不是一个选项,因为每次启动都需要很长时间。

    public bool SetBrightness(short monitorStartIndex, short monitorEndIndex, short brightness)
    {
        // Construct the parameter string used by the tool so that it updates all monitors in one call.
        // Example "1 b75 2 b75" will set brightness to 75 for monitors 1 and 2.
        StringBuilder arguments = new StringBuilder();
        for (int i = monitorStartIndex; i <= monitorEndIndex; i++)
        {
            arguments.Append(i).Append(" ");
            arguments.Append(string.Format("b{0}", brightness)).Append(" ");
        }

        var path = Path.GetDirectoryName(Environment.GetCommandLineArgs()[1]);
        var final = Path.Combine(path, "External Assemblies\\ClickMonitorDDC_3_9.exe");

        var p = new Process
        {
            StartInfo =
            {
                FileName = final,
                Arguments = arguments.ToString(),
                UseShellExecute = false,
                RedirectStandardOutput = true
            }
        };

        try
        {
            p.Start();
        }
        catch (Exception e)
        {
            Trace.TraceError("Error while changing the brightness using ClickMonitorDDC_3_9.exe. Inner Exception : " + e.Message);
            return false;
        }

        return true;
    }

1 个答案:

答案 0 :(得分:0)

您将需要使用Process类中可用的WaitForExit方法。如果您尝试使用与代码中相同类型的参数从命令行使用第三方可执行文件,它应该返回到提示,因为它正在设置参数并退出。只要你想改变亮度,就可以调用你的方法,等到它被设置并退出。

更改您的代码,如下所示:

 try
    {
        p.Start();
        p.WaitForExit()
    }