Maksimalkan jendela ke dua monitor di Windows?

44

Saya memiliki dua monitor dan saya ingin menjangkau jendela saya saat ini sehingga muncul sebagai satu jendela raksasa di kedua monitor. Adakah yang tahu cara melakukan ini secara asli di Windows?

Jagoan
sumber
Terkait: superuser.com/questions/3004/…
Ƭᴇcʜιᴇ007

Jawaban:

17

Berbeda dengan apa yang dikatakan orang lain, ini adalah solusi gratis yang berfungsi yang memaksimalkan jendela yang ada di bawah mouse.

(Kredit diberikan kepada orang yang menulis fungsi 'autoit' yang luar biasa ini - Saya baru saja menulis bit yang menggunakannya.)

Unduh autoit dan instal (perangkat lunak gratis):

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

Buat file .au3.

Rekatkan ini di dalam:

#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

Kemudian ganti baris

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

dengan nilai-nilai yang Anda sukai.

Kemudian Anda dapat membuat pintasan windows ke file ini, klik kanan properti->, dan tetapkan pintasan (mis. CTRL + ALT + UP).

Kemungkinan besar Anda akan menemukan bahwa Anda perlu mengulangi prosedur dan membuat file kedua untuk mengembalikan jendela ke ukuran kecil.

Semoga ini membantu

nikos
sumber
1
Suka! Saya akan menggunakan mosaik NVidia, tetapi monitor yang ingin saya bagi di mana dari dua kartu grafis yang terpisah, dan tidak dapat recable karena KVM tidak melakukan VGA. Hanya gotchya - Saya tidak bisa mendapatkan pintasan keyboard untuk langsung mematikan pintasan ke file .au3. Saya bisa mendapatkan pintasan keyboard untuk mematikan pintasan ke skrip batch yang disebut skrip au3.
paquetp
1
Memang metode pintas tidak berfungsi, kecuali file skrip ditempatkan di desktop Anda.
Nikos
1
Bagi mereka yang memiliki lebih dari 2 monitor, 0,0 di baris WinMove ($ MyWin, "", 0,0,3840,1165) mewakili koordinat titik awal, sehingga orang dapat memaksimalkan seluruh jumlah layar dengan mengubah angka-angka ini sesuai.
ilakast
Saya harus membuat pintasan untuk memaksimalkan.au3 ini di Win 10, dan properti pintasan biarkan saya menetapkan pintasan kunci; tidak perlu batch.
Martin Zaske
@nikos skrip ini berfungsi untuk saya, tetapi saya tidak dapat mengetahui sintaks untuk posisi windows; Sepertinya 0,0 saya di suatu tempat "dekat" kiri atas monitor utama saya tetapi tidak cukup. Juga monitor kedua saya ada di sebelah kiri monitor utama saya (dan skrip tampaknya memungkinkan untuk itu, tapi saya belum membaca sintaks AutoIt). Tetapi skrip membuka program saya di sebelah kanan monitor utama saya (di mana "tidak ada"). Saya mencoba mengaitkan ke nilai negatif (-1920,0) tapi itu tidak berhasil, angka negatif ditolak. Mohon saran. Jawaban Anda adalah kegembiraan, akan menjadi solusi saya untuk banyak program, hanya perlu belajar lebih banyak
Martin Zaske
9

Jeff Axelrod memiliki solusi hebat yang menggunakan Autohotkey .

Dia memetakan Shift + Windows + Upkombinasi untuk memaksimalkan jendela di semua tampilan, yang memuji Windows + Uptombol pintas Windows 7 , yang memaksimalkan jendela yang dipilih dalam satu monitor.

