Ein Fenster auf zwei Monitore in Windows maximieren?

44

Ich habe zwei Monitore und möchte mein aktuelles Fenster so aufteilen, dass es auf beiden Monitoren als ein riesiges Fenster angezeigt wird. Weiß jemand, wie man dies nativ in Windows macht?

Crackerjack
quelle
Verwandte: superuser.com/questions/3004/...
Ƭᴇcʜιᴇ007

Antworten:

17

Im Gegensatz zu dem, was andere sagen, gibt es hier eine kostenlose, funktionierende Lösung, die das Fenster unter der Maus maximiert.

(Dank geht an denjenigen, der diese erstaunlichen 'Autoit'-Funktionen geschrieben hat - ich habe nur das Bit geschrieben, das sie verwendet.)

Laden Sie autoit herunter und installieren Sie es (kostenlose Software):

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

Erstellen Sie eine .au3-Datei.

Fügen Sie dies ein:

#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

Dann ändern Sie die Zeile

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

nach Ihren Wünschen.

Anschließend können Sie eine Windows-Verknüpfung zu dieser Datei erstellen, mit der rechten Maustaste darauf klicken -> Eigenschaften und eine Verknüpfung zuweisen (z. B. STRG + ALT + NACH OBEN).

Höchstwahrscheinlich werden Sie feststellen, dass Sie den Vorgang wiederholen und eine zweite Datei erstellen müssen, um das Fenster auf eine kleine Größe zurückzusetzen.

Hoffe das hilft

Nikos
quelle
1
Liebe es! Ich wollte das NVidia-Mosaik verwenden, aber die Monitore, die ich auf zwei separate Grafikkarten aufteilen wollte, konnten nicht wiederhergestellt werden, da KVM kein VGA ausführte. Nur gotchya - Ich war nicht in der Lage, die Tastenkombination direkt von einer Verknüpfung zur .au3-Datei abzurufen. Ich konnte mir eine Tastenkombination besorgen, um eine Verknüpfung zu einem Stapelskript zu erstellen, das das au3-Skript heißt.
Abend
1
In der Tat funktioniert die Verknüpfungsmethode nur, wenn die Skriptdatei auf Ihrem Desktop abgelegt ist.
Nikos
1
Für Benutzer mit mehr als 2 Monitoren stellt das 0,0 in der Zeile WinMove ($ MyWin, "", 0,0,3840,1165) die Koordinaten des Startpunkts dar, sodass durch Ändern der Anzahl der Bildschirme ein Maximum erreicht werden kann diese Zahlen entsprechend.
Ilakast
Ich muss in Win 10 eine Verknüpfung zu dieser Datei maximize.au3 erstellen. Über die Eigenschaften der Verknüpfung kann ich eine Tastenkombination zuweisen. nicht chargenpflichtig.
Martin Zaske,
@nikos Dieses Skript funktioniert für mich, aber ich kann die Syntax für die Windows-Position nicht herausfinden. Scheint, meine 0,0 ist irgendwo "in der Nähe" der oberen linken Ecke meines Hauptmonitors, aber nicht ganz. Auch mein zweiter Monitor befindet sich links von meinem Hauptmonitor (und das Skript scheint dies zuzulassen, aber ich lese die AutoIt-Syntax noch nicht). Aber das Skript öffnet mein Programm rechts von meinem Hauptmonitor (wo es "nichts" gibt). Ich habe versucht, auf einen negativen Wert (-1920,0) zu haken, aber das hat nicht funktioniert, negative Zahlen wurden abgelehnt. Bitte beraten. Ihre Antwort ist eine Freude, wird meine Lösung für viele Programme sein, müssen nur mehr lernen
Martin Zaske
9

Jeff Axelrod hat eine großartige Lösung , die AutoHotKey verwendet .

Er ordnet die Shift + Windows + UpKombination zu, um ein Fenster über alle Bildschirme hinweg zu maximieren. Dies ergänzt die Tastenkombination von Windows 7 Windows + Up, mit der das ausgewählte Fenster auf einem Monitor maximiert wird.

