Erkennen, ob ein Spiel gestartet ist

  • C#
  • .NET 4.5

Es gibt 38 Antworten in diesem Thema. Der letzte Beitrag () ist von nafets.

    Erkennen, ob ein Spiel gestartet ist

    Hi,
    ich schreibe gerade ein Programm, welches erkennen muss, ob gerade ein Spiel ausgeführt wird. Ich kenne mich mit Spielen leider nur sehr schlecht aus. Folgende Ansätze sind mir eingefallen:
    - Checken, ob das Programm in Fullscreen läuft
    - Checken, wie viel Arbeitsspeicher das Programm benötigt
    - Checken, ob das Programm DirectX geladen hat/mit DirectX rendert

    Vielleicht habt ihr ja noch eine andere Idee :) Ich würde dann in einem Timer die Prozessliste durchgehen und alle Programm prüfen (dann mit einer relativ hohen Interval, vielleicht 10 Sekunden).
    Mfg
    Vincent

    Ob nur die EXE gestartet ist, oder ob der User gerade ingame ist?

    Edit: Ersteres lässt sich mit der Process-Klasse herausfinden.
    Zu welchem Zweck denn? Grundsätzlich wird das eher schwer: Nicht jeder spielt in Vollbild (manche Spiele spielen sogar die meisten im Fenstermodus), außerdem gibt es verschiedene Arten von Spielen, welche dann DirectX, OpenGL, Mantle oä nutzen.
    Ich schreibe so ne Art Jugendschutzprogramm, welches nach ein paar Stunden spielen ne Warnung anzeigt und das ganze auch für die Eltern sichtbar macht. Ich mache das vorwiegend für meinen Bruder/Mutter, damit nach ein paar Stunden am Tag Schluss ist (dieses rumgeschreie nervt extrem). So Programme wie Fraps oder AMD Gaming Evolved erkennen ja auch die Spiele. Ich schätze mal, dass die es tatsächlich über DirectX machen, denn zumindest das Tool von AMD will auch immer meine WPF Anwendungen aufnehmen (sonst aber nur Spiele, funktioniert also schon ganz gut).

    Das mit Vollbild meine ich eher so, wie ich das gerade in Hurricane gemacht habe: Ich gucke einfach, wie groß das Fenster ist und wie groß der Monitor ist, wenn das passt ist es Vollbild. Das + RAM wäre ja schon mal ein ganz gutes Konzept.
    Mfg
    Vincent

    Mach doch einfach ne Erennung über den Prozessnamen - du weißt ja (denke ich mal), welche Spiele er spielt. Das könnte man ja auch noch anpassen.
    Wäre es nicht möglich das ganze über den Input zu machen?

    Tastatur:
    Wenn er nur die Pfeiltasten, oder zu 80% WASD oder so benutzt ist es ein Spiel.

    Maus:
    Wenn die Maus mehr als 80% der Nutzungszeit bewegt wird, ist es offensichtlich ein Spiel, da man ja sonst immer irgendwas ließt und dann die Maus auch mal ruhen lässt..

    Nur so ne Idee, ob das umsetzbar bzw. wie zuverlässig das ganze ist weiß ich jetzt nicht^^ Gibt bestimmt auch bessere Kriterien für den Input...

    Der Ansatz über den Ram ist natürlich schwierig, da es im Allgemeinen dann auch alle produktiven Programme wie z.B. aus der Creative Cloud oder hungrige Browser wie Chrome verbieten würde.

    @ConnyKarras:
    einfach ne editierbare Liste

    Ist eine sehr schlechte Idee, da es zum einen extraarbeit macht und zum anderen lässt es sich damit umgehen, dass man einfach ein anderes Spiel startet.


    Wieso nehmt ihr nicht einfach den Computer weg? Wäre doch viel einfacher^^ Oder soll noch irgendwas mit dem Computer gemacht werden, weshalb gerade Spiele gefiltert werden sollen?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Telcrome“ ()

    @Telcrome
    Das ist eine gute Idee, die hatte ich auch schon, ist halt, wie du gesagt hast, relativ schwer zu analysieren - aber möglich und wo eine Möglichkeit ist, ist auch ein Weg. Man kann ja mehrere Kriterien machen:
    Ich mache eine kleine Liste mit Prozessnamen von derzeit sehr bekannten Spielen (Minecraft, LoL, usw.).
    Wenn der Prozess auf dieser Liste nicht drauf ist, werden drei Tests gemacht:
    1. Bedeckt die Anwendung den kompletten Bildschirm?
    2. Belegt die Anwendung über einen 1 GB RAM
    3. Wird häufiger als 40 mal pro Minute geklickt oder werden WASD häufiger mal aufgerufen

    Ein Problem stellt dann natürlich eine Spieleentwicklungsumgebung da (Unity, Unreal Engine), wenn man testen will. Deshalb gibt es dann einfach eine "Whitelist", welche bestimmte Prozesse einfach durchwinkt. Mir ist auch gerade eingefallen, dass ich ja gar keinen Timer brauche, sondern einfach einen Hook so platziere, dass ich ein Event bekomme, wenn das aktuelle Fenster im Vordergrund sich ändert. So lassen sich auch einfacher die Tests durchführen. Man kann ja auch die Testergebnisse speichern, sodass man es nicht jedes Mal neu analysieren muss.


    Danke für eure Hilfe :)


    Es sollen nur Spiele verboten werden, der Junge soll endlich mal auf seinen großen Bruder kommen und auch programmieren lernen :D
    Mfg
    Vincent

    Oder du lässt den User einfach eine Liste mit den zu überwachenden Prozessen einstellen. Weil bspw. Minecraft läuft ohne Mods und Texture Pack auch mal locker mit nur 500 Mb RAM !
    @VincentTB
    Flashgames sind also keine Spiele?
    ich Persöhnlich spiele ja sehr sehr viele Spiele. das mit 80% Mausauslastung ist ehr scheisse... was wäre wenn dein "Bruder" mal seine 100Gb Musik/Filme sortieren will? dann ist das volle Mausauslastung da er wiederholt ordner und dateien am rumziehen und öffnen ist (nur Programmierer benutzen die Tasta mehr als die Maus).

    Wenn ich bedenke wenn ich ein Aufbaustrategiespiel spiele (Anno, Siedler, Sims) da kuckt man auch öfters mal zu und wartet bis die Rohstoffe geliefert werden oder man kuckt wie sich 200Schwertkämpfer mit 300 Sperrkämpfer metzeln :D du kannst aber davon ausgehen das fast jedes Game DirecX benutzt. auser es sind ältere spiele die man eh nicht länger als 30Minuten spielen möchte... (auser command and conquer1, GTA1, Siederl2 Gold,... die gehn immer)

    Framps nimmt (soweit ich weiss) auch nur alle DirecX Games auf oder wurde das mal geändert? sonst würde es ja Flahsgames im Browser ausnehmen? Und wie willst du unterschieden ob er gerade auf Youtube ein Video kuckt oder ein Flashgame zockt?

    EDIT!!!
    davon abgesehen ballert ein Spiel die CPU und GRAKA hoch ;) Ram bleibt bei dne meisten Games unter 3GB (Firefox nimmt bei mir oft mehr ein)
    Mindora-Arts mindora-arts.de/
    Gaming-Network mindora-arts.de/arts/sgn/
    Am sichersten ist meiner Meinung nach der Weg über die Prozessliste ... gerade bei deinem Bruder dürfte das relativ einfach sein... Alternativ kann man hier auch für die allgemeine Lösung mit einer Datenbank die online erreichbar ist arbeiten. Bzw. ist es dann Sinnvoll generell erstmal ein Datenmodel zu erstellen und über xml zu arbeiten weil man da dann in der Erweiterung die DB einfach dran hängen kann. Eine Zweitprüfung wäre evtl. der Festername, denn die geben gerade bei Browsergames gerne mal Auskunft darüber was man da offen hat.

    Ram Nutzung bzw Mausgeklicke ist Fehleranfällig..... da zu viele andere Programme da auch reagieren können. zb. Grafikprogramme
    Online Spiele zählen nicht dazu, das wird zu kompliziert/unverhinderbar. Ein Problem sind halt auch virtuelle Maschinen, da kann man ja nichts kontrollieren. RAM Nutzung, Vollbild und WASD (geklicke hab ich mal rausgenommen, bei Shootern ist es ja auch kaum außer manchmal Rechtsklick) erscheint mir als relativ sicher:

    Firefox:
    RAM
    x Vollbild
    x WASD

    Photoshop:
    ✔ RAM
    x Vollbild
    x WASD

    Explorer:
    x RAM
    x Vollbild
    x WASD

    Minecraft:
    ✔ RAM
    x Vollbild (zumindest nicht immer)
    ✔ WASD

    League Of Legends:
    ✔ RAM
    ✔ Vollbild
    x WASD

    Battlefield / CoD / Shooter:
    ✔ RAM
    ✔ Vollbild
    ✔ WASD


    Wichtig ist ja auch, dass es nur einmal so sein muss - dann merkt sich das Programm. Eltern können dann von mir aus versehentlich erkannte Programm wieder freischalten.

    Es geht um reine Spielzeit, Twitch, YouTube, etc. ist relativ egal.

    Über Prozessnamen ist relativ ätzend, weil ich dann entweder dauernd eine Online-Liste aktualisieren müsste oder die Eltern bei jedem neuen Spiel das einstellen.
    Mfg
    Vincent

    Also ich würde vielleicht die bekanntesten Spiele selbst einbauen und die weniger bekannten müssen dann die Eltern hinzufügen über eine Prozessliste.
    Das ganze kannst du dann ja beispielsweise in einer Datenbank (Von mir aus auch verschlüsselt und offline) abspeichern.

    Und manche Spiele über Vollbild zu erkennen würde ich auch weg lassen. League of Legends, als beispiel, spiele ich im Fenster Modus (ja das geht).
    Zu den VM's. Die würde ich auch einfach von Haus aus detecten lassen. Ich meine was will den ein Teenie/Jugendlicher mit einer VM?
    Im Notfall können die Eltern es ja aus der Blockierliste entfernen.

    Mfg.
    Mein Spiel (hat noch keinen Namen): 40%
    Eigentlich müsstest du doch einfach sehen unter welcher Belastung die Grafikkarte ist, da man für andere Anwendungen wie Photoshop, WebBrowser oder sonst was, die GraKa ja garnicht wirklich nutzt (zumindest nicht so viel wie bei einem Spiel)

    Oder einfach wie hoch der Energieverbrauch ist. Weil wenn ein Spiel läuft, sind CPU, RAM und GraKa ja belastet, was zu erhöhtem Verbrauch führt.
    Was aber nicht so effektiv wäre, z.B. eine Radeon HD 5850 von Haus aus weniger verbraucht wie eine Radeon HD 7990 und man wieder alles per Hand machen müsste. Außer du kennst eine Seite wo man alle Werte finden kann.

    Außerdem kannst du versuchen Steam, Origin, UPlay, den Blizzard Launcher, GOG Launcher, ... , anzusteuern.
    Das meiste läuft vermute ich sowieso über Steam.
    Bei Steam z.B. kannst du einfach auslesen welche Spiele installiert sind und diese in eine Liste eintragen.
    Bei Steam-Spielen dürfte es doch recht einfach sein, einfach überprüfen ob das Steam-Overlay aktiv ist. Das wird ja automatisch gestartet und geschlossen wenn ein Spiel gestartet und geschlossen wird. Dabei spielt auch Vollbild oder Fenster keine Rolle. Oder man probiert ein bisschen mit der API von Steam rum(SteamKit2).
    Könnte auch bei anderen Launcher funktionieren wenn die so ein Overlay anbieten, bspw Origin und UPlay.

    Ansonsten würde ich das über die Prozessliste machen, aber halt nicht nur dann auf ein Programm fokussieren, sonst kann man es ja recht einfach umgehen.

    LG

    Jason95 schrieb:

    Eigentlich müsstest du doch einfach sehen unter welcher Belastung die Grafikkarte ist, da man für andere Anwendungen wie Photoshop, WebBrowser oder sonst was, die GraKa ja garnicht wirklich nutzt (zumindest nicht so viel wie bei einem Spiel)


    An sich richtig, aber was ist wenn eine Person viel mit Photoshop und dem eingebauten 3D Funktionen arbeitet? Da Photoshop, soweit ich weiß, bei jeder kleinigkeit direkt rendert wäre es nicht so gut die Hardware auf lasst zu prüfen.
    Ich finde sowas sollte man schon berücksichtigen.

    Mfg
    Mein Spiel (hat noch keinen Namen): 40%
    So, bin nun so ziemlich fertig und es klappt super. Alle Spielen wurde erkannt und es gab noch keine Fehlschläge. Folgende Spiele wurden getestet:
    • Call of Duty - AW
    • ARK
    • Rocket League
    • League Of Legends
    • Counter-Strike: Global Offensive
    • Serious Sam
    Übrigends wurden die durch die normale Methode und nicht durch die Prozessnamen erkannt, das ist nur drin, damit da auf keinen Fall Fehlschläge irgendwann passieren ;) testet es doch einfach

    C#-Quellcode

    1. using System;
    2. using System.Diagnostics;
    3. using System.Linq;
    4. using System.Runtime.InteropServices;
    5. using System.Text;
    6. using System.Windows;
    7. using GamerJail.Native;
    8. namespace GamerJail.Logic
    9. {
    10. class GameChecker
    11. {
    12. private static readonly string[] SomeGames =
    13. {
    14. "RocketLeague", "League of Legends", "dota2", "Minecraft",
    15. "SamHD_TSE", "csgo", "war3"
    16. };
    17. public static bool IsGame(Process process)
    18. {
    19. process.Refresh();
    20. Debug.Print("Analysiere Spiel: " + process.ProcessName);
    21. if (SomeGames.Contains(process.ProcessName))
    22. return true;
    23. var cname = GetClassName(process.MainWindowHandle);
    24. if (cname == "Progman" || cname == "WorkerW") //This are Windows processes
    25. return false;
    26. if (cname == "LaunchUnrealUWindowsClient")
    27. return true;
    28. var flag1 = process.PrivateMemorySize64 > 471859200; //Check if RAM > 450 MiB
    29. var flag2 = WindowIsFullscreen(process.MainWindowHandle);
    30. if (!flag1)
    31. Debug.Print("No memory");
    32. if (!flag2)
    33. Debug.Print("No fullscreen");
    34. if (flag1 & flag2)
    35. return true;
    36. return false;
    37. }
    38. private static bool WindowIsFullscreen(IntPtr window)
    39. {
    40. var placement = new WINDOWPLACEMENT();
    41. placement.length = Marshal.SizeOf(placement);
    42. UnsafeNativeMethods.GetWindowPlacement(window, ref placement);
    43. var workarea = SystemParameters.WorkArea;
    44. // ReSharper disable once CompareOfFloatsByEqualityOperator
    45. return placement.normalPosition.left == 0 && placement.normalPosition.top == 0 &&
    46. placement.normalPosition.Width >= workarea.Width &&
    47. placement.normalPosition.Height > workarea.Height;
    48. }
    49. public static string GetClassName(IntPtr handle)
    50. {
    51. const int maxChars = 256;
    52. var className = new StringBuilder(maxChars);
    53. if (UnsafeNativeMethods.GetClassName(handle, className, maxChars) > 0)
    54. {
    55. return className.ToString();
    56. }
    57. return string.Empty;
    58. }
    59. }
    60. }


    Die UnsafeNativeMethods findet ihr alle auf pinvoke, einfach nur nach dem Namen suchen. Hier ist übrigens mein fertiges Programm: github.com/Alkalinee/GamerJail
    Mfg
    Vincent

    Wenn ich jetzt halt zum Beispiel ein einfaches Jump and Run im Fenstermodus spiele, dann schlägt es halt nicht an. :D
    Aber gut, man kann das eben nicht so perfektionieren. Nur, indem man halt alle Prozessnamen von jeglichen Spielen noch herausfindet und dann auflistet.
    Wobei das schon ziemlich gut ist, finde ich. :thumbsup:

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!: