Maximiser une fenêtre sur deux moniteurs dans Windows?

44

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. Est-ce que quelqu'un sait comment faire cela nativement dans Windows?

Crackerjack
la source

Réponses:

17

Contrairement à ce que disent d’autres, voici une solution gratuite et opérationnelle qui optimise la fenêtre sous la souris.

(Les crédits vont au gars qui a écrit ces étonnantes fonctions 'autoit' - je viens d'écrire le morceau qui les utilise.)

Téléchargez et installez automatiquement (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

Puis change la ligne

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

aux valeurs de votre goût.

Ensuite, vous pouvez créer un raccourci Windows vers ce fichier, cliquer dessus avec le bouton droit de la souris -> propriétés, et attribuer un raccourci (par exemple, CTRL + ALT + HAUT).

Vous constaterez probablement que vous devrez répéter la procédure et créer un deuxième fichier pour restaurer la fenêtre à une taille réduite.

J'espère que cela t'aides

nikos
la source
1
Aimer! J'allais utiliser la mosaïque NVidia, mais les moniteurs que je souhaitais scinder en deux cartes graphiques distinctes ne pouvaient pas être enregistrés, car KVM ne prend pas en charge le format VGA. Seulement gotchya - Je n'ai pas réussi à faire en sorte que le raccourci clavier fonctionne directement à partir d'un raccourci vers le fichier .au3. J'ai pu obtenir un raccourci clavier pour travailler sur un raccourci vers un script batch qui appelle le script au3.
paquetp
1
En effet, la méthode de raccourci ne fonctionne pas, sauf si le fichier de script est placé sur votre bureau.
Nikos
1
Pour ceux qui ont plus de 2 moniteurs, le 0,0 dans la ligne WinMove ($ MyWin, "", 0,0,3840,1165) représente les coordonnées du point de départ, afin que l'on puisse maximiser à travers n'importe quel nombre d'écrans en changeant ces chiffres en conséquence.
Ilakast
Je dois créer un raccourci vers cette maxim.au3 dans Win 10, et les propriétés du raccourci me permettent d'attribuer un raccourci clavier; pas besoin de lot.
Martin Zaske
@nikos ce script fonctionne pour moi mais je n'arrive pas à comprendre la syntaxe de la position de la fenêtre; semble que mon 0,0 est quelque part "près" en haut à gauche de mon moniteur principal mais pas tout à fait. De plus, mon deuxième moniteur est à gauche de mon moniteur principal (et le script semble le permettre, mais je ne lis pas encore la syntaxe AutoIt). Mais le script ouvre mon programme à la droite de mon moniteur principal (où il n'y a "rien"). J'ai essayé de décrocher une valeur négative (-1920,0) mais cela n'a pas fonctionné, les nombres négatifs ont été refusés. S'il vous plaît donnez votre avis. Votre réponse est une joie, sera ma solution pour de nombreux programmes, juste besoin d'en savoir plus
Martin Zaske
9

Jeff Axelrod a une excellente solution qui utilise AutoHotKey .

Il mappe la Shift + Windows + Upcombinaison pour maximiser une fenêtre sur tous les écrans, ce qui complète le Windows + Upraccourci clavier de Windows 7 , qui maximise la fenêtre sélectionnée sur un 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
Ryan
la source
Maj + Windows + Up ne fonctionne pas sous Windows 10 avec deux écrans et deux pilotes graphiques différents. Toujours potentiellement utile aux autres.
Martin Zaske
8

Utiliser les outils à double moniteur : c’est un ensemble d’ outils gratuits permettant de gérer la configuration de plusieurs écrans.

Dans l' outil Écran de permutation, vous pouvez affecter un raccourci clavier à la "Fenêtre active grand format" afin de pouvoir l'agrandir pour occuper tous les écrans.

Max
la source
2
Excellent programme avec des valeurs par défaut saines (tous désactivés) qui fait exactement ce que je cherchais, venant d’Ultramon. Un indice: le raccourci clavier pour "Agrandir la fenêtre active" agit comme une bascule. Frapper à nouveau restaure la fenêtre.
Fanis
3

Si vous avez une carte vidéo nVidia:

  1. Cliquez avec le bouton droit sur le bureau, puis cliquez sur "Panneau de configuration NVIDIA".
  2. Au bas de la liste des tâches, sous Poste de travail, se trouve "Configurer la mosaïque". Cliquez dessus.
  3. Dans le volet de droite, cochez la case "Activer la mosaïque".
  4. Sous Affichages, cochez les écrans à combiner.
  5. Sous Configuration, sélectionnez la topologie souhaitée (côte à côte, verticale, etc.).
  6. En bas à droite de l'écran, cliquez sur "Appliquer".

Désormais, lorsque vous cliquez sur le bouton Maximiser, les deux moniteurs sont couverts. Votre barre des tâches couvrira également les deux moniteurs. Si cela vous gêne, essayez de le faire glisser vers la gauche du moniteur afin qu'il devienne vertical (cela fonctionnera mieux si vous réduisez les icônes et utilisez «ne jamais combiner»).

Michaelmoo
la source
2

J'utilise un utilitaire gratuit pour le faire, VirtualScreenMaximizer:

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

Vous pouvez personnaliser les raccourcis à utiliser pour la maximisation et la restauration. Cette fenêtre étend la fenêtre au-dessus de la barre des tâches lors de la maximisation.

amloessb
la source
2

Un peu tard, mais si vous utilisez Intel Graphics intégré, vous pouvez ouvrir le panneau de commande graphique Intel, sélectionner le menu Affichage, puis choisir plusieurs affichages et choisir "Collage". Vous pourrez ainsi choisir les moniteurs sur lesquels vous souhaitez étendre, ainsi que d'autres choix. .

Voici une capture d'écran de celui-ci activé:

Heres une capture d'écran de celui-ci activé

Brad
la source
1

Cliquez et faites glisser, sinon vous pouvez utiliser votre carte graphique avancée pour configurer les moniteurs afin qu'ils agissent comme un grand écran.

Garrett
la source
0

Sur mon Windows 7, je peux faire glisser la fenêtre pour qu'elle couvre les deux écrans. Si vous cliquez avec le bouton droit de la souris sur votre bureau et que vous choisissez «résolution d'écran», vous devez choisir «étendre ces affichages» sous «affichages multiples». Si vous fermez à nouveau la fenêtre, vous devez vous rappeler de la taille et de la position.

CGA
la source
C’est vrai, je cherche une solution permettant d’optimiser facilement la fenêtre sur les deux moniteurs avec un raccourci ou quelque chose comme ça.
Crackerjack
ne pouvez-vous pas faire cela en faisant simplement glisser la barre de titre de la fenêtre vers le haut de l'écran
subanki
@subanki - non, ça va juste agrandir la fenêtre sur le moniteur actuel (celui que vous avez "heurté")
Chris_K
0

Si quelqu'un essaie encore de faire cela en utilisant autoit, j'ai réussi à le faire en utilisant ce code:

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
la source
Après avoir inclus WinAPI.au3 et WindowsConstants.au3, cela fonctionne.
Max Hohenegger
0

J'utilise cette solution de contournement avec Sizer ( page d'accueil ). Son petit utilitaire gratuit vous permet de définir la taille prédéfinie de Windows en cliquant avec le bouton droit de la souris dans la zone d'étirement de la fenêtre.

Il suffit de créer un ensemble de profils:

  • Largeur = somme des largeurs des moniteurs
  • Hauteur = hauteur du moniteur - hauteur de la barre des tâches (= 40)
  • Déplacer vers = en haut à gauche.

Cliquez ensuite avec le bouton droit de la souris sur l’extrémité inférieure droite de la fenêtre et sélectionnez le profil.

entrez la description de l'image ici

Lluser
la source
0

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

  1. Windows + touche fléchée gauche ou droite pour aligner la fenêtre sur un demi-moniteur situé à l'extrémité des deux moniteurs
  2. Saisissez le bord de la fenêtre et faites-la glisser de l'autre côté des deux moniteurs.
utilisateur3173663
la source
0

Faites un clic droit sur la barre d’outils de Windows, sélectionnez Restaurer, puis redimensionnez-le sur les deux écrans.

Ali Haider Govani
la source