#If VBA7 Then
Private Declare PtrSafe Function EnumDisplayMonitors Lib "user32.dll" (ByVal hDC As LongPtr, ByRef lprcClip As Any, ByVal lpfnEnum As LongPtr, ByVal dwData As Long) As Long
#Else
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
#End If
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Type MONITORINFO
cbSize As Long
rcMonitor As RECT
rcWork As RECT
dwFlags As Long
End Type
'Local Module variables
Private TabMIs() As MONITORINFO
'---------------------------
'Get all Monitor Information
'---------------------------
Public Function GetMonitorInfoByEnum() As MONITORINFO()
Erase TabMIs
Call EnumDisplayMonitors(ByVal 0&, ByVal 0&, AddressOf MonitorEnumProc, ByVal 0&)
'Return value
GetMonitorInfoByEnum = TabMIs
End Function
'---------------------------------------------------------
'Function called by EnumDisplayMonitors() for each Monitor
'---------------------------------------------------------
#If VBA7 Then
Private Function MonitorEnumProc(ByVal hMonitor As LongPtr, _
ByVal hdcMonitor As LongPtr, _
ByRef lprcMonitor As RECT, _
ByVal dwData As Long) As Long
#Else
Private Function MonitorEnumProc(ByVal hMonitor As Long, _
ByVal hdcMonitor As Long, _
ByRef lprcMonitor As RECT, _
ByVal dwData As Long) As Long
#End If
Dim MI As MONITORINFO
Dim NbMIs As Integer
'Get Monitor Information
MI.cbSize = Len(MI)
Call GetMonitorInfo(hMonitor, MI)
'Store Monitor Information in table
If Not (Not TabMIs) Then NbMIs = UBound(TabMIs) + 1 Else NbMIs = 1
ReDim Preserve TabMIs(1 To NbMIs)
TabMIs(NbMIs) = MI
'Return value: Continue enumeration
MonitorEnumProc = 1
End Function