Что нового

Два монитора и более.

  • Автор темы VitAl2013
  • Дата начала
V

VitAl2013

Гость
Как определить кол-во подключеных мониторов и их разрешение? Ну и какой из них главный тоже бы хотелось знать.
 

sforce5

Олл фо ЛулзЪ
Сообщения
160
Репутация
41
Код:
Global Const $MONITOR_DEFAULTTONULL     = 0x00000000
Global Const $MONITOR_DEFAULTTOPRIMARY  = 0x00000001
Global Const $MONITOR_DEFAULTTONEAREST  = 0x00000002

Global Const $CCHDEVICENAME             = 32
Global Const $MONITORINFOF_PRIMARY      = 0x00000001


$hMonitor = GetMonitorFromPoint(0, 0)
;$hMonitor = GetMonitorFromPoint(-2, 0)
;$hMonitor = GetMonitorFromPoint(@DesktopWidth, 0)

If $hMonitor <> 0 Then
    Dim $arMonitorInfos[4]
    If GetMonitorInfos($hMonitor, $arMonitorInfos) Then _
        Msgbox(0, "Monitor-Infos", "Rect-Monitor" & @Tab & ": " & $arMonitorInfos[0] & @LF & _
                            "Rect-Workarea" & @Tab & ": " & $arMonitorInfos[1] & @LF & _
                            "PrimaryMonitor?" & @Tab & ": " & $arMonitorInfos[2] & @LF & _
                            "Devicename" & @Tab & ": " & $arMonitorInfos[3])
EndIf

Exit

Func GetMonitorFromPoint($x, $y)
    $hMonitor = DllCall("user32.dll", "hwnd", "MonitorFromPoint", _
                                            "int", $x, _
                                            "int", $y, _
                                            "int", $MONITOR_DEFAULTTONULL)
    Return $hMonitor[0]
EndFunc


Func GetMonitorInfos($hMonitor, ByRef $arMonitorInfos)
    Local $stMONITORINFOEX = DllStructCreate("dword;int[4];int[4];dword;char[" & $CCHDEVICENAME & "]")
    DllStructSetData($stMONITORINFOEX, 1, DllStructGetSize($stMONITORINFOEX))

    $nResult = DllCall("user32.dll", "int", "GetMonitorInfo", _
                                            "hwnd", $hMonitor, _
                                            "ptr", DllStructGetPtr($stMONITORINFOEX))
    If $nResult[0] = 1 Then
        $arMonitorInfos[0] = DllStructGetData($stMONITORINFOEX, 2, 1) & ";" & _
            DllStructGetData($stMONITORINFOEX, 2, 2) & ";" & _
            DllStructGetData($stMONITORINFOEX, 2, 3) & ";" & _
            DllStructGetData($stMONITORINFOEX, 2, 4)
        $arMonitorInfos[1] = DllStructGetData($stMONITORINFOEX, 3, 1) & ";" & _
            DllStructGetData($stMONITORINFOEX, 3, 2) & ";" & _
            DllStructGetData($stMONITORINFOEX, 3, 3) & ";" & _
            DllStructGetData($stMONITORINFOEX, 3, 4)
        $arMonitorInfos[2] = DllStructGetData($stMONITORINFOEX, 4)
        $arMonitorInfos[3] = DllStructGetData($stMONITORINFOEX, 5)
    EndIf
    
    Return $nResult[0]
EndFunc
 
Автор
V

VitAl2013

Гость
У меня определился только второй монитор, первого как-будто нет.
 
Автор
V

VitAl2013

Гость
Хотелось бы несколько расширить вопрос, точнее повернуть его несколько под другой угол. Надо знать на мониторе какого разрешения находится окно.
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
369
VitAl2013 [?]
Хотелось бы несколько расширить вопрос, точнее повернуть его несколько под другой угол. Надо знать на мониторе какого разрешения находится окно.
Ну может хоть как-то подтолкну в нужную сторону :smile: :
Код:
$aDesk = WinGetPos('Program Manager')
MsgBox(0, '', 'width - ' & $aDesk[2] & ' / height - ' & $aDesk[3])

