Zmaksymalizować okno do podwójnych monitorów w systemie Windows?

Odpowiedzi:

17

W przeciwieństwie do tego, co mówią inni, tutaj jest bezpłatne, działające rozwiązanie, które maksymalizuje okno pod myszą.

(Podziękowania należą się facetowi, który napisał te niesamowite funkcje „autoit” - właśnie napisałem fragment, który ich używa).

Pobierz autoit i zainstaluj go (darmowe oprogramowanie):

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

Utwórz plik .au3.

Wklej to w środku:

#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

Następnie zmień linię

WinMove ($ MyWin, „”, 0,0,3840,1165)

do wartości swoich upodobań.

Następnie możesz utworzyć skrót systemu Windows do tego pliku, kliknąć go prawym przyciskiem myszy-> właściwości i przypisać skrót (np. CTRL + ALT + UP).

Najprawdopodobniej okaże się, że będziesz musiał powtórzyć procedurę i utworzyć drugi plik, aby przywrócić okno do małego rozmiaru.

Mam nadzieję że to pomoże

nikos
źródło
1
Kocham to! Zamierzałem użyć mozaiki NVidia, ale monitory chciałem podzielić na dwie osobne karty graficzne i nie mogłem odtworzyć, ponieważ KVM nie robi VGA. Tylko gotchya - nie byłem w stanie uzyskać skrótu klawiaturowego do pracy bezpośrednio ze skrótu do pliku .au3. Byłem w stanie uzyskać skrót klawiaturowy, aby wyłączyć skrót do skryptu wsadowego, który wywołał skrypt au3.
paquetp
1
Rzeczywiście metoda skrótu nie działa, chyba że plik skryptu zostanie umieszczony na pulpicie.
nikos
1
Dla tych, którzy mają więcej niż 2 monitory, 0,0 w linii WinMove ($ MyWin, „”, 0,0,3840,1165) reprezentuje współrzędne punktu początkowego, więc można zmaksymalizować na dowolnej liczbie ekranów, zmieniając te liczby odpowiednio.
ilakast
Muszę utworzyć skrót do tego pliku maximize.au3 w Win 10, a właściwości skrótu pozwalają mi przypisać skrót klawiszowy; nie jest wymagana partia.
Martin Zaske
@nikos ten skrypt działa dla mnie, ale nie mogę zrozumieć składni pozycji okna; wygląda na to, że moje 0,0 jest gdzieś „blisko” lewego górnego rogu głównego monitora, ale nie całkiem. Również mój drugi monitor znajduje się po lewej stronie głównego monitora (i wydaje się, że skrypt na to pozwala, ale nie czytam jeszcze składni AutoIt). Ale skrypt otwiera mój program na prawo od głównego monitora (tam, gdzie nie ma „nic”). Próbowałem podpiąć się do wartości ujemnej (-1920,0), ale to nie zadziałało, liczby ujemne odmówiły. Proszę doradź. Twoja odpowiedź jest radością, będzie moim rozwiązaniem dla wielu programów, wystarczy dowiedzieć się więcej
Martin Zaske
9

Jeff Axelrod ma świetne rozwiązanie, które wykorzystuje AutoHotKey .

Mapuje Shift + Windows + Upkombinację, aby zmaksymalizować okno na wszystkich ekranach, co uzupełnia Windows + Upklawisz skrótu Windows 7 , który maksymalizuje wybrane okno na jednym monitorze.

Oto jego kod (dzięki Jeff!):

;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
Ryan
źródło
Shift + Windows + Up nie działa w moim systemie Windows 10 z dwoma ekranami i dwoma różnymi sterownikami graficznymi. Nadal potencjalnie przydatne dla innych.
Martin Zaske
8

Użyj narzędzi Dual Monitor : to zestaw bezpłatnych narzędzi do zarządzania konfiguracją wielu ekranów.

W narzędziu Zamień ekran możesz przypisać klawisz skrótu do „Aktywnego okna Supersize”, aby zmaksymalizować go, aby zajmował wszystkie ekrany.

Max
źródło
2
Doskonały program z rozsądnymi ustawieniami domyślnymi (wszystkie wyłączone), który robi dokładnie to, czego szukałem, pochodzący z Ultramon. Podpowiedź: skrót do „aktywnego okna Supersize” działa jak przełącznik. Ponowne naciśnięcie przywraca okno.
Fanis,
3

