Page 1 of 1
info on your multi monitor setup
Posted: Mon Nov 10, 2003 1:15 am
by blueznl
just a little hack for those dealing with multiple monitors
Code: Select all
#SM_XVIRTUALSCREEN = 76 ; x-coordinate of left upper corner of total display area
#SM_YVIRTUALSCREEN = 77 ; same for y
#SM_CXVIRTUALSCREEN = 78 ; width
#SM_CYVIRTUALSCREEN = 79 ; height
#SM_CMONITORS = 80 ; number of monitors
#SM_SAMEDISPLAYFORMAT = 81 ; identical sizing of all screens
#MONITOR_DEFAULTTONULL = 0
#MONITOR_DEFAULTTOPRIMARY = 1
#MONITOR_DEFAULTTONEAREST = 2
Debug "nr of screens:"
Debug GetSystemMetrics_(#SM_CMONITORS)
Debug "same format or not:"
Debug GetSystemMetrics_(#SM_SAMEDISPLAYFORMAT)
Debug "desktop size"
Debug GetSystemMetrics_(#SM_CXVIRTUALSCREEN)
Debug GetSystemMetrics_(#SM_CYVIRTUALSCREEN)
NewList monitor_hnd.l()
Procedure cb_test(WindowID, Message, WPARAM, LPARAM)
Result = #PB_ProcessPureBasicEvents
;
AddElement(monitor_hnd())
monitor_hnd() = WindowID
;
ProcedureReturn Result
EndProcedure
Debug "enum"
Debug EnumDisplayMonitors_(0,0,@cb_test(),0)
Debug "handle of primary monitor:"
primary_hnd.l = MonitorFromPoint_(0,0,#MONITOR_DEFAULTTOPRIMARY)
Debug primary_hnd
Structure MONITORINFO
Size.l
m_x1.l
m_y1.l
m_x2.l
m_y2.l
w_x1.l
w_y1.l
w_x2.l
w_y2.l
flags.l
EndStructure
info.MONITORINFO
info\Size = SizeOf(MONITORINFO)
info\flags = 0
n.l = 0
ResetList(monitor_hnd())
While NextElement(monitor_hnd())
INC n
Debug "monitor, handle, origin and size:"
Debug n
Debug monitor_hnd()
GetMonitorInfo_(monitor_hnd(),@info)
Debug info\m_x1
Debug info\m_y1
Debug info\m_x2 - info\m_x1
Debug info\m_y2 - info\m_y1
Wend
Re: info on your multi monitor setup
Posted: Fri Aug 03, 2012 2:06 am
by IdeasVacuum
A re-vamp to work with PB4.61:
Code: Select all
#SM_XVIRTUALSCREEN = 76 ; x-coordinate of left upper corner of total display area
#SM_YVIRTUALSCREEN = 77 ; same for y
#SM_CXVIRTUALSCREEN = 78 ; width
#SM_CYVIRTUALSCREEN = 79 ; height
#SM_CMONITORS = 80 ; number of monitors
#SM_SAMEDISPLAYFORMAT = 81 ; identical sizing of all screens
#MONITOR_DEFAULTTONULL = 0
#MONITOR_DEFAULTTOPRIMARY = 1
#MONITOR_DEFAULTTONEAREST = 2
;MONITORINFOEX with added string for device name has MS bug
;https://connect.microsoft.com/VisualStudio/feedback/details
;/545217/windows-7-getmonitorinfo-returns-wrong-information
Structure MONITORINFO
cbSize.i
rcMonitor.RECT
rcWorkArea.RECT
flags.i
EndStructure
info.MONITORINFO
info\cbSize = SizeOf(MONITORINFO)
info\flags = 0
iMonitorNum.i = 0
NewList monitor_hnd.i()
Procedure cb_test(WinID, Message, WPARAM, LPARAM)
;------------------------------------------------
Shared monitor_hnd()
Protected iResult.i = #PB_ProcessPureBasicEvents
Protected iScreensSame.i = 0
Protected iPrimary_hnd.i
Protected ptMonitor.POINT
ptMonitor\x = 0
ptMonitor\y = 0
AddElement(monitor_hnd())
monitor_hnd() = WinID
ProcedureReturn iResult
EndProcedure
EnumDisplayMonitors_(0,0,@cb_test(),0)
Debug "Number of screens: " + Str(GetSystemMetrics_(#SM_CMONITORS))
iScreensSame = GetSystemMetrics_(#SM_SAMEDISPLAYFORMAT)
Select iScreensSame
Case #True : Debug "Screens are same format"
Case #False : Debug "Screens are not same format"
EndSelect
Debug "Virtual Desktop Size Width: " + Str(GetSystemMetrics_(#SM_CXVIRTUALSCREEN)) + " Height: " + Str(GetSystemMetrics_(#SM_CYVIRTUALSCREEN))
;Bug: MonitorFromPoint can deliver the wrong Monitor
;when using the #MONITOR_DEFAULTTONEAREST flag
iPrimary_hnd = MonitorFromPoint_(ptMonitor,#MONITOR_DEFAULTTOPRIMARY)
Debug "Handle of Primary Monitor: " + Str(iPrimary_hnd)
Debug "===================================================="
FirstElement(monitor_hnd())
ForEach monitor_hnd()
iMonitorNum + 1
GetMonitorInfo_(monitor_hnd(),@info)
Debug ""
Debug "Monitor: " + Str(iMonitorNum)
Debug "Handle: " + Str(monitor_hnd())
Debug "Origin: x" + Str(info\rcMonitor\left) + " y" + Str(info\rcMonitor\top)
Debug "Screen Width: " + Str(info\rcMonitor\right - info\rcMonitor\left)
Debug "Screen Height: " + Str(info\rcMonitor\bottom - info\rcMonitor\top)
Debug "Work Area Width: " + Str(info\rcWorkArea\right - info\rcWorkArea\left)
Debug "Work Area Height: " + Str(info\rcWorkArea\bottom - info\rcWorkArea\top)
Debug "Task Bar Height: " + Str((info\rcMonitor\bottom - info\rcMonitor\top) - (info\rcWorkArea\bottom - info\rcWorkArea\top))
Debug "===================================================="
Next
Re: info on your multi monitor setup
Posted: Mon Aug 20, 2012 1:35 pm
by happer66
iirc, structures with DWORD doesn't change size depending on the architecture of the OS. So you'll have to change the integers into longs for it to work correctly for both 32-bit and 64-bit.
Code: Select all
#SM_XVIRTUALSCREEN = 76 ; x-coordinate of left upper corner of total display area
#SM_YVIRTUALSCREEN = 77 ; same for y
#SM_CXVIRTUALSCREEN = 78 ; width
#SM_CYVIRTUALSCREEN = 79 ; height
#SM_CMONITORS = 80 ; number of monitors
#SM_SAMEDISPLAYFORMAT = 81 ; identical sizing of all screens
#MONITOR_DEFAULTTONULL = 0
#MONITOR_DEFAULTTOPRIMARY = 1
#MONITOR_DEFAULTTONEAREST = 2
;MONITORINFOEX with added string for device name has MS bug
;https://connect.microsoft.com/VisualStudio/feedback/details
;/545217/windows-7-getmonitorinfo-returns-wrong-information
Structure MONITORINFO
cbSize.l
rcMonitor.RECT
rcWorkArea.RECT
flags.l
EndStructure
info.MONITORINFO
info\cbSize = SizeOf(MONITORINFO)
info\flags = 0
iMonitorNum = 0
NewList monitor_hnd.i()
Procedure cb_test(WinID, Message, WPARAM, LPARAM)
;------------------------------------------------
Shared monitor_hnd()
Protected iResult = #PB_ProcessPureBasicEvents
Protected iScreensSame
Protected iPrimary_hnd
Protected ptMonitor.POINT
ptMonitor\x = 0
ptMonitor\y = 0
AddElement(monitor_hnd())
monitor_hnd() = WinID
ProcedureReturn iResult
EndProcedure
EnumDisplayMonitors_(0,0,@cb_test(),0)
Debug "Number of screens: " + Str(GetSystemMetrics_(#SM_CMONITORS))
iScreensSame = GetSystemMetrics_(#SM_SAMEDISPLAYFORMAT)
Select iScreensSame
Case #True : Debug "Screens are same format"
Case #False : Debug "Screens are not same format"
EndSelect
Debug "Virtual Desktop Size Width: " + Str(GetSystemMetrics_(#SM_CXVIRTUALSCREEN)) + " Height: " + Str(GetSystemMetrics_(#SM_CYVIRTUALSCREEN))
;Bug: MonitorFromPoint can deliver the wrong Monitor
;when using the #MONITOR_DEFAULTTONEAREST flag
iPrimary_hnd = MonitorFromPoint_(ptMonitor,#MONITOR_DEFAULTTOPRIMARY)
Debug "Handle of Primary Monitor: " + Str(iPrimary_hnd)
Debug "===================================================="
FirstElement(monitor_hnd())
ForEach monitor_hnd()
iMonitorNum + 1
GetMonitorInfo_(monitor_hnd(),@info)
Debug ""
Debug "Monitor: " + Str(iMonitorNum)
Debug "Handle: " + Str(monitor_hnd())
Debug "Origin: x" + Str(info\rcMonitor\left) + " y" + Str(info\rcMonitor\top)
Debug "Screen Width: " + Str(info\rcMonitor\right - info\rcMonitor\left)
Debug "Screen Height: " + Str(info\rcMonitor\bottom - info\rcMonitor\top)
Debug "Work Area Width: " + Str(info\rcWorkArea\right - info\rcWorkArea\left)
Debug "Work Area Height: " + Str(info\rcWorkArea\bottom - info\rcWorkArea\top)
Debug "Task Bar Height: " + Str((info\rcMonitor\bottom - info\rcMonitor\top) - (info\rcWorkArea\bottom - info\rcWorkArea\top))
Debug "===================================================="
Next
Re: info on your multi monitor setup
Posted: Mon Aug 20, 2012 3:41 pm
by IdeasVacuum
Hi happer66
...have not experienced any problems on either 32bit or 64bit. Did you hit an issue that prompted you to post?
Re: info on your multi monitor setup
Posted: Mon Aug 20, 2012 5:06 pm
by happer66
Hi IdeasVacuum, when using the 64-bit compiler:
Number of screens: 2
Screens are same format
Virtual Desktop Size Width: 4480 Height: 1440
Handle of Primary Monitor: 2164749
====================================================
Monitor: 1
Handle: 2164749
Origin: x0 y0
Screen Width: 0
Screen Height: 0
Work Area Width: 0
Work Area Height: 0
Task Bar Height: 0
====================================================
Monitor: 2
Handle: 41552431
Origin: x0 y0
Screen Width: 0
Screen Height: 0
Work Area Width: 0
Work Area Height: 0
Task Bar Height: 0
====================================================
Same code but just modified the MONITORINFO struct:
Number of screens: 2
Screens are same format
Virtual Desktop Size Width: 4480 Height: 1440
Handle of Primary Monitor: 2164749
====================================================
Monitor: 1
Handle: 2164749
Origin: x0 y0
Screen Width: 2560
Screen Height: 1440
Work Area Width: 2560
Work Area Height: 1358
Task Bar Height: 82
====================================================
Monitor: 2
Handle: 41552431
Origin: x2560 y0
Screen Width: 1920
Screen Height: 1080
Work Area Width: 1920
Work Area Height: 1080
Task Bar Height: 0
====================================================
If you're using the 32-bit compiler it will still run correctly on both x86/x64. I might have been a bit unclear, sorry.
Re: info on your multi monitor setup
Posted: Tue Aug 21, 2012 12:59 am
by IdeasVacuum
Ah, sorry, should have realized that's what you meant
