Page 1 sur 1

changer la resolution du desktop

Publié : mer. 12/avr./2006 20:16
par Thyphoon
Je cherche a écrire un programme qui me permet de changer la resolution du Desktop, comment faire ?
J'ai cherché un peu partout la seul chose que j'ai trouvé c'est sur Purearea ça permet de changer la resolution ecran mais des qu'on quitte le programme on revient a la resolution d'origine, et ça ne change apparement pas la resolution réel du desktop. :(
Si quelqu'un aune idée... merci d'avance

Publié : mer. 12/avr./2006 22:12
par erix14
Voilà :

Code : Tout sélectionner

Procedure ChangeDisplaySettings(Width.w, Height.w, Depth.w)
     dmScreenSettings.DEVMODE
     dmScreenSettings\dmSize = SizeOf(DEVMODE)
     dmScreenSettings\dmPelsWidth = Width
     dmScreenSettings\dmPelsHeight = Height
     dmScreenSettings\dmBitsPerPel = Depth
     dmScreenSettings\dmFields = 262144 | 524288 | 1048576
     If ChangeDisplaySettings_(@dmScreenSettings, 1)
          Result = 1
     Else
          Result = 0
     EndIf
     ProcedureReturn Result
EndProcedure
ChangeDisplaySettings(1024, 768, 32)
;ChangeDisplaySettings(1280, 1024, 32)

Publié : jeu. 13/avr./2006 5:15
par Thyphoon
Merci erix14 tu es mon sauveur... :D
C'est parfait, reste plus qu'a trouver pour choisir l'ecran de destination lorsque tu as plusieurs ecran :P

Publié : jeu. 13/avr./2006 20:01
par erix14
As-tu regardé la structure DEVMODE ?
dmPosition
Windows 98/Me, Windows 2000/XP: For display devices only, a POINTL structure that indicates the positional coordinates of the display device in reference to the desktop area. The primary display device is always located at coordinates (0,0).
Cela peut être une piste intéressante, le seul problème est que la structure DEVMODE déclaré dans PureBasic ne correspond pas exactement à celle de http://msdn.microsoft.com/library/defau ... l_8nle.asp
à cause de l'union dmPosition correspond à dmOrientation;dmPaperSize;dmPaperLength;dmPaperWidth :? mais avec une petite bidouille

Code : Tout sélectionner

*dmPosition.POINT = @dmScreenSettings\dmOrientation
ça devrait le faire. :D

Publié : jeu. 13/avr./2006 20:21
par Thyphoon
merci erix14! j'avais regardé un peu sur MSDN, mais j'avoue que des que j'arrive là bas, je me sens perdu, et je comprends plus rien.... :( manque d'experience sans doute

Est ce que ça serait trop te demander (tes pas obliger surtout je veux pas t'embeter)de me faire un petit exemple de ton

Code : Tout sélectionner

*dmPosition.POINT = @dmScreenSettings\dmOrientation
intégré a

Code : Tout sélectionner

Procedure ChangeDisplaySettings(Width.w, Height.w, Depth.w) 
     dmScreenSettings.DEVMODE 
     dmScreenSettings\dmSize = SizeOf(DEVMODE) 
     dmScreenSettings\dmPelsWidth = Width 
     dmScreenSettings\dmPelsHeight = Height 
     dmScreenSettings\dmBitsPerPel = Depth 
     dmScreenSettings\dmFields = 262144 | 524288 | 1048576 
     If ChangeDisplaySettings_(@dmScreenSettings, 1) 
          Result = 1 
     Else 
          Result = 0 
     EndIf 
     ProcedureReturn Result 
EndProcedure 
ChangeDisplaySettings(1024, 768, 32) 
L'histoire du DEVMODE de purebasic pas identique a celui des ApIs c'est un bug ou bas du tout ?
Dans tout les cas un tres grand merci :D

Publié : jeu. 13/avr./2006 22:45
par erix14
L'histoire du DEVMODE de purebasic pas identique a celui des ApIs c'est un bug ou bas du tout ?
Non, ce n'est pas un bug, c'est simplement que la retranscription de la structure n'a pas été fait correctement il aurait fallu intégrer une StructureUnion dans la structure (voir l'aide de PureBasic sur les structures)

Code : Tout sélectionner

Procedure ChangeDisplaySettings(Width.w, Height.w, Depth.w)
     dmScreenSettings.DEVMODE
     dmScreenSettings\dmSize = SizeOf(DEVMODE)
     dmScreenSettings\dmPelsWidth = Width
     dmScreenSettings\dmPelsHeight = Height
     dmScreenSettings\dmBitsPerPel = Depth
     dmScreenSettings\dmFields = 262144 | 524288 | 1048576
     
     If ExamineDesktops() > 1; si le nombre de bureaux est plus grand que 1
          *dmPosition.POINT = @dmScreenSettings\dmOrientation
          *dmPosition\x = DesktopWidth(1); le deuxième bureau est à la suite du premier
          *dmPosition\y = 0
     EndIf
     
     If ChangeDisplaySettings_(@dmScreenSettings, 1)
          Result = 1
     Else
          Result = 0
     EndIf
     ProcedureReturn Result
EndProcedure
ChangeDisplaySettings(1024, 768, 32)
;ChangeDisplaySettings(1280, 1024, 32)
Je n'ai pas testé ce code...

Publié : ven. 14/avr./2006 8:04
par Droopy
Il y a ce code de Gillou / DarkDragon qui fait ça :

Code : Tout sélectionner

;/ Author : DarkDragon / Gillou

; Permanent=1 : Make this mode permanent ( even when program quits )
; Permanent=0 = temporary mode

#DISP_CHANGE_SUCCESSFUL = 0   ; The settings change was successful.
#DISP_CHANGE_RESTART = 1      ; The computer must be restarted in order for the graphics mode to work.
#DISP_CHANGE_BADFLAGS = -4    ; An invalid set of flags was passed in.
#DISP_CHANGE_FAILED = -1      ; The display driver failed the specified graphics mode.
#DISP_CHANGE_BADMODE = -2     ; The graphics mode is not supported.
#DISP_CHANGE_NOTUPDATED = -3  ; Windows NT only: Unable to write settings to the registry.

ProcedureDLL ChangeDisplaySettings(width,height,Depth,Freq,Permanent)
  dmScreenSettings.DEVMODE 
  dmScreenSettings\dmSize = SizeOf(dmScreenSettings) 
  dmScreenSettings\dmPelsWidth = width
  dmScreenSettings\dmPelsHeight = height
  dmScreenSettings\dmBitsPerPel = Depth
  dmScreenSettings\dmDisplayFrequency=Freq
  dmScreenSettings\dmFields = 262144 | 524288 | 1048576 
  
  If Permanent
    retour=ChangeDisplaySettings_(@dmScreenSettings, 1) 
  Else
    retour=ChangeDisplaySettings_(@dmScreenSettings, 4) 
  EndIf
  
  ProcedureReturn retour
EndProcedure

Publié : ven. 14/avr./2006 8:06
par Thyphoon
Merci a tous c'est parfait !! :D