Ein Fenster auf zwei Monitore in Windows maximieren?


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


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

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.


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).



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


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.


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.


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

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


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

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.