Récupérer et définir l'espace utilisable de l'écran (la taille des fenêtres maximisées et du bureau : inédit !)

Description

J'ai cherché sur tout le site et je n'ai pas trouvé comment il faut faire pour changer l'espace utilisable de l'écran : j'entend par cela le bureau et les dimensions des fenêtres maximisées.
Ce code me sert pour une barre d'outils qui se place à droite de l'écran, alors j'ai isolé le code et je vous ai fait une petite présentation avec des commentaires.

Source / Exemple :


Dans une form avec un bouton Command1 :
Public BLeft As Long
Public BRight As Long
Public BTop As Long
Public BBottom As Long

' Met les nouveaux paramêtres
Private Sub Form_Load()
    ' Toujours au premier plan
    SetWindowPos Me.hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE
    ' Sauvegarde les dimensions actuelles pour les rétablir après
    BLeft = Get_DimBureau(GDB_Left)
    BRight = Get_DimBureau(GDB_Right)
    BTop = Get_DimBureau(GDB_Top)
    BBottom = Get_DimBureau(GDB_Bottom)
    ' Positionne la fenêtre à droite
    Me.Top = BTop
    Me.Height = BBottom - BTop
    Me.Left = BRight - Me.Width
    ' Change les dimensions du bureau
    Set_DimBureau BLeft, BTop, Me.Left, BBottom
End Sub

' Remet les anciens paramêtres
Private Sub Command1_Click()
    Set_DimBureau BLeft, BTop, Screen.Width, BBottom
    End
End Sub

' Dans un module :

' Pour récupérer les dimensions utilisables du bureau
Public Declare Function SystemParametersInfo Lib "user32" Alias "SystemParametersInfoA" (ByVal uAction As Long, ByVal uParam As Long, ByRef lpvParam As RECT, ByVal fuWinIni As Long) As Long
Public Const SPI_GETWORKAREA = 48
Private Const SPI_SETWORKAREA = 47
Private Const SPI_SENDCHANGE = 2

' Pour définir quelle dimension on veut récupérer
Public Const GDB_Left = 0
Public Const GDB_Top = 1
Public Const GDB_Right = 2
Public Const GDB_Bottom = 3

Private Type RECT
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
End Type

' Activer toujours la fenêtre au dessus des autres
Public Declare Function SetWindowPos Lib "user32" (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Public Const SWP_NOSIZE = &H1
Public Const SWP_NOMOVE = &H2
Public Const HWND_TOPMOST = -1
Public Const HWND_NOTOPMOST = -2

' Le rafraichissement
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Public Const HWND_BROADCAST = 65535
Public Const WM_WININICHANGE = 26
Public Const WM_SETTINGCHANGE = 26

' Récupère les dimensions utilisables du bureau
Public Function Get_DimBureau(ByVal Cote As Long) As Long
    Dim TRect As RECT
    If SystemParametersInfo(SPI_GETWORKAREA, 0, TRect, 0) Then
        Select Case Cote
            Case GDB_Left
                Get_DimBureau = TRect.Left * Screen.TwipsPerPixelX
            Case GDB_Top
                Get_DimBureau = TRect.Top * Screen.TwipsPerPixelY
            Case GDB_Right
                Get_DimBureau = TRect.Right * Screen.TwipsPerPixelX
            Case GDB_Bottom
                Get_DimBureau = TRect.Bottom * Screen.TwipsPerPixelY
        End Select
    End If
End Function

' Change les dimensions de la zone utilisable du bureau
Public Function Set_DimBureau(Left As Long, Top As Long, Right As Long, Bottom As Long)
    On Error Resume Next
    Dim TRect As RECT
    TRect.Left = Left / Screen.TwipsPerPixelX
    TRect.Top = Top / Screen.TwipsPerPixelY
    TRect.Right = Right / Screen.TwipsPerPixelX
    TRect.Bottom = Bottom / Screen.TwipsPerPixelY
    Set_DimBureau = SystemParametersInfo(SPI_SETWORKAREA, 0, TRect, SPI_SENDCHANGE)
    ' Rafraichit le bureau
    SendMessage HWND_BROADCAST, WM_WININICHANGE, 0, 0
    SendMessage HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0
End Function

Conclusion :


Je vous ai mis un zip, c'est assez joli et chez moi ça marche nickel

Pensez bien à quitter en cliquant sur le bouton !!!!

voilà j'espère que ça vous servira !

@ +
MadMatt

Source mise à jour SP1 lol

Codes Sources

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.