Überprüfung auf mehrere Instanzen eines Spiels

Aus Spieleprogrammierer-Wiki
Wechseln zu: Navigation, Suche

Bitte beachte, dass dieser Artikel noch unvollständig ist! Hilf mit, ihn fertigzustellen.
Näheres dazu findest du ggf. auf der Diskussionsseite. Wenn du der Meinung bist, dass der Artikel vollständig ist, kannst du diesen Hinweis entfernen.

Wie du wahrscheinlich selbst austesten kannst: Viele Spiele der heutigen Zeit kann man (versehentlich) mehrfach starten, aber dennoch öffnet sich nur eine Instanz des Spieles, nicht etwa zwei, drei, vier, sieben oder sogar mehr. Dem Mechanismen dahinter werden wir auf den Grund gehen.

[Bearbeiten] Verwendung

Ein Verfahren zur Verhinderung des mehfachen Startens einer Anwendung benötigen wir zum Beispiel bei Spielen oder Programmen, bei denen es eine Weile dauert, bis der Benutzer nach dessen Start eine Rückmeldung in Form eines Fensters oder Ladebildschirms erhält. Dann kann es passieren, dass der Benutzer durch erneutes Klicken versucht das Programm noch einmal zu starten, weil er denkt, dass sein vorheriger Startversuch nicht erfolgreich war. Dadurch öffnen sich, wenn dies nicht verhindert wird, mehrere Instanzen, und der Start aller Instanzen zieht sich in die Länge oder führt sogar zu Fehlern. Deshalb sollen neue Instanzen des Spiels prüfen, ob bereits eine Instanz geöffnet wurde und sich dann ggf. beenden.

[Bearbeiten] Implementierung

[Bearbeiten] C++/Windows

TODO: Code muss überarbeitet werden! Siehe Diskussionsseite.

bool IsOnlyInstance(LPCTSTR name)
{
    HANDLE handle = CreateMutex(NULL, TRUE, name); // Mutex für jetziges Fenster erstellen.
    
    if(GetLastError() != ERROR_SUCCESS)
    {
        HWND hWnd = FindWindow(name, NULL); // Nach Fenstern mit dem gleichen Titel suchen.
        if(hWnd)
        {
            ShowWindow(hWnd, SW_SHOWNORMAL);    // Fenster in einen Zustand versetzen (Zustände: http://msdn.microsoft.com/en-us/library/windows/desktop/ms633548(v=vs.85).aspx)
            SetFocus(hWnd);                     // Fokus auf dieses Fenster
            SetForegroundWindow(hWnd);          // Fenster in den Vordergrund rücken
            SetActiveWindow(hWnd);              // Fenster als aktives Fenster auswählen
            return false;
        }
    }
    return true;
}

Dieser Code bewirkt, dass wenn ein Fenster schon offen ist, kein weiteres mehr geöffnet werden kann. Außerdem wird das bereits geöffnete Fenster gesucht,

Meine Werkzeuge
Namensräume
Varianten
Aktionen
Navigation
Werkzeuge