home *** CD-ROM | disk | FTP | other *** search
/ Planet Source Code Jumbo …e CD Visual Basic 1 to 7 / 7_2009-2012.ISO / data / zips / Remote_Des21926411122010.psc / RemoteDesktop / class / clsMonitors.cls < prev    next >
Text File  |  2010-11-12  |  10KB  |  289 lines

  1. VERSION 1.0 CLASS
  2. BEGIN
  3.   MultiUse = -1  'True
  4.   Persistable = 0  'NotPersistable
  5.   DataBindingBehavior = 0  'vbNone
  6.   DataSourceBehavior  = 0  'vbNone
  7.   MTSTransactionMode  = 0  'NotAnMTSObject
  8. END
  9. Attribute VB_Name = "clsMonitors"
  10. Attribute VB_GlobalNameSpace = False
  11. Attribute VB_Creatable = False
  12. Attribute VB_PredeclaredId = False
  13. Attribute VB_Exposed = False
  14. '<CSCC>
  15. '--------------------------------------------------------------------------------
  16. '    Component  : clsMonitors
  17. '    Project    : NetRemote
  18. '    Author     : B2qid www.labsoft.web.id
  19. '    Description: {ParamList}
  20. '
  21. '    Modified   : 11/12/2010 2:52:18 PM
  22. '--------------------------------------------------------------------------------
  23. '</CSCC>
  24. Option Explicit
  25. ' --------------------------------------------------------------------------
  26. '               Copyright (C) 1998 Microsoft Corporation                   '
  27. ' --------------------------------------------------------------------------
  28. ' You have a royalty-free right to use, modify, reproduce and distribute   '
  29. ' the Sample Application Files (and/or any modified version) in any way    '
  30. ' you find useful, provided that you agree that Microsoft has no warranty, '
  31. ' obligations or liability for any Sample Application Files.               '
  32. ' --------------------------------------------------------------------------
  33. ' Written by Mike Dixon (mikedix@microsoft.com)                            '
  34. ' --------------------------------------------------------------------------
  35.  
  36. 'Virtual Desktop sizes
  37. Const SM_XVIRTUALSCREEN = 76    'Virtual Left
  38. Const SM_YVIRTUALSCREEN = 77    'Virtual Top
  39. Const SM_CXVIRTUALSCREEN = 78   'Virtual Width
  40. Const SM_CYVIRTUALSCREEN = 79   'Virtual Height
  41.  
  42. Const SM_CMONITORS = 80         'Get number of monitors
  43. Const SM_SAMEDISPLAYFORMAT = 81
  44.  
  45. 'Constants for the return value when finding a monitor
  46. Const MONITOR_DEFAULTTONULL = &H0       'If the monitor is not found, return 0
  47. Const MONITOR_DEFAULTTOPRIMARY = &H1    'If the monitor is not found, return the primary monitor
  48. Const MONITOR_DEFAULTTONEAREST = &H2    'If the monitor is not found, return the nearest monitor
  49. Const MONITORINFOF_PRIMARY = 1
  50.  
  51. 'Rectangle structure, for determining
  52. 'monitors at a given position
  53. Private Type RECT
  54.     Left    As Long
  55.     Top     As Long
  56.     Right   As Long
  57.     Bottom  As Long
  58. End Type
  59.  
  60. 'Structure for the position of a monitor
  61. Private Type tagMONITORINFO
  62.     cbSize      As Long 'Size of structure
  63.     rcMonitor   As RECT 'Monitor rect
  64.     rcWork      As RECT 'Working area rect
  65.     dwFlags     As Long 'Flags
  66. End Type
  67.  
  68. Public Monitors As New Collection
  69.  
  70. Private Declare Function GetSystemMetrics Lib "user32" ( _
  71.         ByVal nIndex As Long) As Long
  72.  
  73. 'These API's are not present in Pre Windows 98 and
  74. 'Pre Windows NT 5 operating systems, you will need
  75. 'to trap for errors when using them.
  76. '(Err.Number 453 Can't find DLL entry point...
  77. Private Declare Function GetMonitorInfo Lib "user32" _
  78.         Alias "GetMonitorInfoA" ( _
  79.         ByVal hMonitor As Long, _
  80.         MonInfo As tagMONITORINFO) As Long
  81.  
  82. Private Declare Function MonitorFromWindow Lib "user32" ( _
  83.         ByVal hwnd As Long, _
  84.         dwFlags As Long) As Long
  85.  
  86. Private Declare Function MonitorFromRect Lib "user32" ( _
  87.         rc As RECT, _
  88.         ByVal dwFlags As Long) As Long
  89.  
  90. '==================================================================================================
  91. 'Public Members
  92. '==================================================================================================
  93. Private Sub Class_Initialize()
  94.     'Load the monitors collection
  95.     Refresh
  96. End Sub
  97.  
  98. Public Property Get DesktopLeft() As Long
  99.     DesktopLeft = GetSystemMetrics2(SM_XVIRTUALSCREEN, 0)
  100. End Property
  101.  
  102. Public Property Get DesktopTop() As Long
  103.     DesktopTop = GetSystemMetrics2(SM_YVIRTUALSCREEN, 0)
  104. End Property
  105.  
  106. Public Property Get DesktopWidth() As Long
  107.     DesktopWidth = GetSystemMetrics2(SM_CXVIRTUALSCREEN, Screen.Width \ Screen.TwipsPerPixelX)
  108. End Property
  109.  
  110. Public Property Get DesktopHeight() As Long
  111.     DesktopHeight = GetSystemMetrics2(SM_CYVIRTUALSCREEN, Screen.Height \ Screen.TwipsPerPixelY)
  112. End Property
  113.  
  114. Public Function GetMonitorFromWindow(hwnd As Long, dwFlags As Long) As Long
  115.     '=====================================================
  116.     'Returns a monitor handle that the Window (hwnd) is in
  117.     '=====================================================
  118.     Dim lReturn As Long
  119.     
  120.     On Error GoTo GetMonitorFromWindow_Err
  121.     lReturn = MonitorFromWindow(hwnd, dwFlags)
  122.     GetMonitorFromWindow = lReturn
  123.     Exit Function
  124. GetMonitorFromWindow_Err:
  125.     If Err.Number = 453 Then
  126.         'Non-Multimonitor OS, return -1
  127.         GetMonitorFromWindow = -1
  128.     End If
  129. End Function
  130.  
  131. Public Function GetMonitorFromXYPoint(x As Long, y As Long, dwFlags As Long) As Long
  132.     '==========================================
  133.     'Gets a monitor handle from the xy point
  134.     'Workaround for the GetMonitorFromPoint API
  135.     'is to use the GetMonitorFromRect API and
  136.     'build a rect instead
  137.     '==========================================
  138.     Dim lReturn As Long
  139.     Dim rcRect As RECT
  140.     
  141.     'Transfer the x y into a rect 1 pixel square
  142.     With rcRect
  143.         .Top = y
  144.         .Left = x
  145.         .Right = x + 1
  146.         .Bottom = y + 1
  147.     End With
  148.     On Error Resume Next
  149.     lReturn = MonitorFromRect(rcRect, dwFlags)
  150.     If Err.Number = 0 Then
  151.         GetMonitorFromXYPoint = lReturn
  152.     Else
  153.         GetMonitorFromXYPoint = -1
  154.     End If
  155. End Function
  156.  
  157. Public Sub Refresh()
  158.     '=====================================================
  159.     'Iterate through the Virtual Desktop and enumerate the
  160.     'Monitors that intersect each 640x480 grid section
  161.     '=====================================================
  162.     Dim lMonitors       As Long
  163.     Dim cMonitor        As clsMonitor
  164.     Dim lLoop           As Long
  165.     Dim lLoop2          As Long
  166.     Dim lMonitor        As Long
  167.     
  168.     On Error GoTo Refresh_Err
  169.     
  170.     Set Me.Monitors = Nothing
  171.     
  172.     'Find Out How Many monitors there are
  173.     lMonitors = GetSystemMetrics(SM_CMONITORS)
  174.     
  175.     If lMonitors = 0 Then
  176.         'Non multimonitor OS, just do the screen size
  177.         ClearMonitorsCollection
  178.         Set cMonitor = New clsMonitor
  179.         With cMonitor
  180.             .Handle = 0
  181.             .Bottom = Screen.Height \ Screen.TwipsPerPixelY
  182.             .Left = 0
  183.             .Right = Screen.Width \ Screen.TwipsPerPixelX
  184.             .Top = 0
  185.             .WorkBottom = .Bottom
  186.             .WorkLeft = 0
  187.             .WorkRight = .Right
  188.             .WorkTop = 0
  189.             .Width = .Right
  190.             .Height = .Bottom
  191.         End With
  192.         'Add the monitor to the monitors collection
  193.         Monitors.Add Item:=cMonitor, Key:=CStr(0)
  194.     Else
  195.         
  196.         'Loop through an imaginary grid of 640x480 cells across the virtual desktop
  197.         'testing each for the monitor it is on, then try to add that monitor to the
  198.         'collection, if it fails, it is a duplicate, so just keep going.
  199.         For lLoop = DesktopTop To DesktopHeight Step 480
  200.             For lLoop2 = DesktopLeft To DesktopWidth Step 640
  201.                 lMonitor = GetMonitorFromXYPoint(lLoop2 + 320, lLoop + 240, 0)
  202.                 If lMonitor <> 0 Then
  203.                     Set cMonitor = New clsMonitor
  204.                     Call GetMonitorInformation(lMonitor, cMonitor)
  205.                     Monitors.Add Item:=cMonitor, Key:=CStr(lMonitor)
  206.                 End If
  207.             Next
  208.         Next
  209.     End If
  210.     Exit Sub
  211. Refresh_Err:
  212.     'Duplicate in the collection, so
  213.     'just ignore it and look for the next one
  214.     If Err.Number = 457 Then Resume Next
  215. End Sub
  216.  
  217.  
  218. '==================================================================================================
  219. 'Private Members
  220. '==================================================================================================
  221. Private Function GetSystemMetrics2(lItem As Long, lDefault As Long) As Long
  222.     '===============================================
  223.     'Calls GetSystemMetrics if multi-monitor capable
  224.     'Otherwise return the default value passed in
  225.     '===============================================
  226.     If GetSystemMetrics(SM_CMONITORS) = 0 Then
  227.         'No multi monitor, return default
  228.         GetSystemMetrics2 = lDefault
  229.     Else
  230.         'Get the desired metric
  231.         GetSystemMetrics2 = GetSystemMetrics(lItem)
  232.     End If
  233. End Function
  234.  
  235. Private Function GetMonitorInformation(hMonitor As Long, cMon As clsMonitor) As Long
  236.     '======================================================
  237.     'Fills in the cMon class passed in with the information
  238.     '======================================================
  239.     Dim MonitorInfo As tagMONITORINFO
  240.     Dim lReturn     As Long
  241.     Dim lMonitor    As Long
  242.     
  243.     On Error GoTo GetMonitorInformation_Err
  244.     MonitorInfo.cbSize = Len(MonitorInfo)
  245.     lReturn = GetMonitorInfo(hMonitor, MonitorInfo)
  246.     With cMon
  247.         .Handle = hMonitor
  248.         .Left = MonitorInfo.rcMonitor.Left
  249.         .Right = MonitorInfo.rcMonitor.Right
  250.         .Top = MonitorInfo.rcMonitor.Top
  251.         .Bottom = MonitorInfo.rcMonitor.Bottom
  252.         
  253.         .WorkLeft = MonitorInfo.rcWork.Left
  254.         .WorkRight = MonitorInfo.rcWork.Right
  255.         .WorkTop = MonitorInfo.rcWork.Top
  256.         .WorkBottom = MonitorInfo.rcWork.Bottom
  257.         
  258.         .Height = MonitorInfo.rcMonitor.Bottom - MonitorInfo.rcMonitor.Top
  259.         .Width = MonitorInfo.rcMonitor.Right - MonitorInfo.rcMonitor.Left
  260.     End With
  261.     GetMonitorInformation = lReturn
  262.     Exit Function
  263. GetMonitorInformation_Err:
  264.     If Err.Number = 453 Then
  265.         'Non-Multimonitor OS, return -1
  266.         GetMonitorInformation = -1
  267.     End If
  268. End Function
  269.  
  270. Private Sub ClearMonitorsCollection()
  271.     '==============================
  272.     'Clears the monitors collection
  273.     '==============================
  274.     Dim cMonitors   As clsMonitor
  275.     Dim lCount      As Long
  276.     Dim lLoop       As Long
  277.     
  278.     lCount = Monitors.Count
  279.     On Error Resume Next
  280.     For lLoop = 0 To lCount Step -1
  281.         Monitors.Remove lLoop
  282.     Next
  283. End Sub
  284.  
  285.  
  286.  
  287.  
  288.  
  289.