Page 1 sur 1
[R] Plein écran
Posté : mar. 16 sept. 2014 14:16
par Capablanca
Bonjour,
Je suis en train de faire un jeu et je ne sais pas comment sélectionner, en AutoIt, le plein écran.
Y a-t-il une commande pour basculer du plein écran en mode fenêtré et vice-versa pour les jeux.
Faut-il passer par les APIs ?
Merci à ceux qui savent pour leurs réponses, qui serviront aussi aux utilisateurs d'AutoIt.
Re: [..] Plein écran
Posté : mar. 16 sept. 2014 14:26
par Hugues
Re: [..] Plein écran
Posté : mar. 16 sept. 2014 22:55
par Alaghir
Re: [..] Plein écran
Posté : mar. 16 sept. 2014 22:56
par mikell
C'est ce qui donne au "Peut-être" toute sa saveur

[..] Plein écran
Posté : jeu. 18 sept. 2014 14:13
par Capablanca
Merci pour la réponse, mais ça je savais faire.
Je parle du plein écran en choisissant un mode de résolution et, au retour, en revenant au mode de résolution actuel.
Comprenez-vous ce que je veux dire ?
Exemple :
J'ai un programme de jeu qui a 2 possibilités : le mode fenêtré et le plein écran.
Le mode fenêtré : tout se passe sur la résolution actuelle dans une fenêtre.
Le plein écran : le programme détermine la résolution d'écran, par exemple 640 X 480, le jeu se déroule dans cette résolution. On peut basculer, par Alt+Tab, dans la bureau avec la résolution antérieure, et vice-versa.
Cette façon de faire s'effectue dans beaucoup de langages.
Est-ce possible en AutoIt ?
Re: [..] Plein écran
Posté : jeu. 18 sept. 2014 14:23
par TommyDDR
Je vois ce dont vous voulez parler, j'avais moi même chercher un moyen de le faire assez facilement, mais je n'ai pas trouvé de solution.
Si par hasard vous y arrivez, je suis curieux de voir la solution.
Re: [..] Plein écran
Posté : jeu. 18 sept. 2014 14:29
par Capablanca
Merci TommyDDR pour votre réponse.
Même si il semble ne pas y avoir de solution avec AutoIt, en tout cas simplement.
Comme je suis un débutant en AutoIt (moins de 3 mois), je ne suis pas non plus qualifié pour la réponse.
Re: [..] Plein écran
Posté : jeu. 18 sept. 2014 16:17
par jchd
Un début de réponse, mais à tester, éventuellement en creusant un peu.
Re: [..] Plein écran
Posté : jeu. 18 sept. 2014 17:04
par orax
Je crois que c'est géré par DirectX/OpenGL ce que tu veux faire, le plein écran en mode exclusif. Par contre tu peux très bien faire du plein écran à la manière des navigateurs par exemple (quand on appuie sur F11) — je crois que c'est ce qui est expliqué dans le lien de jchd. La fenêtre de ton jeu prendrait toute la surface de l'écran (même la barre des tâches serait cachée).
Je suis tombé sur cette fonction (désolé si c'est une mauvaise piste) :
ChangeDisplaySettings (voir flag CDS_FULLSCREEN)
Re: [..] Plein écran
Posté : jeu. 18 sept. 2014 17:34
par TommyDDR
Programme trouvé par jchd porté en AutoIt :
► Afficher le textecode
Code : Tout sélectionner
#include <Constants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <StructureConstants.au3>
#include <WinAPI.au3>
#include <WinAPIConstants.au3>
#include <WinAPIGdi.au3>
#include <WinAPISys.au3>
#include <WindowsConstants.au3>
Opt("MustDeclareVars", 1)
Opt("GuiOnEventMode", 1)
HotKeySet("²", "ChangeMode")
Global $gui
Global $taille[2] = [300, 300]
Global $wPlacement
Global $tailleLabel = 20
$gui = GUICreate("FullScreen (press ²)", $taille[0], $taille[1], -1, -1, $WS_OVERLAPPEDWINDOW)
For $j = 0 To $taille[1]/$tailleLabel
For $i = 0 To $taille[0]/$tailleLabel
If(Mod($i+$j, 2) = 0) Then
GUICtrlCreateLabel(($i+($j*$taille[0]/$tailleLabel))/2, $i*$tailleLabel, $j*$tailleLabel, $tailleLabel, $tailleLabel, BitOR($SS_CENTER, $SS_CENTERIMAGE))
GUICtrlSetBkColor(-1, 0x60A060)
EndIf
Next
Next
GUISetOnEvent($GUI_EVENT_CLOSE, "quit", $gui)
GUISetState(@SW_SHOW, $gui)
While(True)
Sleep(10)
WEnd
Func ChangeMode()
FullScreen($gui)
EndFunc
Func FullScreen($gui, $fullScreen = Null)
Local $dwStyle = _WinAPI_GetWindowLong($gui, $GWL_STYLE)
If(BitAND($dwStyle, $WS_OVERLAPPEDWINDOW) = $WS_OVERLAPPEDWINDOW And $fullScreen <> False) Then
$wPlacement = WinGetPos($gui)
Local $tPos = DllStructCreate($tagPOINT)
DllStructSetData($tPos, "X", $wPlacement[0])
DllStructSetData($tPos, "Y", $wPlacement[1])
Local $hMonitor = _WinAPI_MonitorFromPoint($tPos)
Local $mi = _WinAPI_GetMonitorInfo($hMonitor)
_WinAPI_SetWindowLong($gui, $GWL_STYLE, $dwStyle-$WS_OVERLAPPEDWINDOW)
_WinAPI_SetWindowPos( $gui, _
$HWND_TOP, _
DllStructGetData($mi[0], "left"), _
DllStructGetData($mi[0], "top"), _
DllStructGetData($mi[0], "right")-DllStructGetData($mi[0], "left"), _
DllStructGetData($mi[0], "bottom")-DllStructGetData($mi[0], "top"), _
BitOR($SWP_NOOWNERZORDER, $SWP_FRAMECHANGED))
ElseIf(BitAND($dwStyle, $WS_OVERLAPPEDWINDOW) = 0 And $fullScreen <> True) Then
_WinAPI_SetWindowLong($gui, $GWL_STYLE, BitOR($dwStyle, $WS_OVERLAPPEDWINDOW))
WinMove($gui, "", $wPlacement[0], $wPlacement[1], $wPlacement[2], $wPlacement[3])
_WinAPI_SetWindowPos($gui, null, 0, 0, 0, 0, BitOR($SWP_NOMOVE, $SWP_NOSIZE, $SWP_NOZORDER, $SWP_NOOWNERZORDER, $SWP_FRAMECHANGED))
EndIf
EndFunc
Func quit()
Exit
EndFunc
Malheureusement cela correspond à un "simple" -> "maximiser sans bordure". Si Capablanca cherche comme moi, cela n'est pas suffisant, en effet, la fenêtre est juste redimensionnée, orax à compris le problème, nous parlons bien le programme en basse résolution (et qui restent en basse résolution) mais en plein écran.
L'équivalent "Alt+Enter" sur les vieux jeux (Monkey Island par exemple <3)
Edit :
orax a écrit :Je suis tombé sur cette fonction (désolé si c'est une mauvaise piste) : ChangeDisplaySettings (voir flag CDS_FULLSCREEN)
Je vais me pencher dessus.
Re: [..] Plein écran
Posté : jeu. 18 sept. 2014 19:46
par TommyDDR
Et voilà le travail, merci orax pour le ChangeDisplaySettings (j'ai modifié un udf du forum US pour l'adapter au fullscreen) :
► Afficher le textecode
Code : Tout sélectionner
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include "_ChangeDisplaySettings.au3"
Opt("MustDeclareVars", 1)
Opt("GuiOnEventMode", 1)
HotKeySet("²", "quit")
Global $gui
Global $taille[2] = [800, 600]
Global $wPlacement
Global $nbLabels = 35
Global $tailleLabel = $taille[0]/$nbLabels
$gui = GUICreate("FullScreen (press ²)", $taille[0], $taille[1], 0, 0, $WS_POPUP)
ConsoleWrite($taille[0]/$tailleLabel & @LF)
For $j = 0 To ($taille[1]/$tailleLabel)-1
For $i = 0 To ($taille[0]/$tailleLabel)-1
If(Mod($i+$j, 2) = 0) Then
GUICtrlCreateLabel(($i+($j*($taille[0]/$tailleLabel)))/2, $i*$tailleLabel, $j*$tailleLabel, $tailleLabel, $tailleLabel, BitOR($SS_CENTER, $SS_CENTERIMAGE))
GUICtrlSetBkColor(-1, 0x60A060)
EndIf
Next
Next
GUISetOnEvent($GUI_EVENT_CLOSE, "quit", $gui)
GUISetState(@SW_SHOW, $gui)
Sleep(1000)
_ChangeScreenRes($taille[0], $taille[1], -1, -1, $CDS_FULLSCREEN)
Sleep(3000)
;~ _ChangeScreenRes(-1, -1, -1, -1, -1, True)
;~ Sleep(5000)
While(True)
Sleep(100)
WEnd
Func quit()
Exit
EndFunc
Infos :
_ChangeScreenRes(-1, -1, -1, -1, -1, True) pour remettre la résolution "normale" pendant l'exécution
Quitter le programme fait revenir la résolution à la normale.
Il faut juste ajouter la détection de changement de focus et remettre la résolution par défaut en cas de focus out, puis remettre 800*600 (ou autre) en cas de focus in.
Mais la solution est belle et bien là

Re: [..] Plein écran
Posté : ven. 19 sept. 2014 14:21
par Capablanca
Merci à tous pour vos réponses respectives et particulièrement à TommyDDR pour son aide très apprécié.
Je vais regarder ça de plus près chez moi.