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
Antwort
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.
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.
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.
- 1. Render ein anderes neues Formular
- 2. Wie verknüpfe ich ein anderes Formular?
- 3. Verwenden Sie ein anderes Formular Datentabelle
- 4. Übergabe von Variablen in ein anderes Formular
- 5. C# Steuerreferenz an ein anderes Formular übergeben
- 6. Zeige Element auf Hover ein anderes mit css
- 7. Hide div bei Klick und zeige ein anderes div?
- 8. Wie führe ich ein Formular auf ein anderes?
- 9. Schließen Sie ein Formular und rufen Sie dann ein anderes
- 10. Zeige Formular im eigenen Thread
- 11. Zeige ein Formular in div durch jquery nach .html ('');
- 12. Senden ausgewählter Listview-Daten an ein anderes Formular-Textfeld
- 13. InvalidOperationException, wenn ich versuche, ein anderes Formular auszuführen
- 14. Wie setze ich ein anderes Formular als Anwendung in C#
- 15. Übergeben Sie das Datum an ein anderes Formular ändern Format
- 16. Zeige Login-Formular vor Hauptformular in vb.net
- 17. Zeige Testergebnis Formular Testsuites mit TFS api
- 18. Petersilie - Zeige alle Fehler oben auf Formular
- 19. Auslösen von Ereignissen von einem Formular in ein anderes Formular in C#
- 20. Wie übergibt man den Wert von einem Formular an ein anderes Formular beim Absenden?
- 21. Dynamisch ein anderes Element scrollen, wenn ein anderes scrollt
- 22. Wie kann ich ein Formular erstellen, das nicht deaktiviert ist, wenn ein anderes Formular modal angezeigt wird?
- 23. Wie ein anderes Fenster
- 24. Ein anderes Serialisierungsproblem
- 25. Ein Formular von einem anderen Formular schließen?
- 26. Kopiere Formularfelder Werte und füge sie in ein anderes Formular/Tab ein?
- 27. Zeige eine zufällige Ganzzahl in einem EditText-Feld (oder ein anderes Feld, wenn ich mich irre)
- 28. Zeige Warnung bei Klassenwechsel
- 29. Zeige Laden Nachricht auf Formular - Zurück-Button woes
- 30. Zeige Formular beim Installieren der Komponente in Joomla
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
Bereits von .NET unterstützt: http://social.msdn.microsoft.com/forums/en-US/winforms/thread/7c6e0d56-d942 -46f5-b27a-d627e60eebbe/ –
Cool, danke für den Link! –