2010-07-16 86 views
2

我的c#WinForm解決方案包含多個項目,其中包括具有多個窗體的Admin項目和具有多個窗體的User項目。我希望我的用戶表單在特定的管理員表單處於打開狀態時表現不同。確定另一個項目的窗體是否打開

用戶表單如何告知管理員表單何時打開?

所有表單都沒有'this.Text'值(所有這些值爲空)。

當我遍歷由'FormCollection fc = Application.OpenForms'標識的所有窗體時,它不顯示來自另一個項目的窗體;它似乎只顯示來自同一個項目的表格。

另外,所有管理員表單都從一個.exe文件運行,所有用戶表單都從另一個.exe文件運行。

任何幫助表示讚賞。

回答

1

使用該範圍的Mutex類。
互斥鎖是Windows內核對象,具有Windows計算機的唯一標識符。

public class Form2 : Form 
{ 
    Mutex m; 
    protected override void OnShown(EventArgs e) 
    { 
     base.OnShown(e); 
     m = new Mutex(true, "Form2"); 
    } 

    protected override void OnClosed(EventArgs e) 
    { 
     base.OnClosed(e); 
     m.ReleaseMutex(); 
    } 
} 

public class Form3 : Form 
{ 
    bool form2IsOpen; 
    public Form3() 
    { 
     try 
     { 
      Mutex.OpenExisting("Form2"); 
      form2IsOpen = true; 
     } 
     catch (WaitHandleCannotBeOpenedException ex) 
     { 
      form2IsOpen = false; 
     } 
    } 
} 
+0

你好Serhio,謝謝你的迴應。我實現了你的建議,但是我無法獲得釋放的互斥體。我發佈了一個有關此問題的詳細信息的新問題。如果你有時間,我會很感激你看看它。新的問題在這裏:http://stackoverflow.com/questions/3275527/mutex-not-releasing – Frederick 2010-07-18 12:44:44

+0

@Frederik:所以,想知道,什麼是該解決方案除了OpenExisting之外還調用WaitOne(0)? – serhio 2010-07-19 10:42:50

+0

我仍在努力。昨天我意識到我的代碼遭受了弱點,在某些情況下(我測試的條件),打開了Admin表單的多個副本,一個在另一個之上。這導致了很多異常被拋出。一旦它工作,我會發布我的代碼。 – Frederick 2010-07-20 13:07:33

0

您需要的是一種進程間通信方式。
有很多方法可以實現這一點,大多數情況下都會導致您的情況過度。
我這是最好的方法是你的情況是有一個文件,管理進程將寫入其他進程將讀取和推斷管理進程的狀態。

+0

您好Itay。感謝您的迴應。我喜歡你的建議,因爲它很簡單;但是,我擔心安全問題,因爲某人可能很容易更改存儲在文件中的值。你知道一種方法來實現你的建議,在文件被保護的地方被操縱嗎? – Frederick 2010-07-18 12:48:34

+0

您可以使用模擬來將文件寫入/讀取爲另一個用戶,該用戶將是對該文件具有權限的唯一用戶。但需要添加一個特殊用戶才能添加到您部署程序的機器上。互斥解決方案更好:)但我不確定這裏寫的用法是否有效。 – 2010-07-18 13:19:32

+0

@意大利:什麼讓你懷疑提出的解決方案? – serhio 2010-07-20 08:36:27

相關問題