2017-08-28 54 views
0

我有一個C#方法,它使用第三方可執行文件設置所有顯示器的亮度。我使用下面的方法調用它。問題是我需要用不同的參數調用這個可執行文件來改變亮度。但每次我調用SetBrightness時,我的代碼都會創建一個新進程。如何使用已經運行的退出進程並傳遞不同的參數來再次執行?我沒有看到Process類中的任何方法使得這很容易。調用Process.Start一次和後續調用,而不開始新的過程

編輯:當我使用命令行運行此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

爲什麼不將過程存儲爲靜態變量,然後結束調用在啓動該功能的過程中,每次?編輯:或者,如果進程設置爲在其已經運行後接收更多數據,則每次發送新指令。沒有更多信息,這是我能給出的最佳答案。 – HumbleWebDev

+4

你說你需要用不同的參數來調用這個exe來改變亮度。所以,除非你真的不需要這樣做,否則你不需要再次啓動它作爲一個新的進程來再次啓動exe文件嗎?我錯過了什麼嗎? –

+0

我編輯了我的問題與更多信息。希望這可以幫助。我如何發送新的說明? – Ray

回答

0

您將需要使用Process類中可用的WaitForExit方法。如果您嘗試使用與代碼中相同類型的參數從命令行使用第三方可執行文件,則應該在設置參數和退出時返回提示。只要你想改變亮度並等待它被設置並退出,你就可以調用你的方法。

更改您的代碼如下所示:

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

這是如何讓我用不同參數重新運行可執行文件的?我不明白。 – Ray

+0

當使用p.WaitForExit時,該過程基本上被關閉。然後你會再次調用你的SetBrightness方法。我沒有看到如何改變正在運行的進程的現有參數,因爲進程方法使用的啓動參數在運行進程的新實例時被觸發。這至少可以防止留下大量開放的流程,但是您將無法更改現有的流程 – Darthchai

相關問題