Развернуть окно на двух мониторах в Windows?

44

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

классный
источник
Похожие
страницы

Ответы:

17

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

(Кредиты идут парню, который написал эти удивительные функции 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).

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

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

Никос
источник
1
Любить это! Я собирался использовать мозаику NVidia, но мониторы, которые я хотел разделить, где-то из двух отдельных видеокарт, и не могли быть воспроизведены из-за KVM не делает VGA. Только у меня получилось - я не смог заставить работать сочетание клавиш непосредственно с ярлыком для файла .au3. Мне удалось получить сочетание клавиш для работы с ярлыком для пакетного сценария, который называется сценарием au3.
Пакет
1
Действительно, ярлык не работает, если файл скрипта не размещен на вашем рабочем столе.
Никос
1
Для тех, у кого более двух мониторов, значение 0,0 в строке WinMove ($ MyWin, "", 0,0,3840,1165) представляет координаты начальной точки, поэтому можно увеличить изображение на любом количестве экранов, изменив эти цифры соответственно.
ilakast
Мне нужно создать ярлык для этого maximize.au3 в Win 10, и свойства ярлыка позволяют мне назначить сочетание клавиш; не требуется партия
Мартин Заске
@nikos этот скрипт работает для меня, но я не могу понять синтаксис для положения окна; Кажется, мой 0,0 находится где-то рядом с верхним левым краем моего основного монитора, но не совсем. Также мой второй монитор находится слева от моего основного монитора (и сценарий, кажется, допускает такое, но я еще не читал синтаксис AutoIt). Но скрипт открывает мою программу справа от моего основного монитора (там, где «ничего»). Я попытался подключиться к отрицательному значению (-1920,0), но это не сработало, отрицательные числа отказались. Пожалуйста, порекомендуйте. Твой ответ радостен, станет моим решением для многих программ, просто нужно узнать больше
Мартин Заске
9

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

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

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

;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
Райан
источник
Shift + Windows + Up не работает на моей установке Windows 10 с двумя экранами и двумя различными графическими драйверами. Все еще потенциально полезно для других.
Мартин Заске
8

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

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

Максимум
источник
2
Отличная программа со стандартными настройками (все отключены), которая делает именно то, что я искал, от Ultramon. Подсказка: горячая клавиша «Увеличить активное окно» действует как тумблер. Удар по нему снова восстанавливает окно.
Фанис
3

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

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

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

michaelmoo
источник
2

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

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

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

amloessb
источник
2

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

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

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

штифтик
источник
1

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

Garrett
источник
0

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

CGA
источник
Это правда, я ищу решение, в котором вы можете легко развернуть окно для обоих мониторов с помощью ярлыка или чего-то в этом роде.
Crackerjack
Разве
@subanki - нет, это просто увеличит окно на текущем мониторе (тот, который вы «ударили»)
Chris_K
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
Финн ван Дамм
источник
После включения WinAPI.au3 и WindowsConstants.au3 это работает.
Макс Хохенеггер
0

Я использую этот обходной путь с Sizer ( домашняя страница ) - его небольшая бесплатная утилита позволяет вам устанавливать предопределенный размер окон, щелкая правой кнопкой мыши в области растягивания окна.

Просто создайте набор профилей:

  • Ширина = сумма ширин мониторов
  • Высота = Высота монитора - высота панели задач (= 40)
  • Переместить в = вверху слева.

Затем просто щелкните правой кнопкой мыши в правом нижнем углу окна и выберите профиль.

введите описание изображения здесь

Lluser
источник
0

Я нашел способ сделать это без какого-либо программного обеспечения или кода. Он не является автоматическим или идеальным, но он прост и работает достаточно хорошо.

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

Щелкните правой кнопкой мыши на панели инструментов Windows, выберите «Восстановить», затем измените размер на обоих экранах.

Али Хайдер Говани
источник