Так можно определить общее суммарное разрешение всех мониторов, по $aDesk[2] получаем общую "длину" :D, дальше по величине $aDesk[3] можно определить количество мониторов (определенной высоте соответствует определенная длина для одного монитора). Дальше берем WinGetPos() нашей программы и определяем на каком монитор она находится. Но если на мониторах разное разрешение и они расположены не в линию... :wacko: После праздников скажу что выдаст WinGetPos('Program Manager') для трех моников с разным разрешением.
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
369
WinGetPos('Program Manager') для нескольких мониторов с разным разрешение дает сумму разрешений по ширине и максимальное разрешение из всех мониторов.

VitAl2013 сказал(а):
Хотелось бы несколько расширить вопрос, точнее повернуть его несколько под другой угол. Надо знать на мониторе какого разрешения находится окно.
Ну вот так можно:
Код:
#include <WindowsConstants.au3>
GUICreate('наше окно', 100, 100, -1, -1, $WS_POPUP)
GUISetState()
Sleep(100)
$aPos = WinGetPos('ЦЕЛЕВОЕ ОКНО'); для которого необходимо узнать разрешение монитора, в котором оно находится
WinMove('наше окно', '', $aPos[0], $aPos[1])
Sleep(100)
GUISetState(@SW_MAXIMIZE)
Sleep(100)
$aPos2 = WinGetPos('наше окно')
MsgBox(0, 'разрешение монитора под целевым окном', 'width - ' & $aPos2[2] & ' / height - ' & $aPos2[3])
 

sforce5

Олл фо ЛулзЪ
Сообщения
160
Репутация
41
Код:
Global Const $MONITOR_DEFAULTTONULL     = 0x00000000
Global Const $MONITOR_DEFAULTTOPRIMARY  = 0x00000001
Global Const $MONITOR_DEFAULTTONEAREST  = 0x00000002

Global Const $CCHDEVICENAME             = 32
Global Const $MONITORINFOF_PRIMARY      = 0x00000001

$_GetMonitors = _EnumDisplayMonitors()

For $i = 1 to $_GetMonitors[0][0]
	Dim $arMonitorInfos[4]
	;MsgBox(64, "", "Monitor Handle: "& $_GetMonitors[$i][0] &@CRLF& "Left: "& $_GetMonitors[$i][1] &@CRLF& "Top: "& $_GetMonitors[$i][2] &@CRLF& "Right: "& $_GetMonitors[$i][3] &@CRLF& "Bottom: "& $_GetMonitors[$i][4])
    If _GetMonitorInfo($_GetMonitors[$i][0], $arMonitorInfos) Then _
        Msgbox(0, "Monitor-Infos", "Rect-Monitor" & @Tab & ": " & $arMonitorInfos[0] & @LF & _
                            "Rect-Workarea" & @Tab & ": " & $arMonitorInfos[1] & @LF & _
                            "PrimaryMonitor?" & @Tab & ": " & $arMonitorInfos[2] & @LF & _
                            "Devicename" & @Tab & ": " & $arMonitorInfos[3])
Next

