Überprüfung auf mehrere Instanzen eines Spiels

Aus Spieleprogrammierer-Wiki
(Unterschied zwischen Versionen)
Wechseln zu: Navigation, Suche
[unmarkierte Version][gesichtete Version]
(C++/Windows)
(C++/Windows)
Zeile 9: Zeile 9:
 
== Implementierung ==
 
== Implementierung ==
 
=== C++/Windows ===
 
=== C++/Windows ===
'''TODO: Code muss überarbeitet werden! Siehe Diskussionsseite.'''
 
 
 
<sourcecode lang=cpp tab=4>
 
<sourcecode lang=cpp tab=4>
 
bool IsOnlyInstance()
 
bool IsOnlyInstance()
 
{
 
{
HANDLE handle = CreateMutex(NULL, TRUE, GetModuleHandle(0)); // Mutex für jetziges Fenster erstellen.
+
// Versuche einen Mutex mit dem Namen des Prozesses (.EXE-Dateiname) zu erzeugen.
+
// Wenn ein solcher schon existiert, läuft die Anwendung bereits.
if(GetLastError() != ERROR_SUCCESS)
+
HANDLE mutex = CreateMutex(0, TRUE, GetModuleHandle(0));
 +
if(mutex == ERROR_ALREADY_EXISTS)
 
{
 
{
HWND hWnd = FindWindow(GetModuleHandle(0), NULL); // Nach Fenstern mit dem gleichen Titel suchen.
+
// Der Mutex existiert schon!
if(hWnd)
+
// Hier könnte man jetzt noch das Fenster (falls vorhanden) der bereits gestarteten Instanz
{
+
// in den Vordergrund bringen.
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)
+
return false;
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;
 
return true;
 
}
 
}
 
</sourcecode>
 
</sourcecode>
 
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,
 

Version vom 14. Dezember 2011, 14:08 Uhr

Klicke hier, um diese Version anzusehen.

Meine Werkzeuge
Namensräume
Varianten
Aktionen
Navigation
Werkzeuge