Ini kodenya (terima kasih 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
sumber
Shift + Windows + Up tidak berfungsi pada pengaturan Windows 10 saya dengan dua layar dan dua driver grafis yang berbeda. Masih berpotensi bermanfaat bagi orang lain.
Martin Zaske
8

Gunakan Dual Monitor Tools : ini adalah seperangkat alat gratis yang mengelola pengaturan beberapa layar.

Di alat Swap layar Anda dapat menetapkan tombol pintas ke "Jendela aktif Supersize" sehingga Anda dapat memaksimalkannya untuk menempati semua layar.

Maks
sumber
2
Program luar biasa dengan default waras (semua dinonaktifkan) yang melakukan persis apa yang saya cari, berasal dari Ultramon. Sebuah petunjuk: tombol pintas ke "Jendela aktif Supersize" berfungsi seperti sakelar. Memukulnya kembali mengembalikan jendela.
Fanis
3

Jika Anda memiliki kartu video nVidia:

  1. Klik kanan pada desktop, dan klik "NVIDIA Control Panel"
  2. Di bagian bawah daftar tugas, di bawah Workstation, adalah "Mengatur Mosaik". Klik itu.
  3. Di panel kanan, klik kotak centang di sebelah "Aktifkan Mosaik"
  4. Di bawah Display, letakkan tanda centang di sebelah monitor yang ingin Anda gabungkan.
  5. Di bawah Konfigurasi, pilih topologi apa yang Anda inginkan (berdampingan, vertikal ..)
  6. Di kanan bawah layar, klik "Terapkan"

Sekarang, ketika Anda mengklik tombol Maksimalkan, itu akan mencakup kedua monitor. Bilah tugas Anda juga akan mencakup kedua monitor. Jika itu mengganggu Anda, coba seret ke kiri monitor sehingga menjadi vertikal (ini berfungsi lebih baik jika Anda membuat ikon kecil dan gunakan 'tidak pernah bergabung').

michaelmoo
sumber
2

Agak terlambat tetapi jika menggunakan grafis terintegrasi Intel Anda dapat membuka panel kontrol grafis Intel, pilih menu tampilan dan dari sana pilih beberapa layar dan pilih "Kolase" ini akan memungkinkan Anda memilih monitor mana yang ingin Anda rentangkan bersama dengan beberapa pilihan lain. .

Berikut tangkapan layar yang diaktifkan:

Berikut screenshot-nya yang diaktifkan

Brad
sumber
1

Klik dan seret, jika tidak, Anda dapat menggunakan kartu grafis canggih untuk mengonfigurasi monitor agar berfungsi sebagai satu layar besar.

Garrett
sumber
0

Di Windows 7 saya, saya bisa menarik jendela sehingga menutupi kedua layar. Jika Anda mengklik kanan desktop Anda dan memilih "resolusi layar", Anda harus memilih "memperpanjang tampilan ini" di bawah "beberapa tampilan". Jika Anda menutup kembali jendela itu harus mengingat ukuran dan posisi.

CGA
sumber
Itu benar, saya sedang mencari solusi di mana Anda dapat dengan mudah memaksimalkan jendela untuk kedua monitor dengan cara pintas atau sesuatu seperti itu.
Crackerjack
Anda tidak dapat melakukannya hanya dengan menyeret bilah judul jendela ke bagian atas layar
subanki
@ Subanki - tidak, itu hanya akan memaksimalkan jendela pada monitor saat ini (yang Anda "bumped")
Chris_K
0

Jika ada yang masih mencoba melakukan ini menggunakan autoit saya berhasil melakukan ini menggunakan kode ini:

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
sumber
Setelah memasukkan WinAPI.au3 dan WindowsConstants.au3 ini berfungsi.
Max Hohenegger
0

Saya menggunakan solusi ini dengan Sizer ( beranda ) - utilitas freeware yang kecil memungkinkan Anda untuk mengatur ukuran windows yang telah ditentukan dengan mengklik kanan di area Window stretch.

Cukup buat set profil:

  • Lebar = jumlah lebar monitor
  • Tinggi = Tinggi monitor - Tinggi bilah tugas (= 40)
  • Pindah ke = Kiri atas.

Kemudian klik kanan ke ujung kanan bawah Window dan pilih profil.

masukkan deskripsi gambar di sini

Lluser
sumber
0

Saya menemukan cara untuk melakukan ini tanpa perangkat lunak atau kode. Ini tidak otomatis atau sempurna, tetapi mudah dan bekerja dengan cukup baik.

  1. Windows + tombol panah kiri atau kanan untuk memasang jendela ke setengah monitor di ujung kedua monitor
  2. Ambil tepi jendela dan seret ke kedua monitor ke sisi yang jauh
pengguna3173663
sumber
0

Klik kanan pada toolbar windows, pilih Restore, lalu ubah ukurannya di kedua layar.

Ali Haider Govani
sumber