39

У меня есть два монитора, и я хочу расширить свое текущее окно, чтобы оно отображалось как одно гигантское окно на обоих мониторах. Кто-нибудь знает, как это сделать в Windows?

9 ответов9

16

В отличие от того, что говорят другие, вот бесплатное, работающее решение, которое максимизирует окно, которое находится под мышью.

(Авторы идут за парнем, который написал эти удивительные функции autoit - я просто написал бит, который их использует.)

Скачайте autoit и установите его (бесплатное программное обеспечение):

http://www.autoitscript.com/site/autoit/

Создайте файл .au3.

Вставьте это внутри:

#include <misc.au3>
#include <Array.au3>
HotKeySet('{ESC}', '_Exit')

Global $WinText, $OldMouse[2], $NewMouse[2], $Windows, $x, $MyWin, $MyCoords

$NewMouse = MouseGetPos()
$title = _GetWin()
WinSetState($MyWin,"",@SW_RESTORE)
WinMove($MyWin,"",0,0,3840,1165)

Func _GetWin()
    Local $Coords
    ToolTip("")
    $Mouse = MouseGetPos()
    $OldMouse = $Mouse
    $Windows = _WinList()
    ;_ArrayDisplay($Windows, "")
    For $x = 1 To UBound($Windows)-1
        $Coords = WinGetPos($Windows[$x][0], "")
        If $Coords = -4 Then ExitLoop
        If IsArray($Coords) Then
            If $Mouse[0] >= $Coords[0] And $Mouse[0] <= ($Coords[0]+$Coords[2]) And $Mouse[1] >= $Coords[1] And $Mouse[1] <= ($Coords[1]+$Coords[3]) Then ExitLoop
        EndIf   
    Next
    If $x = UBound($Windows) Then $x -= 1
    $MyWin =  $Windows[$x][0]
    $Control = _MouseGetCtrlInfo()
    $Return = $Windows[$x][0] & @CRLF & $Control 
    Return $Return
EndFunc 

Func _WinList()
    Local $WinListArray[1][2]
    $var = WinList()
    For $i = 1 to $var[0][0]
        If $var[$i][0] <> "" AND IsVisible($var[$i][1]) Then
            Redim $WinListArray[UBound($WinListArray) + 1][2]
            $WinListArray[UBound($WinListArray)-1][0] = $var[$i][0]
            $WinListArray[UBound($WinListArray)-1][1] = $var[$i][1]
        EndIf
    Next
    Return $WinListArray
EndFunc

Func IsVisible($handle)
  If BitAnd( WinGetState($handle), 2 ) Then 
    Return 1
  Else
    Return 0
  EndIf
EndFunc

Func _Exit()
    Exit
EndFunc 

Func _MouseGetCtrlInfo()  ; get ID, Classe and Text of a control
    Global $hWin = WinGetHandle($MyWin)
    Global $sClassList = WinGetClassList($hWin)
    Local $sSplitClass = StringSplit(StringTrimRight($sClassList, 1), @LF)
    Local $aMPos = MouseGetPos()
    ;_ArrayDisplay($sSplitClass, "")
    $MyCoords = ClientToScreen($hWin)
    For $iCount = UBound($sSplitClass) - 1 To 1 Step - 1
        Local $nCount = 0
        If $sSplitClass[$iCount] = "WorkerW" Then ContinueLoop
        While 1
            $nCount += 1
            $aCPos = ControlGetPos($hWin, '', $sSplitClass[$iCount] & $nCount)
            If @error Then ExitLoop
            $hCtrlWnd = ControlGetHandle ($hWin, "", $sSplitClass[$iCount] & $nCount)
            If IsArray($aCPos) Then
                If $aMPos[0] >= ($MyCoords[0]+$aCPos[0]) And $aMPos[0] <= ($MyCoords[0]+$aCPos[0] + $aCPos[2]) _
                    And $aMPos[1] >= ($MyCoords[1]+$aCPos[1]) And $aMPos[1] <= ($MyCoords[1]+$aCPos[1] + $aCPos[3]) Then
                    $aReturn = DllCall('User32.dll', 'int', 'GetDlgCtrlID', 'hwnd', $hCtrlWnd)
                    If @error Then Return "Err"
                    $Text = ControlGetText($hWin, '', $sSplitClass[$iCount] & $nCount)
                    If StringInStr($Text, @LF) Then $Text = "demasiado largo"
                    If IsArray($aReturn) Then Return 'ControlID: ' & $aReturn[0] & @CRLF & 'ClassNameNN: ' & $sSplitClass[$iCount] & $nCount &  @CRLF & "Text: " & $Text
                EndIf      
            EndIf
        WEnd
    Next
    ;_ArrayDisplay($sSplitClass, "")
    Return "No Ctrl"
EndFunc

