57 votes

Maximiser une fenêtre sur deux moniteurs sous Windows ?

J'ai deux moniteurs et je veux étendre ma fenêtre actuelle pour qu'elle apparaisse comme une fenêtre géante sur les deux moniteurs. Quelqu'un sait-il comment faire cela en mode natif dans Windows ?

18voto

nikos Points 181

Contrairement à ce que disent les autres, voici une solution gratuite et fonctionnelle qui maximise la fenêtre qui se trouve sous la souris.

(Les remerciements vont à celui qui a écrit ces étonnantes fonctions 'autoit' - j'ai juste écrit le passage qui les utilise).

Téléchargez autoit et installez-le (logiciel gratuit) :

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

Créez un fichier .au3.

Collez ceci à l'intérieur :

#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

Ensuite, changez la ligne

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

aux valeurs de votre choix.

Vous pouvez ensuite créer un raccourci Windows pour ce fichier, en faisant un clic droit dessus->Propriétés, et en attribuant un raccourci (par exemple CTRL+ALT+UP).

Il est fort probable que vous deviez répéter la procédure et créer un deuxième fichier pour ramener la fenêtre à une taille réduite.

J'espère que cela vous aidera

17voto

Ryan Points 1189

Jeff Axelrod a un excellente solution qui utilise AutoHotKey .

Il cartographie le ShiftWindows pour maximiser une fenêtre sur tous les affichages, ce qui complète l'option de Windows 7 Windows qui permet de maximiser la fenêtre sélectionnée sur un seul moniteur.

Voici son code (merci 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

11voto

Max Points 1078

Utilisez Outils à double écran : c'est un ensemble de outils gratuits gérer la configuration de plusieurs écrans.

Dans le Écran d'échange vous pouvez assigner une touche de raccourci à l'option "Supersize active window" afin de la maximiser pour qu'elle occupe tous les écrans.

5voto

Richard Points 425

J'ai trouvé un moyen de le faire sans aucun logiciel ou code. Ce n'est pas automatique ou parfait, mais c'est facile et fonctionne assez bien.

  1. Windows + touche flèche gauche ou droite pour déplacer la fenêtre sur un demi-moniteur à l'extrémité des deux moniteurs.
  2. Saisissez le bord de la fenêtre et faites-le glisser sur les deux moniteurs jusqu'à l'autre côté.

4voto

Brad Points 41

Un peu tard, mais si vous utilisez les graphiques intégrés d'Intel, vous pouvez ouvrir le panneau de contrôle graphique d'Intel, sélectionner le menu d'affichage et de là, choisir les affichages multiples et choisir "Collage", ce qui vous permettra de choisir les moniteurs que vous souhaitez étendre à travers ainsi que d'autres choix.

Voici une capture d'écran de l'activer :

Heres a screenshot of it enabled

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X