Überprüfung auf mehrere Instanzen eines Spiels

Aus Spieleprogrammierer-Wiki
Version vom 9. Dezember 2011, 17:46 Uhr von Checkmateing (Diskussion | Beiträge)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
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.

Inhaltsverzeichnis

  1. Einführung
  2. Der Syntax
1. Einführung

Was wollen wir hier eigentlich machen? Nun, wie du wahrscheinlich selbst austesten kannst: Wenn man bei vielen Spielen der heutigen Zeit aus dem Versehen mehrere Instanzen öffnet, durch ein hohes Quantum an Mausklicks, dann öffnet sich trotz dessen nur eine Instanz des Spieles, nicht etwa Zwei, Drei, Vier, Sieben oder sogar mehr. Wie wird dies bewerkstelligt? Dieser Frage gehen wir auf den Grund. Doch wozu eigentlich? Nun wir benötigen dies zum Beispiel bei Spielen oder Programmen, wo das Fenster seine zeit benötigt bis es offen ist oder eben wenn der Benutzer mehrfach den linken Mausbutton betätigt. Dadurch öffnen sich mehr Instanzen und es dauert noch länger bis sich überhaupt eine öffnet. Dann klickt der Nutzer womöglich nochmals darauf und nochmal und nochmal! Fast ein kleiner Teufelskreis.

2. Der Syntax

Benötigt wird Windows.h!

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 ([http://msdn.microsoft.com/en-us/library/windows/desktop/ms633548(v=vs.85).aspx Hier] einsehbar)
            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 also, dass wenn ein Fenster schon offen ist kein weiteres mehr geöffnet werden kann. Nicht wie eventuell angenommen wurde, dass die anderen Instanzen geschlossen werden. Wir packen das Problem gleich an der Wurzel.

Meine Werkzeuge
Namensräume
Varianten
Aktionen
Navigation
Werkzeuge