Massimizzare una finestra su due monitor in Windows?


Risposte:


17

Contrariamente a quanto dicono gli altri, ecco una soluzione gratuita e funzionante che massimizza la finestra che si trova sotto il mouse.

(I crediti vanno al ragazzo che ha scritto queste incredibili funzioni di "autoit" - ho appena scritto il bit che le usa.)

Scarica autoit e installalo (software gratuito):

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

Crea un file .au3.

Incolla questo dentro:

#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

Quindi cambia linea

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

ai valori di tuo gradimento.

Quindi è possibile creare un collegamento di Windows a questo file, fare clic con il pulsante destro del mouse su-> proprietà e assegnare un collegamento (ad esempio CTRL + ALT + SU).

Molto probabilmente scoprirai che dovrai ripetere la procedura e creare un secondo file per ripristinare le dimensioni ridotte della finestra.

Spero che sia di aiuto


1
Lo adoro! Stavo per usare il mosaico NVidia, ma i monitor che volevo dividere da dove provenivano da due schede grafiche separate e non potevo recable a causa del fatto che KVM non faceva VGA. Solo gotchya: non sono riuscito a far funzionare la scorciatoia da tastiera direttamente da una scorciatoia nel file .au3. Sono stato in grado di ottenere una scorciatoia da tastiera per elaborare una scorciatoia per uno script batch che ha chiamato lo script au3.
paquetp,

1
In effetti il ​​metodo di collegamento non funziona, a meno che il file di script non sia posizionato sul desktop.
nikos,

1
Per coloro che hanno più di 2 monitor, lo 0,0 nella riga WinMove ($ MyWin, "", 0,0,3840,1165) rappresenta le coordinate del punto di partenza, quindi si può massimizzare su qualsiasi quantità di schermi cambiando questi numeri di conseguenza.
ilakast,

Devo creare un collegamento per questo maxim.au3 in Win 10 e le proprietà del collegamento mi consentono di assegnare un tasto di scelta rapida; non è necessario il batch.
Martin Zaske,

@nikos questo script funziona per me ma non riesco a capire la sintassi per la posizione di Windows; sembra che il mio 0,0 sia da qualche parte "vicino" nella parte superiore sinistra del mio monitor principale, ma non del tutto. Anche il mio secondo monitor è alla sinistra del mio monitor principale (e lo script sembra consentire tale, ma non ho ancora letto la sintassi di AutoIt). Ma lo script sta aprendo il mio programma alla destra del mio monitor principale (dove non c'è "niente"). Ho provato a collegarmi a un valore negativo (-1920,0) ma non ha funzionato, i numeri negativi hanno rifiutato. Si prega di avvisare. La tua risposta è una gioia, sarà la mia soluzione per molti programmi, ho solo bisogno di saperne di più
Martin Zaske,

9

Jeff Axelrod ha un'ottima soluzione che utilizza AutoHotKey .

Mappa la Shift + Windows + Upcombinazione per ingrandire una finestra su tutti i display, il che complimenta il Windows + Uptasto di scelta rapida di Windows 7 , che massimizza la finestra selezionata in un monitor.

Ecco il suo codice (grazie 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

Maiusc + Windows + Su non funziona sulla mia configurazione di Windows 10 con due schermate e due diversi driver grafici. Ancora potenzialmente utile per gli altri.
Martin Zaske,

8

Usa gli strumenti Dual Monitor : è un set di strumenti gratuiti che gestiscono la configurazione di più schermi.

Nello strumento Scambia schermo è possibile assegnare un tasto di scelta rapida alla "Finestra attiva di grandi dimensioni" in modo da poterlo ingrandire per occupare tutte le schermate.


2
Ottimo programma con impostazioni predefinite (tutte disabilitate) che fa esattamente quello che stavo cercando, proveniente da Ultramon. Un suggerimento: il tasto di scelta rapida per "Sostituisci finestra attiva" si comporta come un interruttore. Colpendolo di nuovo ripristina la finestra.
Fanis,

3

Se hai una scheda video nVidia:

  1. Fare clic con il tasto destro sul desktop e fare clic su "Pannello di controllo NVIDIA"
  2. In fondo all'elenco delle attività, sotto Workstation, si trova "Imposta mosaico". Cliccalo.
  3. Nel riquadro destro, fai clic sulla casella di controllo accanto a "Abilita mosaico"
  4. In Display, metti i segni di spunta accanto ai monitor che desideri combinare.
  5. In Configurazione, selezionare la topologia desiderata (side-by-side, vertical ..)
  6. Nella parte in basso a destra dello schermo, fai clic su "Applica"

Ora, quando fai clic sul pulsante Massimizza, coprirà entrambi i monitor. La barra delle applicazioni coprirà anche entrambi i monitor. Se ti dà fastidio, prova a trascinarlo a sinistra del monitor in modo che diventi verticale (funziona meglio se riduci le icone e usi "non combinare mai").



2

Un po 'in ritardo, ma se si utilizza la grafica integrata Intel è possibile aprire il pannello di controllo della grafica Intel, selezionare il menu di visualizzazione e da lì scegliere più schermi e scegliere "Collage", questo ti permetterà di scegliere quali monitor vuoi estendere insieme ad alcune altre scelte .

Ecco uno screenshot abilitato:

Ecco uno screenshot di esso abilitato


1

Fare clic e trascinare, altrimenti è possibile utilizzare la scheda grafica avanzata per configurare i monitor in modo che fungano da uno schermo di grandi dimensioni.


0

Sul mio Windows 7 sono in grado di trascinare la finestra in modo che copra entrambe le schermate. Se fai clic con il pulsante destro del mouse sul desktop e scegli "risoluzione schermo", devi scegliere "estendi questi schermi" sotto "schermi multipli". Se si chiude di nuovo la finestra, è necessario ricordare dimensioni e posizione.


È vero, sto cercando una soluzione in cui puoi facilmente ingrandire la finestra di entrambi i monitor con una scorciatoia o qualcosa del genere.
Crackerjack,

non riesci a farlo semplicemente trascinando la barra del titolo della finestra nella parte superiore dello schermo
subanki

@subanki - no, questo massimizzerà solo la finestra sul monitor corrente (quello che hai "urtato")
Chris_K

0

Se qualcuno sta ancora provando a farlo usando autoit, sono riuscito a farlo usando questo codice:

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

Dopo aver incluso WinAPI.au3 e WindowsConstants.au3 funziona.
Max Hohenegger,

0

Uso questa soluzione alternativa con Sizer ( homepage ): la sua piccola utility freeware ti consente di impostare le dimensioni predefinite di Windows facendo clic con il pulsante destro del mouse nell'area di allungamento della finestra.

Basta creare un set di profili:

  • Larghezza = somma delle larghezze dei monitor
  • Altezza = Altezza monitor - altezza barra delle applicazioni (= 40)
  • Sposta in = In alto a sinistra.

Quindi fai clic con il pulsante destro del mouse sull'estremità inferiore destra della finestra e seleziona il profilo.

inserisci qui la descrizione dell'immagine


0

Ho trovato un modo per farlo senza alcun software o codice. Non è automatico o perfetto, ma è facile e funziona abbastanza bene.

  1. Windows + tasto freccia sinistra o destra per agganciare la finestra a mezzo monitor sul bordo estremo dei due monitor
  2. Prendi il bordo della finestra e trascinalo su entrambi i monitor sul lato opposto

0

Fare clic con il tasto destro sulla barra degli strumenti di Windows, selezionare Ripristina, quindi ridimensionarla su entrambe le schermate.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.