Seite 1 von 1
Fullscreen Alt Tab
Verfasst: 20.05.2011 18:34
von Renovatio
Hallo Community!
Mir ist bekannt das mein Anliegen längst mehrfach im FOrum klein geredet wurde.
Dennoch schlage ich mich damit rum!
Und das ärgerlichste daran... Ich habe es mal hinbekommen! -.-
Eine Fullscreen Anwendung soll mit Alt+Tab minimiert und wieder geöffnet werden können.
Also bei Alt und Tab soll der Fullscreen minimiert werden und beim linksklick in die Taskleiste darauf wieder in den Vordergrund.
Wie stellt man das nun an ohne sowas wie CloseScreen() -> OpenWindow() -> CloseWindow() -> OpenScreen?
IsScreenActive() ist mir bekannt, hilft leider nur nicht wirklich und die SuFu habe ich auch schon über 50 Seiten durch, dass mit den verschiedensten Wörtern wie "Tabswitch", "Alt Tab", "Alt+Tab", "Fullscreen Tabswitch", ...
Vielen Dank im voraus an alle die mir hier helfen können!

Re: Fullscreen Alt Tab
Verfasst: 20.05.2011 19:11
von Regenduft
Verstehe Dein Problem nicht wirklich...
IsScreenActive() und evtl. ReleaseMouse() reichen dafür aus. Den Screen immer öffnen und schließen brauchst Du nicht. Alt+Tab abfragen musst Du auch nicht, das macht Windows alles alleine. Allerdings musst Du wenn der Screen wieder in den Vordergrund kommt alle Sprites nochmal neu laden!
Weitere Tipps nur gegen Quellcode.

