2011-06-25 20 views
3

我正在使用System.Diagnostics.Process.Start在另一臺域計算機上啓動遠程應用程序。從C#啓動遠程進程的問題#

不幸的是,如果遠程進程已經在運行,但是在遠程機器桌面的後臺,應用程序不會使用Process.Start獲得焦點。

問題1:是否有另一種API或機制來強制遠程應用程序獲得焦點或閃光以獲得用戶的注意力?

我注意到的另一個問題是,如果遠程進程已經在運行,除了原始執行程序之外,還可能執行一個新的實例。這違反MSDN文檔它說:

「如果該進程已在運行,沒有額外的進程資源開始取而代之,現有工藝資源被重複使用,沒有新的進程組件被創建在這種情況下,代替。返回一個新的Process組件,Start將返回null給調用過程。「

問題2:有沒有人找到一種方法來阻止應用程序的第二個實例在這種情況下推出? WMI是用於遠程啓動應用程序的更好選擇嗎?

+0

你可以修改你試圖調用(或願意)的應用程序的代碼嗎? – PedroC88

+0

不,不幸的是它是第三方顯微鏡控制器/圖像記錄儀。我的設置是一個帶2臺HP TouchSmart PC的地質實驗室。我的應用程序運行在左側顯示器上,當用戶點擊/觸摸顯微鏡按鈕時,它最好在右側顯示器上啓動(或提出)第三方應用程序。 – retrodrone

+0

噢,好吧,我正在建議將Mutex類作爲一種確保不多於1個應用程序實例同時運行的方法。但是如果你不能修改它,那麼我的雙手就會被綁住。 – PedroC88

回答

2

那麼,不知道這會對你有多好,但它是一個示例類,你可以在助手程序中使用。這只是一個開始,如果你打算使用它,你將需要一個網絡系統(儘管C#不會壞)。告訴我它是如何爲你工作的。

/// <summary> 
/// Allows you to start a specified program, or if it is already running, bring it into focus 
/// </summary> 
static class SFProgram 
{ 
    static public void StartFocus(string FileName, string ProcessName) 
    { 
     if (!ProcessStarted(ProcessName)) 
      Process.Start(FileName); 
     else 
      SFProgram.BringWindowToTop("notepad"); 
    } 

    [DllImport("user32.dll")] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    static extern bool SetForegroundWindow(IntPtr hWnd); 
    [DllImport("user32.dll")] 
    static extern IntPtr FindWindow(string lpClassName, string lpWindowName); 

    /// <summary> 
    /// Bring specified process to focus 
    /// </summary> 
    /// <param name="windowName">Process Name</param> 
    /// <returns>If it was successful</returns> 
    private static bool BringWindowToTop(string windowName) 
    { 
     Process[] processes = Process.GetProcessesByName(windowName); 
     foreach (Process p in processes) 
     { 
      int hWnd = (int)p.MainWindowHandle; 
      if (hWnd != 0) 
      { 
       return SetForegroundWindow((IntPtr)hWnd); 
      } 
      //p.CloseMainWindow(); 
     } 
     return false; 
    } 

    private static bool ProcessStarted(string ProcessName) 
    { 
     Process[] processes = Process.GetProcessesByName(ProcessName); 
     return (processes.Length > 0); 
    } 
} 
+0

感謝代碼,我還沒有機會嘗試它。明天吧。我很感激。 – retrodrone

+0

沒問題,我寧願指出你正確的方向(憎恨只爲某人寫點東西),但這似乎只是幫手程序的一小部分。 – Ben

+0

我的實現很漂亮,謝謝@mazzzzz。我加強了Process.Start以要求用戶憑證。我不需要在目標上運行任何代碼。謝謝! – retrodrone