найти размер внешнего монитора в Excel VBA - PullRequest
2 голосов
/ 16 октября 2011

Чтобы определить размер монитора, я использовал:

Declare Function GetSystemMetrics32 Lib "user32" Alias "GetSystemMetrics" (ByVal Index As Long) As Long

, а затем:

Function getMonitorSize()
  monitorHeight = GetSystemMetrics32(1)
  monitorWidth = GetSystemMetrics32(0)
End Function

Это нормально работает для основного монитора, но как мне это сделать?найти размер внешнего монитора?

1 Ответ

5 голосов
/ 16 октября 2011

EnumDisplayDevices говорит вам что-то о мониторе с определенным индексом. Вы можете увеличивать индекс с 0 до нуля, пока функция не вернет 0, что означает, что с таким индексом монитора нет.

Затем вы звоните EnumDisplaySettings, чтобы определить размер.

Private Const ENUM_CURRENT_SETTINGS As Long = -1
Private Const DISPLAY_DEVICE_ATTACHED_TO_DESKTOP As Long = &H1
Private Const CCHDEVICENAME As Long = 32
Private Const CCHFORMNAME As Long = 32

Private Type DISPLAY_DEVICE
  cb As Long
  DeviceName As String * CCHDEVICENAME
  DeviceString As String * 128
  StateFlags As Long
  DeviceID As String * 128
  DeviceKey As String * 128
End Type

Private Type DEVMODE
  dmDeviceName As String * CCHDEVICENAME
  dmSpecVersion As Integer
  dmDriverVersion As Integer
  dmSize As Integer
  dmDriverExtra As Integer
  dmFields As Long
  dmOrientation As Integer
  dmPaperSize As Integer
  dmPaperLength As Integer
  dmPaperWidth As Integer
  dmScale As Integer
  dmCopies As Integer
  dmDefaultSource As Integer
  dmPrintQuality As Integer
  dmColor As Integer
  dmDuplex As Integer
  dmYResolution As Integer
  dmTTOption As Integer
  dmCollate As Integer
  dmFormName As String * CCHFORMNAME
  dmLogPixels As Integer
  dmBitsPerPel As Long
  dmPelsWidth As Long
  dmPelsHeight As Long
  dmDisplayFlags As Long
  dmDisplayFrequency As Long
End Type

Private Declare Function EnumDisplayDevices Lib "user32.dll" Alias "EnumDisplayDevicesA" (ByVal lpDevice As String, ByVal iDevNum As Long, ByRef lpDisplayDevice As DISPLAY_DEVICE, ByVal dwFlags As Long) As Long
Private Declare Function EnumDisplaySettings Lib "user32.dll" Alias "EnumDisplaySettingsA" (ByVal lpszDeviceName As String, ByVal iModeNum As Long, ByRef lpDevMode As DEVMODE) As Long

Dim indAdapter As Long, indDisplay As Long
Dim ddAdapters As DISPLAY_DEVICE, ddDisplays As DISPLAY_DEVICE
ddAdapters.cb = Len(ddAdapters):  ddDisplays.cb = Len(ddDisplays)

indAdapter = 0
Do Until EnumDisplayDevices(vbNullString, indAdapter, ddAdapters, 0) = 0

  If (ddAdapters.StateFlags And DISPLAY_DEVICE_ATTACHED_TO_DESKTOP) = DISPLAY_DEVICE_ATTACHED_TO_DESKTOP Then

      Dim NullCharPos As Long
      NullCharPos = InStr(ddAdapters.DeviceName, vbNullChar)

      Dim CurDeviceName As String

      If NullCharPos > 0 Then
        CurDeviceName = Left$(ddAdapters.DeviceName, NullCharPos - 1)
      Else
        CurDeviceName = ddAdapters.DeviceName
      End If

      Dim dmode As DEVMODE
      dmode.dmSize = Len(dmode)

      EnumDisplaySettings CurDeviceName, ENUM_CURRENT_SETTINGS, dmode

      MsgBox "Width: " & dmode.dmPelsWidth
      MsgBox "Height: " & dmode.dmPelsHeight

  End If

  indAdapter = indAdapter + 1
Loop
...