Re: Fullscreen Alt Tab
Verfasst: 20.05.2011 19:59
von Renovatio
Beide Befehle ( IsScreenActive() & ReleaseMouse() ) werden verwendet und wie im ersten Post erwähnt, bringt der Befehl IsScreenActive nicht das gewünschte Ergebnis.
Code: Alles auswählen
InitKeyboard()
InitMouse()
InitSprite()
Global ScreenW = 800
Global ScreenH = 600
Global AppName$ = "This screen is active !"
OpenScreen(ScreenW, ScreenH, 32, "DXS2011", #PB_Screen_WaitSynchronization, 75)
Repeat
If IsScreenActive() = #True
ReleaseMouse(0)
FlipBuffers() : ClearScreen(#Black)
StartDrawing(ScreenOutput())
DrawingMode(#PB_2DDrawing_Transparent)
DrawText((ScreenW / 2) - (TextWidth(AppName$) / 2), (ScreenH / 2) - (TextHeight(AppName$) / 2), AppName$, RGB(255, 255, 255))
StopDrawing()
ExamineKeyboard()
If KeyboardReleased(#PB_Key_Escape)
End
EndIf
EndIf
If IsScreenActive() = #False
ReleaseMouse(1)
Delay(1)
EndIf
ForEver
Was ist bei meinem Code falsch, denn wieder in den Vordergrund holen kann ich das Fullscreen nicht.
Re: Fullscreen Alt Tab
Verfasst: 20.05.2011 20:15
von STARGÅTE
Das Problem habe ich schon vor 3 Jahren bei BUGs gepostet, das man Screens nicht Alt-Tab'en kann, weil dann das Programm abstürzt.
ThreadSafe -> Absturz bei Alt-TAB
Es hat bis heute keinen interessiert.
Inzwischen ist es mir egal, weil ich nur noch Windowed nutze ...
Aber das FlipBuffers() muss auf jedenfall außerhalb des Ifs weil FlipBuffers() das IsScreenActive() verwaltet, wie es auch in der Hilfe steht
Re: Fullscreen Alt Tab
Verfasst: 20.05.2011 21:01
von HeX0R
Den Tipp gab es mal im englischen Forum, das funktioniert auch (zumindest unter Windows) tadellos:
Code: Alles auswählen
InitKeyboard()
InitMouse()
InitSprite()
Global ScreenW = 800
Global ScreenH = 600
Global AppName$ = "This screen is active !"
OpenScreen(ScreenW, ScreenH, 32, "DXS2011", #PB_Screen_WaitSynchronization, 75)
Repeat
ReleaseMouse(0)
FlipBuffers() : ClearScreen(#Black)
StartDrawing(ScreenOutput())
DrawingMode(#PB_2DDrawing_Transparent)
DrawText((ScreenW / 2) - (TextWidth(AppName$) / 2), (ScreenH / 2) - (TextHeight(AppName$) / 2), AppName$, RGB(255, 255, 255))
StopDrawing()
ExamineKeyboard()
If KeyboardReleased(#PB_Key_Escape)
End
EndIf
If IsScreenActive() <> 1
;Oh oh
Repeat
While PeekMessage_(msg, 0, 0, 0, #PM_REMOVE)
TranslateMessage_(msg)
DispatchMessage_(msg)
Wend
Delay(100)
Until IsScreenActive()
;Now reinitialize anything, reopen screen, reloading sprites, ...
OpenScreen(ScreenW, ScreenH, 32, "DXS2011", #PB_Screen_WaitSynchronization, 75)
EndIf
ForEver
[Edit]
Hab den Thread
gefunden, soviel Zeit muss sein.
Re: Fullscreen Alt Tab
Verfasst: 20.05.2011 21:31
von Renovatio
dobro hat geschrieben:this code work fine : (No API)
Code: Alles auswählen
; Purebasic 4.41
;By Dobro
; exemple de l'utilisation de IsScreenActive()
; quittez le pseudo jeux avec Alt+TAB
; on retourne dans le jeux d'un clique sur la fenetre en barre des taches
initsprite ()
initmouse ()
initkeyboard ()
Enumeration
#sprite
EndEnumeration
Structure sprite
x.i
y.i
pas_x.i
pas_y.i
EndStructure
Dim sprite.sprite(1)
examinedesktops ()
x_screen= desktopwidth (0) ; je recup la rez de l'ecran
y_screen= desktopheight (0)
flag=0
debut: ; le label qui permet le retour dans le jeux !!
openscreen (x_screen, y_screen, 32, "Fullscreen + ALT-TAB démo" )
releasemouse (0)
createsprite ( #sprite , 64, 64)
startdrawing ( spriteoutput ( #sprite ))
box (0,0,64,64, rgb (255,13,40))
stopdrawing ()
;********* initialisation du sprite **********
If flag=0 ; le joueur n'est jamais sorti du jeu , s'il est sorti on ne fais pas ce bloc de code !!
sprite(1)\x=x_screen/2 ; on place le sprite au centre
sprite(1)\y=y_screen/2 ; on place le sprite au centre
sprite(1)\pas_x=2 ; on donne une vitesse de deplacement a notre sprite
sprite(1)\pas_y=2 ; on donne une vitesse de deplacement a notre sprite
EndIf
Repeat
examinekeyboard () ; ne sert que pour quitter le prg avec la touche esc
; ************* gere le deplacement du sprite ***************
sprite(1)\x=sprite(1)\x+sprite(1)\pas_x
sprite(1)\y=sprite(1)\y+sprite(1)\pas_y
; ----------------------------------------------------------------------------
If sprite(1)\x+64>=x_screen:sprite(1)\pas_x=-sprite(1)\pas_x: EndIf
If sprite(1)\y+64>=y_screen:sprite(1)\pas_y=-sprite(1)\pas_y: EndIf
; ----------------------------------------------------------------------------
If sprite(1)\x<=0:sprite(1)\pas_x=-sprite(1)\pas_x: EndIf
If sprite(1)\y<=0:sprite(1)\pas_y=-sprite(1)\pas_y: EndIf
; *******************************************************
; ********** affichage du sprite *********************
displaytransparentsprite ( #sprite , sprite(1)\x, sprite(1)\y)
flipbuffers ()
clearscreen (0)
; *************** attention toute l'astuce est la !! *******************
If isscreenactive () = 0 ; le joueur a quitter le jeu (Alt-tab)
releasemouse (1) ; je libere la souris ... inutile ici mais bon
flag=1 ; on note que l'utilisateur est sorti du jeux
closescreen () ; on ferme l'ecran
; ******* la ruse de guerre !! ****************************
openwindow (1,1,1,1,1, "toto le jeu " , #PB_Window_Minimize ) ; j'ouvre une fenetre que je minimise en bar des taches
Repeat :Event= waitwindowevent (2): Until Event= #PB_Event_ActivateWindow ; j'attend qu'on clique sur la fenetre
closewindow (1) ; je ferme la fenetre
Goto debut ; je retourne dans le jeux sans réinitialiser les variables de déplacement (on reprends ou on en etait! !!! )
EndIf
Until keyboardpushed ( #PB_Key_Escape ) ; là , on veux vraiment quitter le jeux LOL
End
Wie die meisten es machen.
Die Franzosen haben's drauf.

Gut finde ich das mit dem
Goto denn das erspart Codezeilen und erneutes aufrufen der benötigten Proceduren.
Einzige Frage die da bleibt: Werden ALLE BISHERIGEN AKTIONEN wiederhergestellt?
Bei einem Spiel was ich mal gemacht habe, konnte man mit der Technik "CloseScreen()" -> "OpenWindow()" -> "CloseWindow()" -> "OpenScreen" genau da weitermachen wo man zuletzt war.
Also hatte man die Maus bzw Aktionen bis zum Punkt "Hauptmenü" -> "Optionen" -> "Steuerung" gemacht und hinterher minimiert, was ja den Prozess erneut durchlaufen lassen hat mit "CloseScreen", so sah man beim erneuten "OpenScreen" immernoch den Punkt "Steuerung".
Wie verhält sich das nun wenn man nun sagen wir mal mitten im Spiel ist?
Re: Fullscreen Alt Tab
Verfasst: 21.05.2011 09:50
von Regenduft
[schock]
Uff!

Früher ging das mal! Ganz genau am (auf mein PureBoard-Anmeldedatum spick) am 25. Mär 2008!
Ich hätte nie gedacht, dass alle meine Fullscreen-Sachen einen Bug haben! Hatte das nie mehr getestet!
[/schock]
Renovatio hat geschrieben:Gut finde ich das mit dem Goto denn das erspart Codezeilen und erneutes aufrufen der benötigten Proceduren.
Sag lieber das böse G-Wort nicht, sonst hat Du schnell eine Offtopic-Diskussion von 100 Seiten.

(Würde aber lieber eine Init-Prozedur machen, sparst Du Dir eine potentielle Fehlerquelle. Das ist ja kein Zeitkritischer-Code.)
Renovatio hat geschrieben:Einzige Frage die da bleibt: Werden ALLE BISHERIGEN AKTIONEN wiederhergestellt?
Bei einem Spiel was ich mal gemacht habe, konnte man mit der Technik "CloseScreen()" -> "OpenWindow()" -> "CloseWindow()" -> "OpenScreen" genau da weitermachen wo man zuletzt war.
Also hatte man die Maus bzw Aktionen bis zum Punkt "Hauptmenü" -> "Optionen" -> "Steuerung" gemacht und hinterher minimiert, was ja den Prozess erneut durchlaufen lassen hat mit "CloseScreen", so sah man beim erneuten "OpenScreen" immernoch den Punkt "Steuerung".
Wie verhält sich das nun wenn man nun sagen wir mal mitten im Spiel ist?
Eigentlich sollte Die Mausposition bleiben (vorrausgesetzt du ruft ExamineMouse() nicht im minimierten Zusatand auf), da "ExamineMouse()" eigentlich auch nur alle Mausifos speichert. Wenn Du auf Nummer sicher gehen wills aber am besten vor dem CloseScreen() die Mausposition merken und nach dem Wiederherstellen mit MouseLocate() wieder setzen. Man weiß nie ob sich solche "Features" mit der nächten PB-Version verlieren.