2009-05-21 6 views
1

我有一個程序只允許運行一個自己的實例。我用這個代碼如何從MainWindowHandle獲取表單?

bool createdNew = true; 
using(Mutex mutex = new Mutex(true, "MobilePOSServer", out createdNew)) 
{ 
    if(createdNew) 
    { 

     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new MainForm()); 
    } 
    else 
    { 
     Process current = Process.GetCurrentProcess(); 
     foreach(Process proc in Process.GetProcessesByName(current.ProcessName)) 
     { 
      if(proc.Id != current.Id) 
      { 
       SetForegroundWindow(proc.MainWindowHandle); 
      } 
     } 
    } 
} 

我想要做的就是處理命令行參數來調用一些啓動和停止對我的MainForm的WinForm的方法。我可以很好的開始。但是從新的命令行窗口運行應用程序並嘗試調用方法不起作用。我可以讓窗戶來到前面。有沒有一種方法可以從手柄中獲取我的表單?

或者更好的方法來做到這一點?

回答

2
+0

Dang創建單實例非常簡單。我沒有意識到與之交談會是如此的痛苦。雖然有意義。謝謝大家。我剛剛結束了調用exit的過程,我們已經有了代碼來處理表單出口的清理。 – nportelli 2009-05-22 13:40:28

2

您將無法獲取表單本身的引用,否 - 該對象存在於不同的進程中。

如果你想能夠控制另一個進程,它將需要公開某種「遠程訪問」(在這種情況下「遠程」意味着「進程外」,而不是「不同於機」)。這可以通過.NET遠程處理,WCF或基於套接字,命名管道等的簡單協議實現。但是,這可能有點痛苦 - 所以要權衡你在這之前需要多少開始投入太多的工作。

1

如果要在遠程應用程序中執行的方法很簡單,你也可以使用SendMessage函數/ PostMessage的發送窗口消息到其他應用程序和觸發器操作將被執行。

如果你真的需要更多的與另一個實例的交互,而不是簡單的觸發器,我將不得不與Jon的答案一起去,並且我會用命名管道選擇WCF。正如他所說,這將是一個更爲複雜的解決方案,您應該考慮該功能對應用程序的重要性。