2011-10-16 31 views
2

外接顯示器的尺寸要找到顯示器的大小,我一直在使用:發現在Excel VBA中

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

然後:

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

也能正常工作的主監視器,但是如何找到外接顯示器的尺寸?

+0

轉念一想WMI將提供一個解決方案,快速谷歌得來了這與一些評論認爲可能是利益的http://計算器.com/questions/181064/enumdisplaydevices-vs-wmi-win32-desktopmonitor-how-to-detect-active-monitors – brettdj

回答

5

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 
+0

謝謝,GSerg。這很有效,除了'EnumDisplaySettings .DeviceName,ENUM_CURRENT_SETTINGS,dmode 應該是'EnumDisplaySettings ddAdapters.DeviceName,ENUM_CURRENT_SETTINGS,dmode – Roy

+0

'行中有一個錯字,您的編輯修正了它,以便我的上面的評論可以被忽略。 – Roy