Single Launch - eine Anwendung nur einmal starten

07. April 2008 von Werner Mager · Gelesen: 1277 · heute: 1

Häufig werden in Oberflächen wie z.B. WinCC externe Programme aufgerufen. Schließt der Benutzer diese jedoch nicht, sondern minimiert sie, so startet er unter Umständen beim nächsten Aufruf eine neue Instanz des Programms und so weiter. Schließlich hat er etliche Instanzen geöffnet, was sicherlich nicht wünschenswert ist.

Um diesem Problem Herr zu werden, habe ich ein kleines Tool geschrieben, das Single Launch heißt.

Es erwartet zwei Parameter:

  • Den Prozessnamen
  • Die Zielanwendung

Zum Beispiel startet “SingleLaunch.exe calc calc.exe” den Windows Taschenrechner, falls dieser noch nicht läuft. Wenn schon eine Instanz des Taschenrechners vorhanden ist (Prozessname “calc”) wird diese statt dessen in den Vordergrund gebracht.

Eine Liste der laufenden Prozesse kann man ganz einfach erhalten:

Process processes = System.Diagnostics.Process.GetProcesses();
foreach (Process process in processes) {}

Man kann auch Prozesse nach ihrem Namen suchen:

System.Diagnostics.Process.GetProcessesByName("calc");

Wenn man eine Referenz auf einen Prozess hat, erhält man über process.MainWindowHandle das Handle auf das Fenster. Nun braucht man noch ein paar Zeilen unmanaged Code und die user32.dll, um das Fenster in den Vordergrund zu bringen:

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool SetForegroundWindow(IntPtr hWnd);
 
[DllImport("user32.dll")]
static extern bool IsIconic(IntPtr hWnd);
 
[DllImport("user32.dll")]
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
 
const int SW_RESTORE = 9;
 
[DllImport("user32.dll")]
static extern IntPtr GetLastActivePopup(IntPtr hWnd); 
 
[DllImport("user32.dll")]
static extern bool IsWindowEnabled(IntPtr hWnd);public static void BringToFront(IntPtr hWnd) {
  if (hWnd != null) {
    // Wenn das Fenster ein Popup zeigt, muss statt dem
    // Programmfenster das Popup in den Vordergrund gebracht werden.
    IntPtr hPopupWnd = GetLastActivePopup(hWnd);
    if (hPopupWnd != null && IsWindowEnabled(hPopupWnd)) {
      hWnd = hPopupWnd;
    }
 
    SetForegroundWindow(hWnd);
    // Wenn das Programm minimiert ist, muss es wiederhergestellt werden.
    if (IsIconic(hWnd)) {
      ShowWindow(hWnd, SW_RESTORE);
    }
  }
}

Hier nun das gesamte Projekt:
SingleLaunch.zip

Hinterlasse eine Antwort