Func ClientToScreen($hWnd)    ; get client area of a win relative to the screan
    Local $Point, $aRes[2]
    Local $cX, $cY
    $Point = DllStructCreate("int;int")
    DllStructSetData($Point, 1, $cX)
    DllStructSetData($Point, 1, $cY)
    DllCall("User32.dll", "int", "ClientToScreen", "hwnd", $hWnd, "ptr", DllStructGetPtr($Point))
    $aRes[0] = DllStructGetData($Point, 1)
    $aRes[1] = DllStructGetData($Point, 2)
    Return $aRes
EndFunc

Затем измените строку

WinMove($ MyWin, "", 0,0,3840,1165)

ценностям по вашему вкусу.

Затем вы можете создать ярлык Windows для этого файла, щелкнуть его правой кнопкой мыши -> Свойства и назначить ярлык (например, CTRL+ALT+UP).

Скорее всего, вы обнаружите, что вам нужно будет повторить процедуру и создать второй файл, чтобы восстановить окно небольшого размера.

Надеюсь это поможет

6

У Джеффа Аксельрода есть отличное решение , использующее AutoHotKey.

Он отображает комбинацию Shift + Windows + Up чтобы максимизировать окно на всех дисплеях, что дополняет горячую клавишу Windows 7 Windows + Up , которая максимизирует выбранное окно на одном мониторе.

Вот его код (спасибо, Джефф!):

;Shift + Windows + Up (maximize a window across all displays) https://stackoverflow.com/a/9830200/470749
+#Up::
    WinGetActiveTitle, Title
    WinRestore, %Title%
   SysGet, X1, 76
   SysGet, Y1, 77
   SysGet, Width, 78
   SysGet, Height, 79
   WinMove, %Title%,, X1, Y1, Width, Height
return
6

Используйте Dual Monitor Tools: это набор бесплатных инструментов для управления настройкой нескольких экранов.

В инструменте замены экрана вы можете назначить горячую клавишу "Активному окну большого размера", чтобы вы могли развернуть ее на все экраны.

3

Если у вас есть видеокарта nVidia:

  1. Щелкните правой кнопкой мыши на рабочем столе и выберите "Панель управления NVIDIA".
  2. В нижней части списка задач в разделе "Рабочая станция" находится "Настройка мозаики". Нажмите на это.
  3. На правой панели установите флажок рядом с "Включить мозаику".
  4. Под дисплеями поставьте галочки рядом с мониторами, которые вы хотите объединить.
  5. В разделе "Конфигурация" выберите топологию, которую вы хотите (бок о бок, вертикальную ...)
  6. В правом нижнем углу экрана нажмите "Применить"

Теперь, когда вы нажмете кнопку «Развернуть», она охватит оба монитора. Ваша панель задач также будет охватывать оба монитора. Если это вас не устраивает, попробуйте перетащить его влево от монитора, чтобы он стал вертикальным (это будет лучше, если вы сделаете значки маленькими и используете «никогда не комбинировать»).

2

Для этого я использую бесплатную утилиту VirtualScreenMaximizer:

http://virtualscreenmax.codeplex.com/releases/view/20213

Вы можете настроить ярлыки, которые будут использоваться для максимизации и восстановления, и при развертывании окно будет расширено над панелью задач.

2

Немного поздно, но если вы используете интегрированную графику Intel, вы можете открыть панель управления графикой Intel, выбрать меню дисплея и оттуда выбрать несколько дисплеев и выбрать "Коллаж", это позволит вам выбрать мониторы, которые вы хотите расширить, наряду с некоторыми другими вариантами ,

Вот снимок экрана, на котором он включен:

Вот скриншот его включен

1

Нажмите и перетащите, в противном случае вы можете использовать свою продвинутую графическую карту, чтобы настроить мониторы для работы в качестве одного большого экрана.

0

На моем Windows 7 я могу перетащить окно так, чтобы оно закрывало оба экрана. Если вы щелкнете правой кнопкой мыши по своему рабочему столу и выберете "разрешение экрана", вам нужно будет выбрать "расширить эти дисплеи" в разделе "несколько дисплеев". Если вы снова закроете окно, оно должно запомнить размер и положение.

0

Если кто-то все еще пытается сделать это с помощью autoit, мне удалось сделать это с помощью этого кода:

HotKeySet("^+{UP}", "Resize_Window") ; CTRL+SHIFT+UP
While 1
    Sleep(1000)
WEnd
Func Resize_Window()
    WinSetState("[ACTIVE]","",@SW_RESTORE)
    WinMove("[ACTIVE]","",0,0,_WinAPI_GetSystemMetrics($SM_CXVIRTUALSCREEN),_WinAPI_GetSystemMetrics($SM_CYVIRTUALSCREEN))
EndFunc

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .