Ingat lokasi jendela saat merapat dan tidak terkunci

45

Saya menemukan ini melampaui frustrasi.

Saya memiliki dua layar tambahan di laptop saya di tempat kerja. Saya mengambil laptop saya dan pulang, tanpa layar tambahan yang terhubung. Saya kembali, merapat laptop, dan jendela perlu diatur ulang lagi.

Apakah ada cara untuk mendapatkan windows (atau utilitas) untuk melacak konfigurasi layar secara keseluruhan (#, ukuran, resolusi), dan ingat di mana jendela ditempatkan, jadi ketika konfigurasi layar cocok lagi, itu menempatkan aplikasi KEMBALI di mana mereka berada ?

CaffGeek
sumber
1
Saya mengalami masalah yang sama tetapi keluhan saya adalah ketika saya membuka laptop nanti dan jendela aplikasi masih mati (akhirnya menggunakan tombol panah untuk memindahkannya kembali ke layar). Saya tidak berpikir ada solusi bawaan untuk ini.
Brad Patton

Jawaban:

8

PENOLAKAN: Saya pencipta alat ini.

Saya telah membuat alat kecil untuk mengatur ulang windows pada klik ikon traybar. Anda dapat mengompilasinya dari sumber atau meminta untuk memiliki biner (portabel) melalui tautan masalah.

Di-host di Github: https://github.com/manutalcual/winredock

Saya akan senang mendengar dari Anda jika Anda memiliki saran.

EDIT: 2018/11/22

Ini sepenuhnya otomatis sekarang.

Manuel
sumber
Ini terlihat bagus tetapi saya mencari sesuatu yang lebih otomatis.
Sellorio
3
Saya telah menambahkan fitur otomatisasi karena permintaan pengguna.
Manuel
Perhatikan bahwa versi Master memiliki masalah setidaknya pada Windows 10 dengan desktop virtual. Gunakan cabang yang disebut I0010-memulihkan-posisi-tidak-berfungsi
HansHarhoff
Saya telah menggabungkan cabang I0010-memulihkan-posisi-tidak-berfungsi menjadi master, jadi sekarang kita mungkin bekerja lebih baik
Manuel
1
Ini fantastis! Ini bekerja sangat baik pada percobaan pertama! Terimakasih telah membuat ini!
BT
6

Saat ini saya menggunakan DisplayFusion Pro untuk lokasi jendela (tidak hanya). Saya tidak tahu bagaimana ini bekerja ketika Anda melepaskan dan menghubungkan monitor Anda - Saya punya tiga selalu.

Saya pikir, Anda harus menutup dan membuka kembali aplikasi Anda untuk diatur ulang.

Sunting: Fitur ini hanya tersedia dalam versi Pro. - Informasi dari komentar.

tangkapan layar pengaturan

beranda DisplayFusion

Wild_A
sumber
2
FYI, fitur Lokasi Jendela muncul untuk menyelesaikan permintaan saya. Perlu dicatat kepada siapa pun bahwa ini adalah versi PRO yang memerlukan lisensi yang dibeli.
MADCookie
Lihat fitur "Simpan atau Kembalikan semua lokasi jendela" di Perbandingan Fitur untuk Gratis vs. Pro. Sayangnya solusi termurah adalah $ 25.
Chiramisu
1
Apakah ini berfungsi ketika Anda memiliki beberapa desktop virtual asli di Windows 10?
K Robinson
2

Masalahnya adalah aplikasi Windows tidak benar-benar melihat banyak monitor. Manajer jendela melacak posisi jendela mengacu pada sudut Kiri-Atas atau tampilan utama Anda. Saya tidak mengetahui adanya aplikasi komersial yang melakukannya, tetapi Anda dapat menulis aplikasi dalam C # atau bahkan VB.NET yang dapat menulis nilai-nilai ini ke file dan mengembalikannya nanti, tetapi tidak akan ada "pemicu" untuk itu. Anda harus memberi tahu program kapan harus menyimpan dan mengambil data secara manual.

Tuan Mascaro
sumber
2

Coba skrip ini, ditulis untuk Excel. Ini menyimpan posisi jendela dalam lembaran dan mengembalikannya dari sana. Anda mungkin memiliki tombol di salah satu lembar untuk menjalankan toko dan mengembalikan makro, atau pintasan ke skrip VBS yang menjalankan makro Excel, mungkin dengan tombol pintasan yang ditetapkan. Dengan begitu buku kerja Excel dapat tetap diminimalkan. Tentu saja sesuatu yang serupa dapat ditulis dalam program yang dikompilasi.

Public Declare PtrSafe Function GetWindowPlacement Lib "user32" (ByVal hwnd As LongPtr, lpwndpl As WINDOWPLACEMENT) As Long
Public Declare PtrSafe Function SetWindowPlacement Lib "user32" (ByVal hwnd As LongPtr, lpwndpl As WINDOWPLACEMENT) As Long

Public Declare PtrSafe Function GetWindow Lib "user32.dll" (ByVal hwnd As Long, ByVal wCmd As Long) As Long

Public Declare PtrSafe Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Public Declare PtrSafe Function IsWindowVisible Lib "user32.dll" (ByVal hwnd As Long) As Boolean
Public Declare PtrSafe Function GetParent Lib "user32.dll" (ByVal hwnd As Long) As Long
Public Declare PtrSafe Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As LongPtr, ByVal lpString As String, ByVal cch As LongPtr) As Long

Public Type POINTAPI
X As Long
Y As Long
End Type

Public Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type

Public Type WINDOWPLACEMENT
Length As Long
    flags As Long
    showCmd As Long
    MinPosition As POINTAPI
    MaxPosition As POINTAPI
    rcNormalPosition As RECT
End Type

Global Const gw_hwndnext = 2
Global Const fwp_startswith = 0
Global Const fwp_contains = 1
Global title As String
Global Visible As Boolean
Global RowCount
Public prog As String


Public Sub StoreActiveWindows()
    Dim hwndapp As Long
    Dim hwndmax As Long
    Dim nret As Long
    Dim WinFrm As WINDOWPLACEMENT
    Dim RectFrm As RECT

    PleaseWait.Show vbModeless
    DoEvents

    RowCount = 1
    hwndmax = findwindow(0&, 0&)
    Do Until hwndmax = 0
    hwndapp = findthiswindow(hwndmax)
    If hwndapp Then
        If title <> "CURRENT WINDOWS OPEN" And Visible Then
            rtn = GetWindowPlacement(hwndapp, WinFrm)

            RectFrm = WinFrm.rcNormalPosition

            FrmTop = RectFrm.Top
            FrmRight = RectFrm.Right
            FrmLeft = RectFrm.Left
            FrmBottom = RectFrm.Bottom
            Workbooks(Filename).Activate
            Workbooks(Filename).Sheets("Active Windows").Cells(RowCount, 1) = title
            Workbooks(Filename).Sheets("Active Windows").Cells(RowCount, 2) = hwndapp
            Workbooks(Filename).Sheets("Active Windows").Cells(RowCount, 3) = FrmTop
            Workbooks(Filename).Sheets("Active Windows").Cells(RowCount, 4) = FrmRight
            Workbooks(Filename).Sheets("Active Windows").Cells(RowCount, 5) = FrmLeft
            Workbooks(Filename).Sheets("Active Windows").Cells(RowCount, 6) = FrmBottom
            Workbooks(Filename).Sheets("Active Windows").Cells(RowCount, 7) = WinFrm.MaxPosition.X
            Workbooks(Filename).Sheets("Active Windows").Cells(RowCount, 8) = WinFrm.MaxPosition.Y
            Workbooks(Filename).Sheets("Active Windows").Cells(RowCount, 9) = WinFrm.MinPosition.X
            Workbooks(Filename).Sheets("Active Windows").Cells(RowCount, 10) = WinFrm.MinPosition.Y
            Workbooks(Filename).Sheets("Active Windows").Cells(RowCount, 11) = WinFrm.showCmd
            Workbooks(Filename).Sheets("Active Windows").Cells(RowCount, 12) = WinFrm.flags
            Workbooks(Filename).Sheets("Active Windows").Cells(RowCount, 13) = WinFrm.Length
            RowCount = RowCount + 1
        End If
    End If
    hwndmax = GetWindow(hwndmax, gw_hwndnext)
    Loop
            Workbooks(Filename).Sheets("Active Windows").Cells(RowCount, 1) = ""
            Workbooks(Filename).Sheets("Active Windows").Cells(RowCount, 2) = ""
            Workbooks(Filename).Sheets("Active Windows").Cells(RowCount, 3) = ""
            Workbooks(Filename).Sheets("Active Windows").Cells(RowCount, 4) = ""
            Workbooks(Filename).Sheets("Active Windows").Cells(RowCount, 5) = ""
            Workbooks(Filename).Sheets("Active Windows").Cells(RowCount, 6) = ""
            Workbooks(Filename).Sheets("Active Windows").Cells(RowCount, 7) = ""
            Workbooks(Filename).Sheets("Active Windows").Cells(RowCount, 8) = ""
            Workbooks(Filename).Sheets("Active Windows").Cells(RowCount, 9) = ""
            Workbooks(Filename).Sheets("Active Windows").Cells(RowCount, 10) = ""
            Workbooks(Filename).Sheets("Active Windows").Cells(RowCount, 11) = ""
            Workbooks(Filename).Sheets("Active Windows").Cells(RowCount, 12) = ""
            Workbooks(Filename).Sheets("Active Windows").Cells(RowCount, 13) = ""

    Unload PleaseWait

