Maximizar uma janela para dois monitores no Windows?

44

Eu tenho monitores duplos e quero estender minha janela atual para que ela apareça como uma janela gigante nos dois monitores. Alguém sabe como fazer isso nativamente no Windows?

Crackerjack
fonte
Relacionados: superuser.com/questions/3004/...
Ƭᴇcʜιᴇ007

Respostas:

17

Em contraste com o que os outros estão dizendo, aqui está uma solução de trabalho gratuita que maximiza a janela que está embaixo do mouse.

(Os créditos são para o cara que escreveu essas incríveis funções de 'autoit' - acabei de escrever a parte que as utiliza.)

Baixe o autoit e instale-o (software gratuito):

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

Crie um arquivo .au3.

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

Então mude a linha

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

aos valores do seu gosto.

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

Provavelmente, você descobrirá que precisará repetir o procedimento e criar um segundo arquivo para restaurar a janela para um tamanho pequeno.

Espero que isto ajude

nikos
fonte
11
Adoro! Eu usaria o mosaico NVidia, mas os monitores que eu queria dividir entre duas placas gráficas separadas e não puderam ser recuperados por causa do KVM não usar VGA. Apenas gotchya - não consegui fazer com que o atalho do teclado funcionasse diretamente de um atalho para o arquivo .au3. Eu era capaz de obter um atalho de teclado para trabalhar com um atalho para um script em lote que chamava de script au3.
paquetp 29/11
11
Na verdade, o método de atalho não funciona, a menos que o arquivo de script seja colocado na área de trabalho.
Nikos
11
Para aqueles com mais de 2 monitores, o 0,0 na linha WinMove ($ MyWin, "", 0,0,3840,1165) representa as coordenadas do ponto inicial, portanto, é possível maximizar em qualquer quantidade de telas alterando esses números de acordo.
ilakast
Eu tenho que criar um atalho para isso maximize.au3 no Win 10, e as propriedades do atalho permitem atribuir um atalho de tecla; não é necessário lote.
Martin Zaske
@nikos este script funciona para mim, mas não consigo descobrir a sintaxe para a posição do windows; parece que o meu 0,0 está em algum lugar "próximo" do canto superior esquerdo do meu monitor principal, mas não exatamente. Além disso, meu segundo monitor fica à esquerda do monitor principal (e o script parece permitir isso, mas ainda não leio a sintaxe AutoIt). Mas o script está abrindo meu programa à direita do meu monitor principal (onde não há "nada"). Tentei ligar para um valor negativo (-1920,0), mas isso não funcionou, os números negativos foram recusados. Por favor informar. A sua resposta é uma alegria, será a minha solução para muitos programas, só precisa aprender mais
Martin Zaske
9

Jeff Axelrod tem uma ótima solução que usa o AutoHotKey .

Ele mapeia a Shift + Windows + Upcombinação para maximizar uma janela em todos os monitores, o que complementa a Windows + Uptecla de atalho 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
Ryan
fonte
Shift + Windows + Up não funciona na minha instalação do Windows 10 com duas telas e dois drivers gráficos diferentes. Ainda potencialmente útil para os outros.
Martin Zaske
8

Use o Dual Monitor Tools : é um conjunto de ferramentas gratuitas que gerenciam a configuração de várias telas.

Na ferramenta Trocar tela , você pode atribuir uma tecla de atalho à "Supersize active window", para poder maximizá-la para ocupar todas as telas.

Máx.
fonte
2
Excelente programa com padrões saudáveis ​​(todos desativados) que faz exatamente o que eu estava procurando, vindo da Ultramon. Uma dica: a tecla de atalho "Substituir janela ativa" funciona como uma alternância. Bater novamente restaura a janela.
Fanis
3

Se você possui uma placa de vídeo nVidia:

  1. Clique com o botão direito na área de trabalho e clique em "Painel de controle da NVIDIA"
  2. Na parte inferior da lista de tarefas, em Estação de trabalho, está "Configurar mosaico". Clique.
  3. No painel direito, clique na caixa de seleção ao lado de "Ativar mosaico"
  4. Em Monitores, coloque marcas de seleção ao lado dos monitores que você deseja combinar.
  5. Em Configuração, selecione qual topologia você deseja (lado a lado, vertical ..)
  6. No canto inferior direito 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 lhe incomoda, tente arrastá-lo para a esquerda do monitor para que fique vertical (isso funciona melhor se você diminuir os ícones e usar 'nunca combinar').

michaelmoo
fonte
2

Um pouco tarde, mas se você estiver usando gráficos integrados da Intel, poderá abrir o painel de controle de gráficos da Intel, selecionar o menu de exibição e, a partir daí, escolher vários monitores e escolher "Colagem", isso permitirá que você escolha quais monitores deseja estender, além de outras opções. .

Aqui está uma captura de tela ativada:

Heres uma captura de tela dele habilitada

Brad
fonte
1

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

Garrett
fonte
0

No meu Windows 7, consigo arrastar a janela para cobrir as duas telas. Se você clicar com o botão direito na área de trabalho e escolher "resolução da tela", precisará escolher "estender essas telas" em "várias telas". Se você fechar a janela novamente, lembre-se do tamanho e posição.

CGA
fonte
É verdade, estou procurando uma solução em que você possa maximizar facilmente a janela dos dois monitores com um atalho ou algo assim.
Crackerjack #
não você é capaz de fazer isso simplesmente arrastando a janela barra de título para o para o topo da tela
subanki
@subanki - não, isso só vai maximizar a janela no monitor atual (aquela que você "batido")
Chris_K
0

Se alguém ainda está tentando fazer isso usando o autoit, eu 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
Finn van Damme
fonte
Depois de incluir o WinAPI.au3 e o WindowsConstants.au3, isso funciona.
Max Hohenegger 23/02
0

Eu uso essa solução alternativa com o Sizer ( página inicial ) - seu pequeno utilitário freeware permite definir o tamanho predefinido das janelas clicando com o botão direito na área de alongamento da janela.

Basta criar um conjunto de perfis:

  • Largura = soma das larguras dos monitores
  • Altura = Altura do monitor - altura da barra de tarefas (= 40)
  • Mover para = Superior esquerdo.

Em seguida, clique com o botão direito do mouse na extremidade inferior direita da janela e selecione o perfil.

insira a descrição da imagem aqui

Lluser
fonte
0

Eu encontrei uma maneira de fazer isso sem nenhum software ou código. Não é automático ou perfeito, mas é fácil e funciona bem o suficiente.

  1. Windows + tecla de seta esquerda ou direita para ajustar a janela a meio monitor na extremidade dos dois monitores
  2. Pegue a borda da janela e arraste-a pelos dois monitores para o outro lado
user3173663
fonte
0

Clique com o botão direito do mouse na barra de ferramentas do Windows, selecione Restaurar e redimensione-o nas duas telas.

Ali Haider Govani
fonte