¿Maximizar una ventana en monitores duales en Windows?

Respuestas:

17

En contraste con lo que otros dicen, aquí hay una solución gratuita y funcional que maximiza la ventana que está debajo del mouse.

(Los créditos van al tipo que escribió estas increíbles funciones 'autoit', yo solo escribí el bit que las usa).

Descargue autoit e instálelo (software gratuito):

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

Crea un archivo .au3.

Pega esto adentro:

#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

Luego cambia la línea

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

a los valores de tu agrado.

Luego puede crear un acceso directo de Windows a este archivo, hacer clic con el botón derecho en él> propiedades y asignar un acceso directo (por ejemplo, CTRL + ALT + ARRIBA).

Lo más probable es que necesites repetir el procedimiento y crear un segundo archivo para restaurar la ventana a un tamaño pequeño.

Espero que esto ayude

nikos
fuente
1
¡Quiéralo! Iba a usar el mosaico NVidia, pero los monitores que quería dividir en dos tarjetas gráficas separadas, y no pude recuperarlos debido a que KVM no hacía VGA. Solo gotchya: no pude hacer que el atajo de teclado funcionara directamente desde un atajo al archivo .au3. Sin embargo, pude obtener un método abreviado de teclado para trabajar un acceso directo a un script por lotes que llamó al script au3.
paquetp
1
De hecho, el método de acceso directo no funciona, a menos que el archivo de script se coloque en su escritorio.
nikos
1
Para aquellos que tienen más de 2 monitores, el 0,0 en la línea WinMove ($ MyWin, "", 0,0,3840,1165) representa las coordenadas del punto de partida, por lo que se puede maximizar en cualquier cantidad de pantallas cambiando estos números en consecuencia.
ilakast
Tengo que crear un acceso directo para maximizar maxim.au3 en Win 10, y las propiedades del acceso directo me permiten asignar un acceso directo de tecla; No se necesita lote.
Martin Zaske
@nikos este script funciona para mí pero no puedo entender la sintaxis de la posición de Windows; Parece que mi 0,0 está en algún lugar "cerca" de la parte superior izquierda de mi monitor principal, pero no del todo. Además, mi segundo monitor está a la izquierda de mi monitor principal (y el script parece permitirlo, pero todavía no leo la sintaxis de AutoIt). Pero el script está abriendo mi programa a la derecha de mi monitor principal (donde no hay "nada"). Intenté conectarme a un valor negativo (-1920,0) pero eso no funcionó, los números negativos se negaron. Por favor avise. Su respuesta es una alegría, será mi solución para muchos programas, solo necesito aprender más
Martin Zaske
9

Jeff Axelrod tiene una gran solución que utiliza AutoHotKey .

Él mapea la Shift + Windows + Upcombinación para maximizar una ventana en todas las pantallas, lo que complementa la Windows + Uptecla de acceso rápido de Windows 7 , que maximiza la ventana seleccionada en un monitor.

Aquí está su código (¡gracias 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
fuente
Shift + Windows + Up no funciona en mi configuración de Windows 10 con dos pantallas y dos controladores de gráficos diferentes. Todavía potencialmente útil para los demás.
Martin Zaske
8

Utilice las herramientas de monitor dual : es un conjunto de herramientas gratuitas que administran la configuración de múltiples pantallas.

En la herramienta Cambiar pantalla , puede asignar una tecla de acceso rápido a la "Ventana activa de tamaño grande" para que pueda maximizarla y ocupar todas las pantallas.

Max
fuente
2
Excelente programa con valores predeterminados sanos (todos deshabilitados) que hace exactamente lo que estaba buscando, proveniente de Ultramon. Una pista: la tecla de acceso rápido para "Supersize active window" actúa como una palanca. Golpearlo nuevamente restaura la ventana.
Fanis
3

Si tiene una tarjeta de video nVidia:

  1. Haga clic derecho en el escritorio y haga clic en "Panel de control de NVIDIA"
  2. En la parte inferior de la lista de tareas, en Estación de trabajo, se encuentra "Configurar mosaico". Pinchalo.
  3. En el panel derecho, haga clic en la casilla de verificación junto a "Habilitar mosaico"
  4. En Pantallas, coloque marcas de verificación junto a los monitores que desea combinar.
  5. En Configuración, seleccione qué topología desea (lado a lado, vertical ...)
  6. En la esquina inferior derecha de la pantalla, haz clic en "Aplicar"

Ahora, cuando hace clic en el botón Maximizar, cubrirá ambos monitores. Su barra de tareas también cubrirá ambos monitores. Si eso le molesta, intente arrastrarlo hacia la izquierda del monitor para que quede vertical (esto funciona mejor si hace que los iconos sean pequeños y use 'nunca combinar').

michaelmoo
fuente
2

Un poco tarde, pero si usa los gráficos integrados de Intel, puede abrir el panel de control de gráficos de Intel, seleccionar el menú de visualización y, desde allí, elegir múltiples pantallas y elegir "Collage", esto le permitirá elegir qué monitores desea ampliar junto con algunas otras opciones .

Aquí hay una captura de pantalla habilitada:

Aquí hay una captura de pantalla habilitada

Puntilla
fuente
1

Haga clic y arrastre, de lo contrario, puede usar su tarjeta gráfica avanzada para configurar los monitores para que actúen como una pantalla grande.

Garrett
fuente
0

En mi Windows 7 puedo arrastrar la ventana para que cubra ambas pantallas. Si hace clic con el botón derecho en su escritorio y elige "resolución de pantalla", debe elegir "extender estas pantallas" en "pantallas múltiples". Si cierra la ventana nuevamente, debe recordar el tamaño y la posición.

CGA
fuente
Es cierto, estoy buscando una solución en la que pueda maximizar fácilmente la ventana a ambos monitores con un acceso directo o algo así.
Crackerjack
no son capaces de hacer eso, simplemente arrastrando la barra de título de ventana a la de la parte superior de la pantalla
subanki
@subanki - no, eso solo maximizará la ventana en el monitor actual (el que "golpeó")
Chris_K
0

Si alguien todavía está tratando de hacer esto usando autoit, lo hice usando este código:

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
fuente
Después de incluir WinAPI.au3 y WindowsConstants.au3, esto funciona.
Max Hohenegger
0

Utilizo esta solución alternativa con Sizer ( página de inicio ): su pequeña utilidad de software gratuito le permite establecer el tamaño predefinido de las ventanas haciendo clic derecho en el área de estiramiento de la ventana.

Simplemente cree un conjunto de perfiles:

  • Ancho = suma de anchos de monitores
  • Altura = altura del monitor - altura de la barra de tareas (= 40)
  • Mover a = Arriba a la izquierda.

Luego, haga clic derecho en el extremo inferior derecho de la ventana y seleccione el perfil.

ingrese la descripción de la imagen aquí

Lluser
fuente
0

Encontré una manera de hacer esto sin ningún software o código. No es automático ni perfecto, pero es fácil y funciona lo suficientemente bien.

  1. Windows + tecla de flecha izquierda o derecha para ajustar la ventana a medio monitor en el borde más alejado de los dos monitores
  2. Agarra el borde de la ventana y arrástralo por ambos monitores hacia el otro lado
usuario3173663
fuente
0

Haga clic derecho en la barra de herramientas de Windows, seleccione Restaurar, luego cambie su tamaño en ambas pantallas.

Ali Haider Govani
fuente