End Sub

Public Function findthiswindow(ByVal hwndtopmost As Long) As Long
    Dim hwndtmp As Long
    Dim nret As Long
    Dim titletmp As String

    'Get the first window
    hwndtmp = hwndtopmost

    If GetParent(hwndtmp) = 0 Then
        'Set its visibility
        If IsWindowVisible(hwndtmp) Then
            Visible = True
        Else
            Visible = False
        End If
        'Get its title
        titletmp = Space(256)
        nret = GetWindowText(hwndtmp, titletmp, Len(titletmp))
        If nret Then
            findthiswindow = hwndtmp
        End If
    End If

    If Visible Then
        title = titletmp & " - Visible"
        Else
        title = titletmp & " - Invisible"
        End If
        title = titletmp
        If titletmp <> "" Then

        'If title = "SETTINGS" Then
            HasNoOWner = Not (GetWindow(hwndtmp, 4))
            n = 1
        'End If

        If (UCase(Left(title, 15)) = "PROGRAM MANAGER" Or UCase(title) = "SETTINGS") Then
            n = 1
            title = ""
            findthiswindow = 0
        End If
    End If
End Function

Sub RestoreWindowsLocations()
    Dim WinFrm As WINDOWPLACEMENT
    Dim RectFrm As RECT

    PleaseWait.Show vbModeless
    DoEvents

    Workbooks(Filename).Activate

    RowCount = 1
    Do Until Workbooks(Filename).Sheets("Active Windows").Cells(RowCount, 1) = ""
        hwndapp = Workbooks(Filename).Sheets("Active Windows").Cells(RowCount, 2)
'       rtn = GetWindowPlacement(hwndapp, WinFrm)
        WinFrm.rcNormalPosition.Top = CLng(Workbooks(Filename).Sheets("Active Windows").Cells(RowCount, 3))
        WinFrm.rcNormalPosition.Right = CLng(Workbooks(Filename).Sheets("Active Windows").Cells(RowCount, 4))
        WinFrm.rcNormalPosition.Left = CLng(Workbooks(Filename).Sheets("Active Windows").Cells(RowCount, 5))
        WinFrm.rcNormalPosition.Bottom = CLng(Workbooks(Filename).Sheets("Active Windows").Cells(RowCount, 6))
        WinFrm.MaxPosition.X = CLng(Workbooks(Filename).Sheets("Active Windows").Cells(RowCount, 7))
        WinFrm.MaxPosition.Y = CLng(Workbooks(Filename).Sheets("Active Windows").Cells(RowCount, 8))
        WinFrm.MinPosition.X = CLng(Workbooks(Filename).Sheets("Active Windows").Cells(RowCount, 9))
        WinFrm.MinPosition.Y = CLng(Workbooks(Filename).Sheets("Active Windows").Cells(RowCount, 10))
        WinFrm.showCmd = CLng(Workbooks(Filename).Sheets("Active Windows").Cells(RowCount, 11))
        WinFrm.flags = CLng(Workbooks(Filename).Sheets("Active Windows").Cells(RowCount, 12))
        WinFrm.Length = CLng(Workbooks(Filename).Sheets("Active Windows").Cells(RowCount, 13))

        rtn = SetWindowPlacement(hwndapp, WinFrm)
        rtn = SetWindowPlacement(hwndapp, WinFrm)

        RowCount = RowCount + 1

    Loop
    Unload PleaseWait
