Como você pode maximizar uma janela para monitores duplos no Windows?

37

Eu tenho dois monitores e quero expandir minha janela atual para que ela apareça como uma janela gigante em ambos os monitores. Alguém sabe como fazer isso nativamente do windows? Se não, quaisquer utilitários gratuitos que possam fazer isso?

    
por Crackerjack 09.09.2010 / 18:29

8 respostas

16

Em contraste com o que os outros estão dizendo, aqui está uma solução livre e funcional que maximiza a janela que está sob o mouse.

(Os créditos vão para o cara que escreveu essas incríveis funções 'autoit' - eu acabei de escrever o bit que as usa.)

Faça o download do autoit e instale-o (software livre):

link

Crie um arquivo .au3.

Cole isto 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

Em seguida, mude a linha

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

para os valores que você gosta.

Em seguida, você pode criar um atalho do Windows para esse arquivo, clicar com o botão direito do mouse nas propriedades it- > e atribuir um atalho (por exemplo, CTRL + ALT + UP).

O mais provável é que você precise repetir o procedimento e criar um segundo arquivo para restaurar a janela para um tamanho pequeno.

Espero que isso ajude

    
por 08.05.2012 / 22:41
6

Jeff Axelrod tem um grande solução que usa AutoHotKey .

Ele mapeia a combinação Shift + Windows + Up para maximizar uma janela em todas as exibições, o que complementa a tecla de atalho Windows + Up do Windows 7, que maximiza a janela selecionada em um monitor.

Aqui está o código dele (obrigado 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
    
por 02.03.2017 / 03:12
5

Use ferramentas de monitor duplo : é um conjunto de ferramentas gratuitas gerenciar a configuração de várias telas.

Na ferramenta Alternar tela , você pode atribuir uma tecla de atalho à janela "Supersize active" "para que você possa maximizá-lo para ocupar todas as telas.

    
por 06.03.2014 / 11:37
3

Se você tiver uma placa de vídeo da nVidia:

  1. Clique com o botão direito do mouse na área de trabalho e clique em "Painel de controle da NVIDIA"
  2. Na parte inferior da lista de tarefas, em Workstation, está "Configurar Mosaico". Clique aqui.
  3. No painel direito, clique na caixa de seleção ao lado de "Ativar mosaico"
  4. Em Exibe, coloque marcas de verificação ao lado dos monitores que você deseja combinar.
  5. Em Configuração, selecione qual topologia você deseja (lado a lado, vertical ..)
  6. Na parte inferior direita da tela, clique em "Aplicar"

Agora, quando você clica no botão Maximizar, ele cobre os dois monitores. Sua barra de tarefas também cobrirá os dois monitores. Se isso te incomoda, tente arrastá-lo para a esquerda do monitor para que ele fique na vertical (isso funciona melhor se você tornar os ícones pequenos e usar 'nunca combinar').

    
por 29.05.2013 / 22:16
2

Eu uso um utilitário gratuito para isso, o VirtualScreenMaximizer:

link

Você pode personalizar os atalhos para maximizar e restaurar, e irá expandir a janela sobre a barra de tarefas durante a maximização.

    
por 22.06.2013 / 00:15
1

Clique e arraste, caso contrário, você pode usar sua placa gráfica avançada para configurar os monitores para atuar como uma tela grande.

    
por 11.09.2010 / 14:31
0

No meu Windows 7, posso arrastar a janela para que ela cubra as duas telas. Se você clicar com o botão direito do mouse em sua área de trabalho e escolher "resolução de tela", terá que escolher "estender essas exibições" em "várias exibições". Se você fechar a janela novamente, deve lembrar o tamanho e a posição.

    
por 09.09.2010 / 18:38
0

Se alguém ainda estiver tentando fazer isso usando autoit , consegui fazer isso 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
    
por 10.02.2015 / 14:32