;==================================================================================================
; Function Name:   _EnumDisplayMonitors()
; Description::    Load monitor positions
; Parameter(s):    n/a
; Return Value(s): 2D Array of Monitors
;                       [0][0] = Number of Monitors 
;                       [i][0] = HMONITOR handle of this monitor.
;                       [i][1] = Left Position of Monitor 
;                       [i][2] = Top Position of Monitor 
;                       [i][3] = Right Position of Monitor 
;                       [i][4] = Bottom Position of Monitor 
; Note:            [0][1..4] are set to Left,Top,Right,Bottom of entire screen
;                  hMonitor is returned in [i][0], but no longer used by these routines.
;                  Also sets $__MonitorList global variable (for other subs to use)
; Author(s):       xrxca ([email protected])
;==================================================================================================
Func _EnumDisplayMonitors()
	Global $__MonitorList[1][5]
	$__MonitorList[0][0] = 0
    Local $handle = DllCallbackRegister("_MonitorEnumProc", "int", "hwnd;hwnd;ptr;lparam")
    DllCall("user32.dll", "int", "EnumDisplayMonitors", "hwnd", 0, "ptr", 0, "ptr", DllCallbackGetPtr($handle), "lparam", 0)
    DllCallbackFree($handle)
    Local $i = 0
    For $i = 1 To $__MonitorList[0][0]
        If $__MonitorList[$i][1] < $__MonitorList[0][1] Then $__MonitorList[0][1] = $__MonitorList[$i][1]
        If $__MonitorList[$i][2] < $__MonitorList[0][2] Then $__MonitorList[0][2] = $__MonitorList[$i][2]
        If $__MonitorList[$i][3] > $__MonitorList[0][3] Then $__MonitorList[0][3] = $__MonitorList[$i][3]
        If $__MonitorList[$i][4] > $__MonitorList[0][4] Then $__MonitorList[0][4] = $__MonitorList[$i][4]
    Next
    Return $__MonitorList
EndFunc   ;==>_EnumDisplayMonitors

Func _GetMonitorInfo($hMonitor, ByRef $arMonitorInfos)
    Local $stMONITORINFOEX = DllStructCreate("dword;int[4];int[4];dword;char[" & $CCHDEVICENAME & "]")
    DllStructSetData($stMONITORINFOEX, 1, DllStructGetSize($stMONITORINFOEX))

    $nResult = DllCall("user32.dll", "int", "GetMonitorInfo", "hwnd", $hMonitor, "ptr", DllStructGetPtr($stMONITORINFOEX))
    If $nResult[0] = 1 Then
        $arMonitorInfos[0] = DllStructGetData($stMONITORINFOEX, 2, 1) & ";" & _
            DllStructGetData($stMONITORINFOEX, 2, 2) & ";" & _
            DllStructGetData($stMONITORINFOEX, 2, 3) & ";" & _
            DllStructGetData($stMONITORINFOEX, 2, 4)
        $arMonitorInfos[1] = DllStructGetData($stMONITORINFOEX, 3, 1) & ";" & _
            DllStructGetData($stMONITORINFOEX, 3, 2) & ";" & _
            DllStructGetData($stMONITORINFOEX, 3, 3) & ";" & _
            DllStructGetData($stMONITORINFOEX, 3, 4)
        $arMonitorInfos[2] = DllStructGetData($stMONITORINFOEX, 4)
        $arMonitorInfos[3] = DllStructGetData($stMONITORINFOEX, 5)
    EndIf
    
    Return $nResult[0]
EndFunc   ;==>_GetMonitorInfo

;==================================================================================================
; Function Name:   _MonitorEnumProc($hMonitor, $hDC, $lRect, $lParam)
; Description::    Enum Callback Function for EnumDisplayMonitors in _GetMonitors
; Author(s):       xrxca ([email protected])
;==================================================================================================
Func _MonitorEnumProc($hMonitor, $hDC, $lRect, $lParam)
    Local $Rect = DllStructCreate("int left;int top;int right;int bottom", $lRect)
    $__MonitorList[0][0] += 1
    ReDim $__MonitorList[$__MonitorList[0][0] + 1][5]
    $__MonitorList[$__MonitorList[0][0]][0] = $hMonitor
    $__MonitorList[$__MonitorList[0][0]][1] = DllStructGetData($Rect, "left")
    $__MonitorList[$__MonitorList[0][0]][2] = DllStructGetData($Rect, "top")
    $__MonitorList[$__MonitorList[0][0]][3] = DllStructGetData($Rect, "right")
    $__MonitorList[$__MonitorList[0][0]][4] = DllStructGetData($Rect, "bottom")
    Return 1
EndFunc   ;==>_MonitorEnumProc
 
Верх