End Sub
Maks
sumber
Tolong jelaskan apa yang harus dilakukan dan bersihkan serta format seluruh blok kode dengan benar karena sulit dibaca apa adanya.
Pimp Juice,
Dan bisakah Anda menjelaskan cara membuat skrip VBS yang menjalankan makro Excel? Bagaimana sesuatu yang serupa dapat ditulis ke dalam program yang dikompilasi?
G-Man Mengatakan 'Reinstate Monica'
Ini merupakan pendekatan yang menarik. Sudahkah Anda sendiri menggunakannya? Saya yakin banyak orang akan mendapat manfaat jika Anda dapat membuat sampel kerja ujung ke ujung
Miserable Variable
1

Yang ini tampak menjanjikan: https://github.com/adamsmith/WindowsLayoutSnapshot

Sayangnya dalam kasus saya, ketika menyimpan tata letak pada monitor 1920x1200 3x24 ", berubah menjadi satu laptop 1920x1080, dan kemudian kembali ke tiga dan mencoba mengembalikan tata letak, windows tidak benar-benar pindah ke monitor lain. Tapi mungkin untuk orang lain di setup lain itu akan berfungsi.

Koshmaar
sumber
Terlihat menjanjikan, tetapi itu tidak akan berjalan di PC saya (Windows 8.1)
Dunc
Sayangnya dihentikan, dan ia kehilangan semua konfigurasi ketika program ditutup atau PC dihidupkan ulang, yang penulis tidak berencana untuk memperbaikinya.
laurent
Versi baru tersedia di sini - github.com/nefarius/WindowsLayoutSnapshot . Bekerja dengan sempurna di win10!
Max Lazar
1

Berikut adalah aplikasi konsol untuk menyimpan dan memulihkan lokasi jendela dan menyatakan pada Desktop Windows. Untuk menyimpan lokasi windows jalankan:

  winLayout save

untuk mengembalikan posisi windows run:

  winLayout restore

Masukkan perintah-perintah ini ke dalam shortcut Desktop dan pin ke Taskbar untuk kenyamanan.

Penafian: Saya menulis utilitas ini karena alat lain pada halaman ini tidak berfungsi untuk saya.

Peringatan: Ini berfungsi untuk aplikasi, tetapi tidak untuk windows explorer (saat ini)

Phillip Ngan
sumber
0

Saya telah menggunakan Pagar Stardock sebelumnya dalam skenario yang sama:

Pagar membantu Anda mengatur PC Anda dengan secara otomatis menempatkan pintasan dan ikon Anda ke area teduh yang dapat diubah ukurannya di desktop yang disebut pagar. Banyak fitur penyesuaiannya yang menjadikan Pagar peningkatan desktop Windows paling populer di dunia.

Pete Q
sumber
8
Itu mengatur ikon. Bukan windows. Masalah saya adalah bahwa saya memiliki 8 program terbuka di tiga layar. Ketika saya menutup laptop, dan membukanya kembali dengan tiga layar, semua jendela aplikasi saya terbuka pada satu layar, tidak diatur bagaimana saya memilikinya.
CaffGeek
0

Banyak pengguna windows memiliki masalah ini, aplikasi dikembangkan dan dibagikan dalam forum windows 7 seperti yang ditunjukkan di sini:

http://www.sevenforums.com/free-developer-programs-projects/40916-shellfolderfix-manage-folder-window-positions-size.html#post396744 

Ada instruksi di situs yang membantu dan itu harus memperbaiki masalah Anda.

DarkEvE
sumber
Forum tersebut mengatakan "Ini adalah aplikasi untuk membuat Windows 7 folder folder explorer mengingat ukuran dan posisinya" dan "Ini TIDAK mengelola ukuran / posisi jendela aplikasi biasa, jika Anda menginginkannya, aplikasi lain seperti Window Manager melakukannya". Apa yang dimaksud dengan Window Manager ? Apakah itu layanan Microsoft Windows Manager atau produk dari tautan
MADCookie
ya itu adalah produk dari DeskSoft
DarkEvE