2015-12-23 5 views
1

Использование User32 Lib и функции:Получить размер экрана, подобный CursorPos (Excel VBA)

Public Declare Function GetCursorPos Lib "User32" (lpPoint As POINTAPI) As Long 
Public Type POINTAPI 
x As Long 
y As Long 
End Type 
Public pos As POINTAPI 

Вы можете увидеть расположение пикселя курсора с:

GetCursorPos pos 
Debug.Print("X: " & pos.x & " Y: " & pos.y) 

Мой вопрос, можно ли увидеть размер экрана, используя тот же метод, что и GetCursorPos? Моя причина в том, что двойные мониторы могут заставить эту функцию возвращать отрицательные значения. Например, одна установка может быть это между двумя мониторами на левый/правый:

'Not sure if true or not 
MinX: -1920 
MaxX: 1920 
MinY: -1080 
MaxY: 1080 

Я в основном спрашивают, как использовать что-то похожее на GetCursorPos, но для получения границ экранов.

+0

ПОС происходит от «первого» экрана (верхний левый угол) ... если второй больше или слева от него вы получите отрицательные числа ... –

+0

, но для получения разрешения вам нужно что-то вроде 'Объявить функцию PtrSafe GetSystemMetrics Lib« User32 »(ByVal nIndex As Long) As Long', а затем получить с помощью' GetSystemMetrics (0) 'и 'GetSystemMetrics (1)' размер первого монитора при наличии 'GetSystemMetrics (78)' и 'GetSystemMetrics (79)', удерживая сумму обоих (если они слева/справа, вы получаете сумму x и более высокую y) –

+0

@DirkReichel спасибо за GetSystemMetrics (78) и (79)! Это может быть то, что мне нужно. Я не думаю, что вы знаете, как определить настройку монитора через VBA (первичный слева/справа или сверху/снизу) ?. – icebird76

ответ

0

Вы можете получить доступ к WMI через VBA и получить данные конфигурации системы, тогда лично я считаю, что это менее эзотерическое и менее нестабильное, чем кодирование с помощью API Win32. Классы WMI лучше документируются в MSDN, и как только вы изучите технику, чтобы поговорить с одним классом, вы можете получить доступ ко всему спектру раскрываемой информации о системе.

Вот пример запрашивая Win32_DesktopMonitor класса:

Option Explicit 

Sub GetMonitorInfo() 

    'WMI query 
    Dim objWmiInterface As Object 
    Dim objWmiQuery As Object 
    Dim objWmiQueryItem As Object 
    Dim strWQL As String 
    'outputs 
    Dim strDeviceId As String 
    Dim strScreenName As String 
    Dim varScreenHeight As Variant 
    Dim varScreenWidth As Variant 

    'run query 
    strWQL = "Select * From Win32_DesktopMonitor" 
    Set objWmiInterface = GetObject("winmgmts:root/CIMV2") 
    Set objWmiQuery = objWmiInterface.ExecQuery(strWQL) 
    'iterate output 
    For Each objWmiQueryItem In objWmiQuery 
     strDeviceId = objWmiQueryItem.DeviceId 
     strScreenName = objWmiQueryItem.Name 
     varScreenHeight = objWmiQueryItem.ScreenHeight 
     varScreenWidth = objWmiQueryItem.ScreenWidth 
     Debug.Print strDeviceId 
     Debug.Print strScreenName 
     Debug.Print varScreenHeight 
     Debug.Print varScreenWidth 
     Debug.Print "" 
    Next 

End Sub 

В моем случае, у меня есть ноутбук с двумя мониторами, подключенными. Крышка ноутбука закрыта, так что я думаю, что именно поэтому ScreenHeight и ScreenWidthNull являются для первого элемента:

DesktopMonitor1 
Default Monitor 
Null 
Null 

DesktopMonitor2 
Default Monitor 
1080 
1920 

DesktopMonitor3 
Generic PnP Monitor 
1080 
1920