Jeśli masz kartę wideo nVidia:

  1. Kliknij pulpit prawym przyciskiem myszy i kliknij „Panel sterowania NVIDIA”
  2. Na dole listy zadań w obszarze Stacja robocza znajduje się „Skonfiguruj mozaikę”. Kliknij to.
  3. W prawym okienku kliknij pole wyboru obok „Włącz mozaikę”
  4. W obszarze Wyświetlacze umieść znaczniki wyboru obok monitorów, które chcesz połączyć.
  5. W obszarze Konfiguracja wybierz żądaną topologię (obok siebie, w pionie ..)
  6. W prawym dolnym rogu ekranu kliknij „Zastosuj”

Teraz, gdy klikniesz przycisk Maksymalizuj, obejmie on oba monitory. Twój pasek zadań obejmie również oba monitory. Jeśli to Cię wkurza, spróbuj przeciągnąć go na lewą stronę monitora, aby stał się pionowy (działa to lepiej, jeśli zmniejszysz ikony i użyjesz opcji „nigdy nie łącz”).

michaelmoo
źródło
2

Nieco później, ale jeśli korzystasz ze zintegrowanej grafiki Intel, możesz otworzyć panel sterowania grafiką Intel, wybrać menu wyświetlania, a stamtąd wybrać wiele wyświetlaczy i wybrać „Kolaż”, to pozwoli ci wybrać, które monitory chcesz rozszerzyć wraz z innymi opcjami .

Oto zrzut ekranu z tego:

Oto zrzut ekranu z tego

Ćwiek
źródło
1

Kliknij i przeciągnij, w przeciwnym razie możesz użyć zaawansowanej karty graficznej, aby skonfigurować monitory tak, aby działały jak jeden duży ekran.

Garrett
źródło
0

W moim systemie Windows 7 jestem w stanie przeciągnąć okno, aby obejmowało oba ekrany. Jeśli klikniesz prawym przyciskiem pulpit i wybierzesz „rozdzielczość ekranu”, musisz wybrać „rozszerzyć te ekrany” w „wielu ekranach”. Jeśli ponownie zamkniesz okno, powinno ono zapamiętać rozmiar i pozycję.

CGA
źródło
To prawda, szukam rozwiązania, w którym można łatwo zmaksymalizować okno do obu monitorów za pomocą skrótu lub czegoś takiego.
Crackerjack,
czy nie jesteś w stanie tego zrobić, po prostu przeciągając pasek tytułu okna na górę ekranu
subanki
@sanki - nie, to po prostu zmaksymalizuje okno na bieżącym monitorze (tym, który „
uderzyłeś
0

Jeśli ktoś nadal próbuje to zrobić za pomocą autoit , udało mi się to zrobić za pomocą tego kodu:

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
Finn van Damme
źródło
Po dołączeniu WinAPI.au3 i WindowsConstants.au3 to działa.
Max Hohenegger,
0

Korzystam z tego obejścia w Sizer ( strona główna ) - jego małe bezpłatne narzędzie pozwala ustawić wstępnie zdefiniowany rozmiar okna, klikając prawym przyciskiem myszy w obszarze Rozciągnięcie okna.

Wystarczy utworzyć zestaw profili:

  • Szerokość = suma szerokości monitorów
  • Wysokość = wysokość monitora - wysokość paska zadań (= 40)
  • Przejdź do = lewy górny róg.

Następnie kliknij prawym przyciskiem myszy prawym dolnym końcem okna i wybierz profil.

wprowadź opis zdjęcia tutaj

Lluser
źródło
0

Znalazłem sposób na zrobienie tego bez żadnego oprogramowania ani kodu. To nie jest automatyczne ani idealne, ale jest łatwe i działa wystarczająco dobrze.

  1. Windows + klawisz strzałki w lewo lub w prawo, aby przyciągnąć okno do połowy monitora na odległej krawędzi dwóch monitorów
  2. Chwyć krawędź okna i przeciągnij przez oba monitory na drugą stronę
użytkownik3173663
źródło
0

Kliknij prawym przyciskiem myszy pasek narzędzi systemu Windows, wybierz Przywróć, a następnie zmień jego rozmiar na obu ekranach.

Ali Haider Govani
źródło