|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Visual Basic Enumeration/Callback Routines EnumDisplayMonitors: Enumerating System Monitor Info |
|
Posted: | Sunday December 29, 2002 |
Updated: | Monday December 26, 2011 |
Applies to: | VB5, VB6 |
Developed with: | VB5, Windows XP |
OS restrictions: | Windows 98/Me, Windows 2000/XP |
Author: | VBnet - Randy Birch |
Related: |
EnumDisplaySettings: Enumerate Available Display Resolutions ChangeDisplaySettings: Change Display Resolution EnumDisplayDevices: Enumerating System Display Devices EnumDisplayMonitors: Enumerating System Monitor Info Core: DesktopsSameColourFormat Core: GetDesktopMaximumHeight Core: GetDesktopMaximumWidth Core: GetMonitorByPoint Core: GetMontitorByRect Core: GetMonitorByWindow Core: GetMonitorCount |
Prerequisites |
Visual Basic 5/6 supporting AddressOf. |
|
GetSystemMetrics
retrieves various system metrics (widths and heights of display elements)
and system configuration settings. EnumDisplayMonitors enumerates display monitors (including invisible pseudo-monitors associated with the mirroring drivers) that intersect a region formed by the intersection of a specified clipping rectangle and the visible region of a device context. Or in English, it provides monitor details in single or multi-monitor setups based on the monitor handle. Together, these two calls can provide detailed information about the user's monitor and current desktop setup. |
BAS Module Code |
Place the following code into the general declarations area of a bas module: |
|
Option Explicit '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' Copyright ©1996-2011 VBnet/Randy Birch, All Rights Reserved. ' Some pages may also contain other copyrights by the author. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' Distribution: You can freely use this code in your own ' applications, but you may not reproduce ' or publish this code on any web site, ' online service, or distribute as source ' on any media without express permission. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Public Const SM_XVIRTUALSCREEN = 76 'virtual desktop left Public Const SM_YVIRTUALSCREEN = 77 'virtual top Public Const SM_CXVIRTUALSCREEN = 78 'virtual width Public Const SM_CYVIRTUALSCREEN = 79 'virtual height Public Const SM_CMONITORS = 80 'number of monitors Public Const SM_SAMEDISPLAYFORMAT = 81 Public Type RECT Left As Long Top As Long Right As Long Bottom As Long End Type Public Type POINTAPI x As Long y As Long End Type Public Declare Sub CopyMemory Lib "kernel32" _ Alias "RtlMoveMemory" _ (Destination As Any, _ Source As Any, _ ByVal Length As Long) Public Declare Function EnumDisplayMonitors Lib "user32" _ (ByVal hdc As Long, _ ByVal lprcClip As Long, _ ByVal lpfnEnum As Long, _ dwData As Any) As Long Public Declare Function GetSystemMetrics Lib "user32" _ (ByVal nIndex As Long) As Long Public Function MonitorEnumProc(ByVal hMonitor As Long, _ ByVal hdcMonitor As Long, _ ByVal rcMonitor As Long, _ dwData As ListBox) As Long Dim rc As RECT 'copy the rectangle data from 'rcMonitor into a RECT type CopyMemory rc, ByVal rcMonitor, Len(rc) 'dwData is defined in the MSDN as 'application-defined data that 'EnumDisplayMonitors passes directly 'to the enumeration function. ' 'Here we've used it to pass the listbox 'for display. Note that the declare for 'EnumDisplayMonitors has dwData defined '"dwData as Any". If you want something 'other than a control passed, or no 'application-specific data at all, 'redefine the parameters above to change 'the byref "dwData As ListBox" to '"ByVal dwData as Long". With dwData 'our listbox .AddItem " Monitor handle :" & vbTab & hMonitor .AddItem " Display rectangle :" .AddItem " desktop left :" & vbTab & rc.Left .AddItem " desktop top :" & vbTab & rc.Top .AddItem " desktop height :" & vbTab & rc.Bottom - rc.Top .AddItem " desktop width :" & vbTab & rc.Right - rc.Left .AddItem "" End With 'return 1 to continue processing 'monitor information, or return '0 to stop. Returning 1 obtains 'info for all physical and invisible 'pseudo-monitors associated with 'mirroring drivers MonitorEnumProc = 1 End Function |
Form Code |
Add a listbox (List1) and a command button (Command1) to a form, and add the following code: |
|
Option Explicit Private Sub Form_Load() Command1.Caption = "EnumDisplayMonitors" End Sub Private Sub Command1_Click() Dim numMonitors As Long Dim cnt As Long Dim rc As RECT 'determine number of display 'monitors on the desktop numMonitors = GetSystemMetrics(SM_CMONITORS) If numMonitors > 0 Then With List1 .Clear .AddItem "GetSystemMetrics results:" .AddItem " Number of display monitors:" & vbTab & numMonitors 'Check if all display monitors have 'the same color format. Returns True (1) 'if they do, or FALSE otherwise. Note 'that two displays can have the same 'bit depth, but different color formats. 'For example, the red, green, and blue 'pixels can be encoded with different 'numbers of bits, or those bits can be 'located in different places in a pixel's 'color value. .AddItem " Same color format :" & vbTab & GetSystemMetrics(SM_SAMEDISPLAYFORMAT) .AddItem "" 'determine the total size of the 'virtual desktop created by all 'display monitors on the desktop .AddItem " Bounding rectangle of all display monitors :" .AddItem " Virtual desktop - left :" & vbTab & GetSystemMetrics(SM_XVIRTUALSCREEN) .AddItem " Virtual desktop - top :" & vbTab & GetSystemMetrics(SM_YVIRTUALSCREEN) .AddItem " Virtual desktop - height :" & vbTab & GetSystemMetrics(SM_CYVIRTUALSCREEN) .AddItem " Virtual desktop - width :" & vbTab & GetSystemMetrics(SM_CXVIRTUALSCREEN) .AddItem "" End With End If List1.AddItem "EnumDisplayMonitors results:" 'The dwData member can be used to 'specify any application-defined 'value, so here we'll use it to 'pass a listbox to the routine 'for population Call EnumDisplayMonitors(0&, 0&, AddressOf MonitorEnumProc, List1) End Sub |
Comments |
|
|
|
|||||
|
|||||
|
|||||
Copyright ©1996-2011 VBnet and Randy Birch. All Rights Reserved. |