2011-01-11 16 views
0

Ich möchte Fenster einer anderen Anwendung anzeigen, wenn es ausgeblendet ist. Genauer gesagt möchte ich das Hauptfenster der bereits gestarteten Anwendung anzeigen, wenn der Benutzer versucht, es erneut zu starten. Ich habe bereits die Überwachung doppelter Anwendungsstarts implementiert. Versucht, wie in here zu tun, aber gescheitert. Ich denke, es mit Remoting zu machen, aber ich verstehe, dass dies nicht die beste Vorgehensweise ist, obwohl ich in diesem Fall keine Probleme mit der Windows-API haben muss.zeige ein anderes Formular

+0

Sie möchten also eigentlich, dass _ihre_ Anwendung eine Einzelinstanz ist? Wenn ja, sollten Sie bereits viele gute Beispiele für ähnliche Fragen zu StackOverflow finden ... – Reddog

+0

Bereits von .NET unterstützt: http://social.msdn.microsoft.com/forums/en-US/winforms/thread/7c6e0d56-d942 -46f5-b27a-d627e60eebbe/ –

+0

Cool, danke für den Link! –

Antwort

0

Ich habe es bereits mit Remoting implementiert, aber ich werde andere Möglichkeiten in Betracht ziehen, wenn ich mehr Freizeit habe. Hier ist, wie ich es tat: In Form Klasse haben wir:

 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; 

Auch eine Remote Klasse erstellt werden muss:

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(); 
    } 
} 

Also, wenn der Benutzer versucht, die Anwendung ein zweites Mal zu starten, die Anwendung startet die FormShower.CallShow-Methode.

0

Das ist eine ziemlich hackische Art, Dinge zu tun. Ich würde empfehlen, Named Pipes (System.IO.Pipes) zu verwenden, um die erste Kopie Ihrer App zu signalisieren. Die erste Kopie wird nach Empfang des Signals das Fenster selbst aktivieren. Und keine Sorgen um irgendwelche Berechtigungen.

0

Eine weitere ziemlich einfache Möglichkeit ist die Verwendung eines Windows-Ereignisses, das in .NET als System.Threading.EventWaitHandle-Klasse dargestellt wird.

Erstellen Sie einen Thread in der Anwendung, dass es nur auf ein benanntes Ereignis wartet. Wenn das Ereignis signalisiert wird, verwendet dieser Thread Form.BeginInvoke, um das Hauptfenster anzuzeigen und zurück zu gehen, um auf das Ereignis zu warten.

Von der neuen Instanz der Anwendung müssen Sie nur das Ereignis signalisieren.

Dies erfordert etwas weniger Arbeit als die Verwendung von Rohren.

Beachten Sie, dass Sie (mit Rohren, Fenstern oder Ereignissen) immer mit Berechtigungen arbeiten müssen. Wenn beispielsweise die Benutzerkontensteuerung aktiviert ist und die vorhandene Anwendungsinstanz als Administrator ausgeführt wird, kann die neue Instanz die Nachricht möglicherweise nicht senden, um das Fenster anzuzeigen, sofern Sie nicht die richtigen Berechtigungen (z auf dem Rohr oder der Veranstaltung, was auch immer Ihre Methode ist) im Voraus.

Verwandte Themen