Ghi nhớ vị trí cửa sổ khi cập cảng và tháo chốt


45

Tôi thấy điều này vượt quá bực bội.

Tôi có hai màn hình phụ trên máy tính xách tay của tôi tại nơi làm việc. Tôi cầm laptop và về nhà, không có màn hình phụ nào được kết nối. Tôi trở lại, cập bến máy tính xách tay và các cửa sổ cần được sắp xếp lại.

Có cách nào để có được các cửa sổ (hoặc một tiện ích) để theo dõi cấu hình màn hình tổng thể (#, kích thước, độ phân giải) và nhớ vị trí các cửa sổ được đặt không, vì vậy khi cấu hình màn hình khớp lại, nó sẽ đặt các ứng dụng TRỞ LẠI ?


1
Tôi gặp vấn đề tương tự nhưng khiếu nại của tôi là khi tôi mở máy tính xách tay sau đó và cửa sổ ứng dụng vẫn ở ngoài màn hình (cuối cùng sử dụng các phím mũi tên để di chuyển trở lại màn hình). Tôi không nghĩ có một giải pháp tích hợp cho việc này.
Brad Patton

Câu trả lời:


8

TUYÊN BỐ TỪ CHỐI: Tôi là người tạo ra công cụ này.

Tôi đã tạo một công cụ nhỏ để sắp xếp lại các cửa sổ khi nhấp vào biểu tượng thanh khay. Bạn có thể biên dịch nó từ nguồn hoặc yêu cầu có nhị phân (di động) thông qua liên kết các vấn đề.

Nó được lưu trữ tại Github: https://github.com/manutalcual/winredock

Tôi sẽ rất vui khi được nghe từ bạn nếu bạn có gợi ý.

EDIT: 2018/11/22

Nó hoàn toàn tự động bây giờ.


Điều này có vẻ tốt nhưng tôi đang tìm kiếm một cái gì đó tự động hơn.
Sellorio

3
Tôi đã thêm tính năng tự động hóa do yêu cầu của người dùng.
Manuel

Lưu ý rằng phiên bản trong Master có vấn đề ít nhất trên Windows 10 với máy tính để bàn ảo. Sử dụng chi nhánh được gọi là I0010-khôi phục vị trí-không hoạt động
HansHarhoff

Tôi đã sáp nhập chi nhánh I0010-khôi phục vị trí-không hoạt động thành chủ, vì vậy bây giờ chúng tôi có thể làm việc tốt hơn
Manuel

1
Cái này thật tuyệt! Nó hoạt động siêu tốt trong lần thử đầu tiên! Cảm ơn bạn đã làm điều này!
BT

6

Tôi hiện đang sử dụng DisplayFusion Pro cho vị trí cửa sổ (không chỉ). Tôi không biết làm thế nào điều này hoạt động khi bạn ngắt kết nối và kết nối màn hình của bạn - tôi luôn có ba cái.

Tôi nghĩ rằng bạn phải đóng và mở lại các ứng dụng của mình để được sắp xếp lại.

Chỉnh sửa: Đây là tính năng chỉ có trong phiên bản Pro. - Thông tin từ ý kiến.

ảnh chụp màn hình của cài đặt

trang chủ của DisplayFusion


2
FYI, tính năng Window Location xuất hiện để giải quyết yêu cầu của tôi. Cần lưu ý với bất kỳ ai khác rằng đây là phiên bản PRO yêu cầu giấy phép đã mua.
MADCookie

Xem tính năng "Lưu hoặc khôi phục tất cả các vị trí cửa sổ" trong So sánh tính năng miễn phí so với Pro. Thật không may, giải pháp rẻ nhất là 25 đô la.
Chiramisu

1
Điều này có hoạt động khi bạn có nhiều máy tính để bàn ảo trong Windows 10 không?
K Robinson

2

Vấn đề là các ứng dụng Windows không thực sự nhìn thấy nhiều màn hình. Trình quản lý cửa sổ theo dõi các vị trí cửa sổ tham chiếu đến góc trên cùng bên trái hoặc màn hình chính của bạn. Tôi không biết về bất kỳ ứng dụng thương mại nào, nhưng bạn có thể viết một ứng dụng bằng C # hoặc thậm chí VB.NET có thể ghi các giá trị này vào một tệp và khôi phục chúng sau đó, nhưng sẽ không có "trình kích hoạt" nào cho nó. Bạn sẽ phải thông báo cho chương trình khi nào lưu trữ và truy xuất dữ liệu theo cách thủ công.


2

Hãy thử tập lệnh này, được viết cho Excel. Nó lưu trữ các vị trí cửa sổ trong một tờ và khôi phục chúng từ đó. Bạn có thể có các nút trên một trong các trang tính để chạy cửa hàng và khôi phục macro hoặc các phím tắt cho tập lệnh VBS chạy macro Excel, có thể có các phím tắt được gán. Bằng cách đó, sổ làm việc Excel có thể vẫn được giảm thiểu. Tất nhiên một cái gì đó tương tự có thể được viết trong một chương trình biên dịch.

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

Vui lòng giải thích những gì cần phải làm và dọn dẹp và định dạng toàn bộ khối mã một cách chính xác vì nó khó đọc như hiện tại.
Pimp Juice IT

Và bạn có thể giải thích làm thế nào để có các tập lệnh VBS chạy macro Excel không? Làm thế nào một cái gì đó tương tự có thể được viết vào một chương trình biên dịch?
G-Man nói 'Tái lập Monica'

Đây là một cách tiếp cận thú vị. Bạn đã sử dụng nó? Tôi chắc chắn rằng nhiều người sẽ được hưởng lợi nếu bạn có thể tạo một mẫu làm việc từ đầu đến cuối
Biến đổi khổ sở

1

Điều này đã được hứa hẹn: https://github.com/adamsmith/WindowsLayoutSnapshot

Thật không may trong trường hợp của tôi, khi lưu bố cục trên màn hình 3x 24 "1920x1200, đổi sang một máy tính xách tay 1920x1080, sau đó quay lại ba và cố gắng khôi phục bố cục, các cửa sổ không thực sự chuyển sang màn hình khác. thiết lập khác nó sẽ hoạt động.


Có vẻ đầy hứa hẹn, nhưng điều đó sẽ không chạy trên PC của tôi (Windows 8.1)
Dunc

Không may bị ngừng và nó mất tất cả cấu hình khi chương trình bị đóng hoặc PC được khởi động lại, điều mà tác giả không có kế hoạch sửa chữa.
laurent

Phiên bản mới có sẵn tại đây - github.com/nefarius/WindowsLayoutSnapshot . Hoạt động hoàn hảo trên win10!
Max Lazar

1

Đây là một ứng dụng giao diện điều khiển để lưu và khôi phục các vị trí và trạng thái cửa sổ trên Màn hình Windows. Để lưu vị trí cửa sổ chạy:

  winLayout save

để khôi phục vị trí cửa sổ chạy:

  winLayout restore

Đặt các lệnh này vào phím tắt trên Desktop và ghim vào Thanh tác vụ để thuận tiện.

Tuyên bố miễn trừ trách nhiệm: Tôi đã viết tiện ích này vì các công cụ khác trên trang này không hoạt động với tôi.

Hãy cẩn thận: Nó hoạt động cho các ứng dụng, nhưng không phải là windows explorer (hiện tại)


0

Tôi đã sử dụng hàng rào của Stardock trước đây trong một kịch bản tương tự:

Hàng rào giúp bạn sắp xếp PC của bạn bằng cách tự động đặt các phím tắt và biểu tượng của bạn vào các khu vực bóng mờ có thể thay đổi kích thước trên màn hình của bạn được gọi là hàng rào. Nhiều tính năng tùy biến của nó là những gì làm cho Fences trở thành máy tính để bàn Windows phổ biến nhất thế giới.


8
Điều đó sắp xếp các biểu tượng. Không phải cửa sổ. Vấn đề của tôi là tôi có 8 chương trình mở trên ba màn hình. Khi tôi đóng máy tính xách tay và mở lại bằng ba màn hình, tất cả các cửa sổ ứng dụng của tôi đều mở trên một màn hình, không được sắp xếp như thế nào tôi có chúng.
CaffGeek

0

Rất nhiều người dùng windows gặp phải vấn đề này, một ứng dụng đã được phát triển và chia sẻ trong các diễn đàn của windows 7 như được hiển thị ở đây:

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

Có hướng dẫn trên trang web giúp và nó sẽ khắc phục vấn đề của bạn.


Diễn đàn nói "Đây là một ứng dụng để làm cho các cửa sổ thư mục Windows 7 explorer nhớ kích thước và vị trí của chúng" và "Nó KHÔNG quản lý kích thước cửa sổ / vị trí của các ứng dụng thông thường, nếu bạn muốn điều đó, các ứng dụng khác như Window Manager sẽ làm điều đó". Window Manager có nghĩa là gì? Đó có phải là dịch vụ Microsoft Windows Manager hoặc sản phẩm từ liên kết
MADCookie

vâng, nó là sản phẩm từ DeskSoft
DarkEvE
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.