Einzelinstanzanwendung

  • WPF

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von ~blaze~.

    Einzelinstanzanwendung

    Hallo zusammen,

    ich habe versucht über "Projekt | <NameDerAnwendung>-Eigenschaften | Anwendung" die Checkbox "Einzelinstanzanwendung erstellen" anzuwählen.

    Allerdings ist bei meiner WPF anwendung die Checkbox nicht vorhanden.

    Kann ich das Programm als Einzelinstanzanwendung über den Code deffinieren?

    Mdf Ben
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."
    In WPF ist das leider tatsächlich noch nicht "von Haus aus" lösbar. Eine solche Option halt ich für Recht trivial, daher nehme ich an, es gibt andere Gründe, dass so etwas nicht schon längst vorhanden ist.

    Es gibt aber schon relativ viele vorgefertigte Lösungen:
    pietschsoft.com/post/2009/01/S…Application-in-NET-3.aspx
    codeproject.com/Articles/84270…ngle-Instance-Application
    elegantcode.com/2011/03/02/wpf…gle-instance-application/

    Hier eine Lösung, die ich vor einiger Zeit verwendet habe und soweit gut funktioniert hat (C#):
    stackoverflow.com/a/8885460/1391710

    Wobei ich jedoch dazu rate, als Mutex eine GUID oder einen Hash zu nehmen, von dem zu vermuten ist, dass er einzigartig ist.
    „Was daraus gefolgert werden kann ist, dass jeder intelligentere User sein Geld lieber für Bier ausgibt, um einen schönen Rausch zu haben, und nicht dieses Ranzprodukt.“

    -Auszug aus einer Unterhaltung über das iPhone und dessen Vermarktung.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Lukas“ ()

    Danke erst mal für die schnelle Antwort.

    Ich habe jetzt versucht die Lösung umzusetzten.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Partial Public Class clsApp
    2. Protected Overrides Sub OnStartup(e As StartupEventArgs)
    3. ' Get Reference to the current Process
    4. Dim thisProc As Process = Process.GetCurrentProcess()
    5. ' Check how many total processes have the same name as the current one
    6. If Process.GetProcessesByName(thisProc.ProcessName).Length > 1 Then
    7. ' If ther is more than one, than it is already running.
    8. MessageBox.Show("Application is already running.")
    9. Application.Current.Shutdown()
    10. Return
    11. End If
    12. Me.OnStartup(e)
    13. End Sub
    14. End Class


    Allerdings scheitere ich daran das es noch keine "OnStartup" Sub gibt die ich per Overrides überschreiben könnte.
    Mache ich was falsch oder habe ich noch was vergessen?
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."
    Hi
    ich denke, dass die 2. Lösung die beste ist, die erste funktioniert in manchen Fällen gar nicht, da ja ein neuer Prozess gestartet werden kann, während die Schleife durchläuft.
    Da wird es über ein Mutex gelöst und halt per Remoting. Wenn man dem Mutex einen eindeutigen Namen zuordnet und bei der Instanzierung überprüft, ob der aktuelle Thread der erzeugende war, kann man eben abfragen, ob bereits eine Instanz der Anwendung am laufen ist. Sofern das der Fall ist, werden in dem Code dann per IPC die Daten übertragen. Ipc ist eher nicht meins, wenn du es anders lösen willst, erzeuge dir in der ersten Instanz einen Pipeserver und übertrage dorthin die Commandline der anderen Instanzen (Environment.CommandLine oder das Argument des Einstiegpunkts Main(string[]) deiner Anwendung).

    Gruß
    ~blaze~