Gestion résolution écran

Contenu du snippet

encor une modif résolution écran mais avec la gestion de la fréquence et du mode couleur. Il marche sous VB6 et W2k. Faites moi savoir si il tourne sous les autres Win.

Source / Exemple :


Public oldX, oldY, oldR, oldC As Long                             ' Résolution écran avant application

Private Declare Function EnumDisplaySettings Lib "user32" Alias "EnumDisplaySettingsA" ( _
                        ByVal lpszDeviceName As Long, ByVal iModeNum As Long, lpDevMode As Any) As Boolean
Private Declare Function ChangeDisplaySettings Lib "user32" Alias "ChangeDisplaySettingsA" ( _
                        lpDevMode As Any, ByVal dwFlags As Long) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" ( _
                     ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

Private Declare Function FindWindowA Lib "user32" (ByVal lpClassName As String, _
                                    ByVal lpWindowName As String) As Long

Private Declare Function SetWindowPos Lib "user32" (ByVal handleW1 As Long, _
                                    ByVal handleW1InsertWhere As Long, ByVal w As Long, _
                                    ByVal x As Long, ByVal y As Long, ByVal z As Long, _
                                    ByVal wFlags As Long) As Long

Private Const CCHDEVICENAME = 32
Private Const CCHFORMNAME = 32

Private Const DM_BITSPERPEL = &H40000
Private Const DM_WIDTH = &H80000
Private Const DM_HEIGHT = &H100000
Private Const DM_DISPLAYFREQUENCY = &H400000
Private Const WM_DEVMODECHANGE = &H1B
Private Const HWND_BROADCAST = &HFFFF&
Private Const HWND_DESKTOP = 0

Const TOGGLE_HIDEWINDOW = &H80
Const TOGGLE_UNHIDEWINDOW = &H40

Private Type DEVMODE
    dmDeviceName As String * CCHDEVICENAME
    dmSpecVersion As Integer
    dmDriverVersion As Integer
    dmSize As Integer
    dmDriverExtra As Integer
    dmFields As Long
    dmOrientation As Integer
    dmPaperSize As Integer
    dmPaperLength As Integer
    dmPaperWidth As Integer
    dmScale As Integer
    dmCopies As Integer
    dmDefaultSource As Integer
    dmPrintQuality As Integer
    dmColor As Integer
    dmDuplex As Integer
    dmYResolution As Integer
    dmTTOption As Integer
    dmCollate As Integer
    dmFormName As String * CCHFORMNAME
    dmUnusedPadding As Integer
    dmBitsPerPel As Integer
    dmPelsWidth As Long
    dmPelsHeight As Long
    dmDisplayFlags As Long
    dmDisplayFrequency As Long
End Type

Dim dmEcran As DEVMODE
Dim dynSetting() As String

Dim handleW1 As Long

' =================================== DEBUT DU CODE ================================
'---- Change la résolution écran

Public Sub ResolutionEcran(Chge As Boolean, sgWidth As Long, sgHeight As Long)
    Dim blTMP As Boolean
    Dim lgTMP As Long
    Dim compt As Integer
          
    If Chge = True Then                                                               ' modification de la résolution - début du programme
  
        blTMP = EnumDisplaySettings(0, -1, dmEcran)                   ' stockage de la résolution écran avant modif
        oldX = dmEcran.dmPelsWidth
        oldY = dmEcran.dmPelsHeight
        oldR = dmEcran.dmDisplayFrequency
        oldC = dmEcran.dmBitsPerPel
        
        If Not oldX = sgWidth Then                                                ' si la résolution est différente de la résolution demandée
        
            lgTMP = 0
            cpt = 0                                                                        ' compteur d'affichage
    
            ReDim dynSetting(0)
            Do                                                                              ' parcours tous les affichages possibles
               blTMP = EnumDisplaySettings(0, lgTMP, dmEcran)
                lgTMP = lgTMP + 1
                
                If dmEcran.dmPelsWidth = sgWidth Then                  ' si résolution demandée
                    dynSetting(cpt) = Right("000" & dmEcran.dmBitsPerPel, 3) & _
                                              Right("000" & dmEcran.dmDisplayFrequency, 3)
                    cpt = cpt + 1
                    ReDim Preserve dynSetting(cpt)
                End If
            Loop Until Not blTMP
            
            ' right(dynSetting(cpt - 1),3)                                                        ' Fréquence maximale acceptée par la carte
            ' left(dynSetting(cpt - 1),3)                                                          ' Mode couleur maxi accepté par la carte
  
            For compt = cpt - 1 To 0 Step -1
                If CLng(Left(dynSetting(compt), 3)) = oldC Then
                    If CLng(Right(dynSetting(compt), 3)) = oldR Then               ' si même mode couleur et même fréquence
                        Exit For
                    Else                                                                               ' même mode couleur mais fréquence inférieure
                        If CLng(Right(dynSetting(compt), 3)) > 71 Then              ' contrainte sur la fréquence 72Hz
                            Exit For
                        End If
                    End If
                Else                                                                                   ' mode couleur inférieur
                    If CLng(Right(dynSetting(comp), 3)) = oldR Then
                        Exit For
                    Else
                        If CLng(Right(dynSetting(comp), 3)) > 71 Then               ' contrainte sur la fréquence 72Hz
                            Exit For
                        End If
                    End If
                End If
            Next
            If cpt = 0 Then
            'alerte : votre système ne supporte pas la résolution demandée
                End
            End If
            
            Call Change(sgWidth, sgHeight, CLng(Left(dynSetting(compt), 3)), CLng(Right(dynSetting(compt), 3)))
        End If
    
    Else                                                                                  ' modification de la résolution - fin du programme
            Call Change((oldX), (oldY), (oldC), (oldR))
    End If
End Sub

Private Sub Change(width As Long, height As Long, pel As Long, freq As Long)

            dmEcran.dmFields = DM_BITSPERPEL Or DM_WIDTH Or DM_HEIGHT Or DM_DISPLAYFREQUENCY
            dmEcran.dmPelsWidth = width
            dmEcran.dmPelsHeight = height
            dmEcran.dmBitsPerPel = pel
            dmEcran.dmDisplayFrequency = freq
       
            lgTMP = ChangeDisplaySettings(dmEcran, 0)
            Call SendMessage(HWND_BROADCAST, WM_DEVMODECHANGE, 0, 0)
End Sub

Conclusion :


A mettre dans un module et appeler la
Sub ResolutionEcran(Chge As Boolean, sgWidth As Long, sgHeight As Long)

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.