2011-01-11 68 views
0

我想顯示另一個應用程序的窗口,如果它隱藏。更具體地說,如果用戶試圖再次啓動它,我想顯示已經啓動的應用程序的主窗口。我已經實施了對重複應用程序啓動的監控。試圖做here但失敗。思考使用遠程處理,但我明白,這不是最好的做法,但在這種情況下,我不需要打擾Windows API。顯示另一個表格

+0

所以你真的希望_your_應用程序是單個實例嗎?如果是這樣,你應該在StackOverflow上找到許多類似問題的好例子...... – Reddog 2011-01-11 22:19:58

回答

0

我已經使用遠程實現它,但是當我有更多的空閒時間時,我會考慮採用其他方式來做這件事。以下是我做的: 在窗體類有:

 public Main() 
    { 
     InitializeComponent();    
     this.ShowFromFormShower = new FormShower.ShowFromFormShowerDelegate(this.ShowFromFormShower1); 
     FormShower.Register(this); 
    } 

    private void ShowFromFormShower1() 
    {    
     this.Show(); 
     this.WindowState = FormWindowState.Normal; 
     this.BringToFront();    
    } 
    public PKW.FormShower.ShowFromFormShowerDelegate ShowFromFormShower; 

另外一個遠程類需要創建:

public class FormShower : MarshalByRefObject 
{  
    /// <summary> 
    /// For remote calls. 
    /// </summary> 
    public void Show() 
    { 
     if (FormShower.m == null) 
      throw new ApplicationException("Could not use remoting to show Main form because the reference is not set in the FormShower class."); 
     else 
      FormShower.m.Invoke(FormShower.m.ShowFromFormShower); 
    } 
    private const int PortNumber = 12312; 
    private static Main m = null; 
    public delegate void ShowFromFormShowerDelegate(); 
    internal static void Register(Main m) 
    { 
     if (m == null) throw new ArgumentNullException("m"); 
     FormShower.m = m; 
     ChannelServices.RegisterChannel(new TcpChannel(FormShower.PortNumber), false);    
     RemotingConfiguration.RegisterActivatedServiceType(typeof(FormShower)); 
    } 
    internal static void CallShow() 
    { 
     TcpClientChannel c = new TcpClientChannel(); 
     ChannelServices.RegisterChannel(c, false); 
     RemotingConfiguration.RegisterActivatedClientType(typeof(FormShower), "tcp://localhost:"+PortNumber.ToString()); 
     FormShower fs = new FormShower(); 
     fs.Show(); 
    } 
} 

因此,如果用戶試圖啓動應用程序第二次應用程序啓動FormShower.CallShow方法。

0

這是一個很不方便的做事情。我建議使用命名管道(System.IO.Pipes)來指示您的應用程序的第一個副本。第一個副本在接收到信號後將激活窗口本身。並且不用擔心任何權限。

0

另一種簡單的方法是使用Windows事件,在.NET中表示爲System.Threading.EventWaitHandle類。

在應用程序中創建一個線程,它所做的只是等待一個命名事件。當事件發出信號時,該線程將使用Form.BeginInvoke使主窗口出現,並返回等待事件。

從應用程序的新實例中,您只需發信號通知事件。

這需要比使用管道少一點的工作。

請注意,無論哪種方式(使用管道,窗口或事件),您都必須處理權限。例如,如果啓用了UAC,並且現有的應用程序實例以管理員身份運行,則新實例可能無法向其發送消息以顯示窗口,除非您確保設置適當的權限(例如,在管道或事件上,無論你的方法是什麼)。

相關問題