Hier ist sein Code (danke 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
quelle
Shift + Windows + Up funktioniert in meinem Windows 10-Setup mit zwei Bildschirmen und zwei verschiedenen Grafiktreibern nicht. Immer noch nützlich für andere.
Martin Zaske
8

Verwenden Sie Dual-Monitor-Tools : Es handelt sich um eine Reihe kostenloser Tools, mit denen Sie die Einrichtung mehrerer Bildschirme verwalten können.

Im Swap Screen Tool können Sie dem "Supersize active window" einen Hotkey zuweisen, um es so zu maximieren, dass es alle Bildschirme belegt.

Max
quelle
2
Ausgezeichnetes Programm mit vernünftigen Vorgaben (alle deaktiviert), das genau das tut, was ich gesucht habe und von Ultramon stammt. Ein Tipp: Der Hotkey zu "Aktives Fenster übergroßen" verhält sich wie ein Toggle. Ein erneuter Schlag stellt das Fenster wieder her.
Fanis
3

Wenn Sie eine nVidia-Grafikkarte haben:

  1. Klicken Sie mit der rechten Maustaste auf den Desktop und klicken Sie auf "NVIDIA-Systemsteuerung".
  2. Am Ende der Aufgabenliste unter Workstation befindet sich "Mosaik einrichten". Klick es.
  3. Aktivieren Sie im rechten Bereich das Kontrollkästchen neben "Mosaik aktivieren".
  4. Aktivieren Sie unter "Anzeigen" die Kontrollkästchen neben den Monitoren, die Sie kombinieren möchten.
  5. Wählen Sie unter Konfiguration die gewünschte Topologie aus (nebeneinander, vertikal ..).
  6. Klicken Sie unten rechts auf dem Bildschirm auf "Übernehmen".

Wenn Sie jetzt auf die Schaltfläche Maximieren klicken, werden beide Monitore abgedeckt. Ihre Taskleiste deckt auch beide Monitore ab. Wenn das Sie stört, ziehen Sie es auf die linke Seite des Monitors, damit es vertikal wird (dies funktioniert besser, wenn Sie die Symbole klein machen und "Nie kombinieren" verwenden).

michaelmoo
quelle
2

Ich verwende dazu ein kostenloses Dienstprogramm, VirtualScreenMaximizer:

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

Sie können die Verknüpfungen anpassen, die zum Maximieren und Wiederherstellen verwendet werden sollen. Beim Maximieren wird das Fenster über der Taskleiste erweitert.

amloessb
quelle
2

Etwas zu spät, aber wenn Sie integrierte Intel-Grafik verwenden, können Sie das Intel-Grafik-Control-Panel öffnen, das Anzeigemenü auswählen und von dort aus mehrere Anzeigen auswählen und "Collage" auswählen. Auf diese Weise können Sie auswählen, über welche Monitore Sie mit einigen anderen Optionen erweitern möchten .

Hier ist ein Screenshot davon aktiviert:

Hier ist ein Screenshot davon aktiviert

Brad
quelle
1

Klicken und ziehen Sie, andernfalls können Sie die Monitore mit Ihrer erweiterten Grafikkarte so konfigurieren, dass sie als ein großer Bildschirm fungieren.

Garrett
quelle
0

Unter Windows 7 kann ich das Fenster so ziehen, dass es beide Bildschirme abdeckt. Wenn Sie mit der rechten Maustaste auf Ihren Desktop klicken und "Bildschirmauflösung" auswählen, müssen Sie "Diese Anzeigen erweitern" unter "Mehrere Anzeigen" auswählen. Wenn Sie das Fenster wieder schließen, sollte es sich an Größe und Position erinnern.

CGA
quelle
Das stimmt, ich suche nach einer Lösung, bei der Sie das Fenster für beide Monitore einfach mit einer Verknüpfung oder ähnlichem maximieren können.
Crackerjack
können Sie das nicht einfach tun, indem Sie die Titelleiste des Fensters an den oberen Bildschirmrand ziehen
subanki
@subanki - nein, das maximiert nur das Fenster auf dem aktuellen Monitor (der, den Sie "gestoßen" haben)
Chris_K
0

Wenn noch jemand versucht, dies mit autoit zu tun, habe ich es mit folgendem Code geschafft:

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
quelle
Nach dem Einbinden von WinAPI.au3 und WindowsConstants.au3 funktioniert dies.
Max Hohenegger
0

Ich verwende diese Problemumgehung für Sizer ( Homepage ). Mit dem kleinen Freeware-Dienstprogramm können Sie die vordefinierte Fenstergröße festlegen, indem Sie mit der rechten Maustaste in den Fensterdehnungsbereich klicken.

Erstellen Sie einfach ein Profilset:

  • Breite = Summe der Monitorbreiten
  • Höhe = Monitorhöhe - Taskleistenhöhe (= 40)
  • Verschieben nach = Oben links.

Klicken Sie dann mit der rechten Maustaste auf das rechte untere Ende des Fensters und wählen Sie das Profil aus.

Bildbeschreibung hier eingeben

Lluser
quelle
0

Ich habe einen Weg gefunden, dies ohne Software oder Code zu tun. Es ist nicht automatisch oder perfekt, aber es ist einfach und funktioniert gut genug.

  1. Windows + Nach-links- oder Nach-rechts-Taste, um das Fenster an einem halben Monitor am äußersten Rand der beiden Monitore auszurichten
  2. Fassen Sie den Rand des Fensters an und ziehen Sie es über beide Monitore zur anderen Seite
user3173663
quelle
0

Klicken Sie mit der rechten Maustaste auf die Symbolleiste des Fensters, wählen Sie Wiederherstellen und ändern Sie die Größe in beiden Bildschirmen.

Ali Haider Govani
quelle