Seite 1 von 2

Fremdes Fenster Close Button Deaktivieren / Entfernen

Verfasst: 21.02.2011 11:46
von Bisonte
Hallo.

Folgendes Szenario:

Man spielt grade ein Spiel im Fenstermodus...
Da hat man eine kleine Wartezeit (weil Züge berechnet werden oder was auch immer), und man schaut
kurz in sein Email Postfach oder macht sonst irgendetwas, wobei man die Maus irgendwie auf den CloseButton
des Spiel bekommt und aus Versehen klickt.... Spiel futsch, weil das Game keine Abfrage drin hat, nach dem Motto :
Sind sie Sicher ?

Da wollte ich doch dem entgegenwirken (weil mir sowas ständig beim Teamspeak passiert ;) )...

In der WinApi von RSBasic hab ich folgende Zeile gefunden, um das "x" eines Fensters unbrauchbar zu machen.

Code: Alles auswählen

DeleteMenu_(GetSystemMenu_(hwnd,#False),6,#MF_BYPOSITION)
hwnd ermittel ich mit mit z.B. FindWindow_(0,"Rechner").

Klappt wunderbar mit Teamspeak oder dem Taschenrechner von Windows. Nun hab ich da noch das Suchtmittel
WoW... Da ist auch keine Abfrage, wenn der Closebutton gedrückt wird, und das ist in einigen Situationen
spieltechnisch "unangenehm", wenn das Game ausgeht.
Dort klappt das mit dieser netten Zeile leider nicht.
Der Button ist zwar, wie bei den anderen Programmen "ausgegraut", aber leider immer noch klickbar (sprich Programm aus).

Gibt es da irgendeine Möglichkeit diesem Sturen Spiel das auszutreiben ?

Der funktionsfähige Codeschnipsel mit Rechner als Fenster, der allerdings nur halbwegs bei dem Spiel funktioniert :

Code: Alles auswählen

EnableExplicit

Define hwnd.i, Start.i = 1

Repeat
  
  hwnd = FindWindow_(0,"Rechner")
  
  If hwnd And Start = 1
    DeleteMenu_(GetSystemMenu_(hwnd,#False),6,#MF_BYPOSITION)
  EndIf
  
  Delay(25)
  
ForEver

Re: Fremdes Fenster Close Button Deaktivieren / Entfernen

Verfasst: 21.02.2011 12:02
von ts-soft
Jedesmal wenn Du mit der Maus den falschen Button betätigst, mit dem Zeigestock auf die Rechte, bis soviel
Blödheit weh tut :mrgreen:
Ist ja richtig Krank hier :lol:

PS: Gegen Alt-F4 schützt der obige Code auch nicht, vielleicht die Tasten rausreissen?

Ist doch nicht wahr, riesen CPU last erzeugen, weil man die Maus nicht bedienen kann :lol:

Sorry, aber sowas finde ich einfach nur lächerlich oder Krank.

Re: Fremdes Fenster Close Button Deaktivieren / Entfernen

Verfasst: 21.02.2011 15:58
von RSBasic
@Bisonte
Und wenn du versuchst, den Close-Button zu deaktivieren?
Z.B.:

Code: Alles auswählen

EnableMenuItem_(hSysMenu, #SC_CLOSE, #MF_BYCOMMAND | 1)
Oder du könntest versuchen, die komplette Fenstereigenschaft des Spiels zu ändern und zwar mit:

Code: Alles auswählen

SetWindowLongPtr_([...])
Wie zum Beispiel beim Beispiel von Falko: http://www.purebasic.fr/german/viewtopi ... 97#p246197

Oder eine dritte Alternative: Du könntest ein kleines TopMost-Fenster erstellen und "legst" über den Close-Button, so dass du nur auf das eigene Fenster klickst.
APIs fürs Überprüfen auf Fensteraktivität (Fokus) und fürs Ermitteln deren Position und Größe des Spielfensters müsstest du mit Hilfe der Board-Suche suchen.
Natürlich müsstest du dann jedesmal überprüfen, ob das Spielfenster verschoben wurde o.ä.

Sind natürlich keine guten Lösungsvorschläge, aber vielleicht kannst du da was daraus machen.

Re: Fremdes Fenster Close Button Deaktivieren / Entfernen

Verfasst: 21.02.2011 18:51
von Thorium
Von WoW würd ich die finger weg lassen.
Man könnte zwar ganz einfach einen Window Hook installieren und dann sogar so eine Messagebox mit "Sind sie sicher? (Ja/Nein)" einblenden. Aber durch die Anti-Cheat-Mechanismen in WoW ist bei sowas ganz schnell der Key gebannt.

Re: Fremdes Fenster Close Button Deaktivieren / Entfernen

Verfasst: 21.02.2011 19:54
von edel
Klappt wunderbar mit Teamspeak oder dem Taschenrechner von Windows. Nun hab ich da noch das Suchtmittel
WoW... Da ist auch keine Abfrage, wenn der Closebutton gedrückt wird, und das ist in einigen Situationen
spieltechnisch "unangenehm", wenn das Game ausgeht.
Dort klappt das mit dieser netten Zeile leider nicht.
Der Button ist zwar, wie bei den anderen Programmen "ausgegraut", aber leider immer noch klickbar (sprich Programm aus).

Gibt es da irgendeine Möglichkeit diesem Sturen Spiel das auszutreiben ?
Stell in den Grafikoptionen auf "Fenster (Vollbild)" um.

Re: Fremdes Fenster Close Button Deaktivieren / Entfernen

Verfasst: 21.02.2011 21:27
von Bisonte
@Code-Commander: Das Ding da oben ist doch bloss ein Beispiel... Das das nicht Endgültigkeitscharakter
hat dürfte sogar Dir klar sein ;)
Aber selbstkasteien brachte mir nix und vor allem anderen kann ich nich auf die Finger hauen.... ähm und ALT+F4
ist ja schon wieder was ganz anderes.... Das wär ja gewollt, wenn jemand so eine Fingerübung veranstaltet.

@Thorium: Ich glaube nicht, dass das AntiCheat-Teil bei einer Fensterveränderung anschlägt... Es gibt ja auch Leute mit
anderen Windowskins. Aber das ist ein guter Einwand ...

@edel: Das ist genau das was nicht sein soll, weil der Desktop sichtbar bleiben soll (Sidebar,Taskbar und
wass weiss ich noch...)

@RS: Die Dritte Alternative hatte ich schon ausprobiert ;) Allerdings frißt das mehr Last, weil ja laufend die Position
abgefragt werden muss und dann das mitverschieben des Fensters usw. Und nebenbei hat das ekelig ausgesehen, weil
Windows anscheinend auch die Buttongroesse anpasst beim maximieren :(
Ich hab mit den Api Funktionen bezüglich des Menus rumexperimentiert, aber EnableMenu muss ich dabei übersehen haben... Das werd ich glatt mal ausprobieren.

Edit: Leider funktioniert das mit EnableMenuItem auch nicht.Gleiches Verhalten wie vorher. Button ausgegraut aber noch nutzbar. Also wird bei dem Spiel wohl nur Alternative 3 möglich sein... Find ich halt nur verwirrend, weil es bei anderen
Programmen funktioniert. z.B. TS3 oder Notepad....

Re: Fremdes Fenster Close Button Deaktivieren / Entfernen

Verfasst: 21.02.2011 22:36
von Thorium
Bisonte hat geschrieben: Also wird bei dem Spiel wohl nur Alternative 3 möglich sein... Find ich halt nur verwirrend, weil es bei anderen
Programmen funktioniert. z.B. TS3 oder Notepad....
Wie gesagt es gibt noch eine Alternative. Aber auf eigene Gefahr. Dazu musst du einen Window Hook für das Fenster installieren und fängst einfach die WM_CLOSE Message ab. Kannst dann z.B. einen MessageRequester öffnen. Benötigt eigentlich garkeine CPU-Zeit, zumindest keine wirklich messbare.
Aber auf eigene Gefahr, weiß nicht ob das WoW gefällt.

Re: Fremdes Fenster Close Button Deaktivieren / Entfernen

Verfasst: 22.02.2011 00:31
von Bisonte
Hmmm... auch wenn ich das dann aus Vorsichtsgründen dann doch nicht anwende (Zumindest nicht bei WoW), aber wie macht man denn so einen Hook ?

Ich hab da noch nicht wirklich Erfahrung bei so etwas... und ich denke in diesem speziellen Fall (also ein Fenster) ist das
auch nicht sooo umfangreich (stell ich mir vor)...
Also das Prinzip, wie soetwas funktioniert wäre nicht verkehrt, muss ja nicht gleich ein fix und fertiges PRG sein...
(Will ja was lernen ;) )

Edit: Nach einigem Suchen, hab ich dann beschlossen, dass diese "Hook" Geschichte für mich doch etwas zu kompliziert ist...

Vielen Dank erstmal für die Mühen die ich gemacht habe.

Re: Fremdes Fenster Close Button Deaktivieren / Entfernen

Verfasst: 22.02.2011 08:36
von DarkDragon
Ich hatte letztens dieselbe Idee für einen Kollegen, der den Android Emulator immer wieder schließt (QEMU braucht immer zwischen 3 [Gingerbread] bis 30 [Honeycomb] Minuten zum starten von Android auf aktuellen Rechnern), habs dann aber auch gelassen, immerhin mussten wir nurnoch 3 Tage damit arbeiten. Vllt. wäre es dennoch eine gute Idee sowas als Tool mal zu programmieren und zu veröffentlichen.

Re: Fremdes Fenster Close Button Deaktivieren / Entfernen

Verfasst: 22.02.2011 09:01
von Thorium
Wenn man weis wies gemacht wird ist es recht einfach, ich bastel heute abend mal ein beispiel.