Attribute VB_Name = "mMultiScreen" Option Explicit ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' Seta qual o tamanho útil da tela de todos os monitores ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' API's externas Private Declare Function UnionRect Lib "user32.dll" (lpDestRect As RECT, lpSrc1Rect As RECT, lpSrc2Rect As RECT) As Long Private Declare Function SubtractRect Lib "user32.dll" (lprcDst As RECT, lprcSrc1 As RECT, lprcSrc2 As RECT) As Long Private Declare Function GetMonitorInfo Lib "user32.dll" Alias "GetMonitorInfoA" (ByVal hMonitor As Long, ByRef lpmi As MONITORINFO) As Long Private Declare Function EnumDisplayMonitors Lib "user32.dll" (ByVal hdc As Long, ByRef lprcClip As Any, ByVal lpfnEnum As Long, ByVal dwData As Long) As Long Private Declare Function IsRectEmpty Lib "user32" (lpRect As RECT) As Long ' Tipos Public Type MONITORINFO cbSize As Long rcMonitor As RECT rcWork As RECT dwFlags As Long End Type ' Constantes Private Const LN_MONITORINFOF_PRIMARY = &H1 Private Const LN_MONITOR_DEFAULTTONEAREST = &H2 Private Const LN_MONITOR_DEFAULTTONULL = &H0 Private Const LN_MONITOR_DEFAULTTOPRIMARY = &H1 ' Área do traybar Private rt_TrayBar As RECT ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' Atualiza área ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Public Sub updateValidScreen() On Error GoTo ErrTreat: ' Inicia valores rt_ValidScreen.Left = 0 rt_ValidScreen.Right = 0 rt_ValidScreen.Bottom = 0 rt_ValidScreen.Top = 0 ' Recupera área do traybar rt_TrayBar = GetTrayRect ' Enumera monitores EnumDisplayMonitors ByVal LN_NO_ADDRESS, ByVal LN_NO_ADDRESS, AddressOf MonitorEnumProc, ByVal LN_NO_ADDRESS ' Se a área final estiver vazia If (IsRectEmpty(rt_ValidScreen) <> LN_FALSE) Then ' Preenche área normal errUpdateScreen End If Exit Sub ErrTreat: errUpdateScreen End Sub ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' Recepta e trata os dados de todos os monitores recebidos ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Public Function MonitorEnumProc(ByVal hMonitor As Long, ByVal hdcMonitor As Long, lprcMonitor As RECT, ByVal dwData As Long) As Long Dim miAux As MONITORINFO On Error GoTo ErrTreat: ' Inicia a estrutura miAux.cbSize = Len(miAux) ' Recupera as informações do monitor GetMonitorInfo hMonitor, miAux ' Retira a área do traybar do monitor atual SubtractRect miAux.rcMonitor, miAux.rcMonitor, rt_TrayBar ' Executa união entre os monitores existentes UnionRect rt_ValidScreen, rt_ValidScreen, miAux.rcMonitor ' Continua a enumeração MonitorEnumProc = LN_TRUE Exit Function ErrTreat: errUpdateScreen ' Cancela a enumeração MonitorEnumProc = LN_FALSE End Function ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' Em caso de erro gera área total ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Private Sub errUpdateScreen() ' Seta valores padrões rt_ValidScreen.Left = 0 rt_ValidScreen.Right = Screen.Width / Screen.TwipsPerPixelX rt_ValidScreen.Bottom = Screen.Height / Screen.TwipsPerPixelY rt_ValidScreen.Top = 0 End Sub