Announcement

Collapse
No announcement yet.

Programm nur mit einer Instanz starten

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Programm nur mit einer Instanz starten

    Hallo,
    ich möchte, dass auf einem PC (m)ein Programm nur mit einer Instanz gestartet werden kann; jeder weitere Startversuch soll mit Meldung abgebrochen oder automatisch auf die erste Instanz umgeleitet werden.
    Unter Win32 und Delphi geht dies mit Semaphoren i.V.m. FindWindow recht einfach (siehe u.a. Andreas Kosch: Delphi Win32-Lösungen). Unter codeproject.com habe ich eine Komponente für NET 2.0 gefunden.
    Gibt es so etwas auch für NET 1.1 (vorzugsweise C#)?
    Danke!
    Jürgen

  • #2
    Hi,

    Du kannst einfach die Win32-APIs verwenden und in deinem DotNet-Code (egal ob 1.1 oder 2.0) zum Beispiel so verwenden (leider im VB-Dialekt):

    ------------------------------------------------------------------------
    'Win32-API-Funktionen deklarieren
    Private Declare Function FindWindow Lib "user32" (ByVal lpClassName As String, ByVal lpWindowName As String) As Boolean
    Private Declare Function ShowWindow Lib "user32" (ByVal handle As IntPtr, ByVal nCmd As Int32) As Boolean
    Private Declare Function SetForegroundWindow Lib "user32" (ByVal handle As IntPtr) As Boolean

    'Startfunktion
    Private Shared Function startclient(ByVal apppath As String, ByVal appname As String, ByVal proname As String) As Boolean

    'Anwendung finden & öffnen/neu starten

    Dim procexs() As Process

    If Not proname Is Nothing Then
    procexs = Process.GetProcessesByName(proname)
    If procexs.Length > 0 Then
    ShowWindow(procexs(0).MainWindowHandle, 1)
    SetForegroundWindow(procexs(0).MainWindowHandle)
    Return True
    Else 'Programm starten
    If Not apppath Is Nothing And Not appname Is Nothing Then
    Try
    Process.Start(apppath & "\" & appname)
    Catch ex As Exception
    MsgBox(ex.Message)
    End Try
    Return True
    End If
    End If
    End If
    Return False

    End Function
    ------------------------------------------------------------------------

    Um jetzt zum Beispiel sowas mit Notepad zu machen:
    startclient("c:\windows", "notepad.exe", "notepad")

    Gruss
    Fo

    Comment


    • #3
      Danke "Fox", aber das ist nicht das, was ich möchte.
      Ich will nicht für ein "fremdes" Programm den Mehrfachstart verhindern, sondern für das <u>eigene.</u>
      Der Hinweis auf FindWindow usw. ist grundsätzlich hilfreich; ich möchte mich aber - wenn es irgend geht - auf die NET-Klassen beschränken.
      Ich habe jetzt einen Hinweis auf die <b>Manifest-Datei AssemblyInfo</b> gefunden. Dort wird die richtige Lösung angedeutet:
      <b>[assembly: AssemblyFlags("AllowMultiple = false")]</b>
      Aber so ist es falsch, weil als Flag ein uint-Parameter benötigt wird. Aber in der SDK-Doku finde ich die Zusammenstellung der Werte nicht.
      <u>Mit welchen Werten wird AssemblyFlags festgelegt?</u>
      Danke! Jürge

      Comment


      • #4
        Hallo!

        Vielleicht geht es über Mutex. In .net gibt es eine entsprechende Klasse (System.Threading.Mutex).
        Hier im Forum ist ein Beispiel hierzu enthalten.

        Falls jemand eine Lösung bzw. einen besseren Vorschlag hat währe ich über einer Veröffentlichung hier im Forum sehr erfreut.

        mfg
        Thomas Sparenberg

        P.S.: In VB.net gibt es unter den Projektoptionen eine Einstellung die für dieses Verhalten sorgt

        Comment


        • #5
          Hallo!

          Test in der Mittagspause ergabe folgenden Code:

          static class Program
          {
          /// <summary>
          /// Der Haupteinstiegspunkt für die Anwendung.
          /// </summary>
          [STAThread]
          static void Main()
          {
          bool ok;
          System.Threading.Mutex mut = new System.Threading.Mutex(true, "MyAppName0815", out ok);

          if (ok)
          {
          Application.EnableVisualStyles();
          Application.SetCompatibleTextRenderingDefault(fals e);
          Application.Run(new Form1());
          }
          else
          {
          MessageBox.Show("Programm bereits aktiv.");
          }
          }
          }

          Hierdurch wird das Programm nur einmal gestartet.

          mfg
          Thoma

          Comment


          • #6
            Danke recht herzlich,

            so ähnlich hatte ich es mir gedacht, aber für die Realisierung unter NET und C# hatte ich nicht die richtige Idee.

            Nochmals vielen Dank!
            Jürge

            Comment

            Working...
            X