Zapamiętaj lokalizacje okien po zadokowaniu i oddokowaniu

45

Uważam to za frustrujące.

Mam dwa dodatkowe ekrany na laptopie w pracy. Biorę laptopa i wracam do domu bez podłączonych dodatkowych ekranów. Wracam, zadokowuję laptopa, a okna trzeba znów przestawiać.

Czy istnieje sposób na uzyskanie systemu Windows (lub narzędzia) do śledzenia ogólnej konfiguracji ekranu (#, rozmiar, rozdzielczość) i zapamiętywania, gdzie zostały umieszczone okna, więc gdy konfiguracja ekranu ponownie się dopasuje, spowoduje to przywrócenie aplikacji Z POWROTEM tam, gdzie były ?

CaffGeek
źródło
1
Mam ten sam problem, ale moja skarga dotyczy tego, że później otwieram laptopa, a okno aplikacji jest nadal poza ekranem (w końcu używam klawiszy strzałek, aby przenieść go z powrotem na ekran). Nie sądzę, że istnieje wbudowane rozwiązanie tego problemu.
Brad Patton

Odpowiedzi:

8

ZASTRZEŻENIE: Jestem twórcą tego narzędzia.

Stworzyłem małe narzędzie do zmiany układu okien po kliknięciu ikony paska zadań. Możesz skompilować go ze źródła lub poprosić o (przenośny) plik binarny za pośrednictwem linku problemów.

Jest hostowany na Github: https://github.com/manutalcual/winredock

Z przyjemnością usłyszę od ciebie, jeśli masz sugestie.

EDYCJA: 2018/11/22

Jest teraz w pełni zautomatyzowany.

Manuel
źródło
Wygląda to ładnie, ale szukam czegoś bardziej automatycznego.
Sellorio
3
Dodałem funkcję automatyzacji z powodu żądań użytkowników.
Manuel
Należy pamiętać, że wersja Master ma problemy przynajmniej z Windows 10 z wirtualnymi pulpitami. Skorzystaj z oddziału o nazwie I0010-restoring-position-doesnt-work
HansHarhoff
Połączyłem gałąź I0010-przywracanie-pozycji-nie-działa w master, więc teraz możemy pracować lepiej
Manuel
1
To jest fantastyczne! Działa bardzo dobrze za pierwszym razem! Dziękujemy za zrobienie tego!
BT
6

Obecnie używam DisplayFusion Pro do lokalizacji okna (nie tylko). Nie wiem, jak to działa po odłączeniu i podłączeniu monitora - zawsze mam trzy.

Myślę, że musisz zamknąć i ponownie otworzyć swoje aplikacje, aby je zmienić.

Edycja: Ta funkcja jest dostępna tylko w wersji Pro. - Informacje z komentarzy.

zrzut ekranu ustawień

strona główna DisplayFusion

Wild_A
źródło
2
Do Twojej wiadomości, funkcja lokalizacji okna wydaje się rozwiązać mój wniosek. Należy zauważyć, że jest to wersja PRO wymagająca zakupionej licencji.
MADCookie
Zobacz funkcję „Zapisz lub przywróć wszystkie lokalizacje okien” w Porównanie funkcji programów Free vs. Pro. Niestety najtańsze rozwiązanie to 25 USD.
Chiramisu,
1
Czy to działa, gdy masz wiele rodzimych wirtualnych pulpitów w systemie Windows 10?
K Robinson,
2

Problem polega na tym, że aplikacje Windows tak naprawdę nie widzą wielu monitorów. Menedżer okien śledzi pozycje okien w odniesieniu do lewego górnego rogu lub głównego ekranu. Nie znam żadnych takich aplikacji komercyjnych, ale możesz napisać aplikację w C # lub nawet VB.NET, która mogłaby zapisać te wartości do pliku i przywrócić je później, ale nie byłoby dla niego „wyzwalacza”. Będziesz musiał powiedzieć programowi, kiedy ręcznie zapisać i pobrać dane.

Pan Mascaro
źródło
2

Wypróbuj ten skrypt napisany dla programu Excel. Przechowuje pozycje okna w arkuszu i przywraca je stamtąd. Na jednym z arkuszy mogą znajdować się przyciski do uruchamiania sklepu i przywracania makr lub skróty do skryptów VBS, które uruchamiają makra Excel, być może z przypisanymi klawiszami skrótów. W ten sposób skoroszyt programu Excel może pozostać zminimalizowany. Oczywiście coś podobnego można napisać w skompilowanym programie.

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
Max
źródło
Wyjaśnij, co to ma zrobić, wyczyść i odpowiednio sformatuj cały blok kodu, ponieważ trudno go odczytać w obecnej postaci.
Pimp Juice IT
I czy możesz wyjaśnić, jak mieć skrypty VBS, które uruchamiają makra Excel? Jak coś podobnego można zapisać w skompilowanym programie?
G-Man mówi „Przywróć Monikę”
To interesujące podejście. Czy sam go używasz? Jestem pewien, że wiele osób skorzystałoby, gdybyś mógł stworzyć kompleksową próbkę roboczą
Nędzna zmienna
1

Ten wyglądał obiecująco: https://github.com/adamsmith/WindowsLayoutSnapshot

Niestety w moim przypadku podczas zapisywania układu na monitorach 3x 24 "1920x1200, zmiany na jeden laptop 1920x1080, a następnie powrotu do trzech i próby przywrócenia układu, okna tak naprawdę nie przeniosły się na inne monitory. Ale może dla kogoś innego na inna konfiguracja będzie działać.

Kosmaar
źródło
Wygląda obiecująco, ale nie będzie działać na moim komputerze (Windows 8.1)
Dunc
Niestety został przerwany i traci całą konfigurację po zamknięciu programu lub ponownym uruchomieniu komputera, czego autor nie planuje naprawić.
laurent
Nowa wersja dostępna tutaj - github.com/nefarius/WindowsLayoutSnapshot . Działa idealnie na win10!
Max Lazar,
1

Oto aplikacja konsoli do zapisywania i przywracania lokalizacji i stanów okien na pulpicie Windows. Aby zapisać lokalizacje systemu Windows, uruchom:

  winLayout save

aby przywrócić pozycje systemu Windows uruchom:

  winLayout restore

Umieść te polecenia w skrócie na pulpicie i przypnij do paska zadań dla wygody.

Oświadczenie: Napisałem to narzędzie, ponieważ inne narzędzia na tej stronie nie działały dla mnie.

Zastrzeżenie: Działa dla aplikacji, ale nie dla okien eksploratora (obecnie)

Phillip Ngan
źródło
0

Użyłem Płotów Stardocka wcześniej w podobnym scenariuszu:

Ogrodzenia pomagają uporządkować komputer, automatycznie umieszczając skróty i ikony w cieniowanych obszarach o zmiennym rozmiarze, nazywanych ogrodzeniami. Liczne funkcje dostosowywania sprawiają, że Fences jest najpopularniejszym na świecie rozszerzeniem pulpitu Windows.

Pete Q
źródło
8
To układa ikony. Nie Windows. Mój problem polega na tym, że mam 8 programów otwartych na trzech ekranach. Kiedy zamykam laptopa i otwieram go ponownie za pomocą trzech ekranów, wszystkie moje okna aplikacji są otwarte na jednym ekranie, a nie tak, jak je miałem.
CaffGeek
0

Wiele użytkowników systemu Windows miało ten problem, aplikacja została opracowana i udostępniona na forach Windows 7, jak pokazano tutaj:

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

Na stronie znajdują się instrukcje, które powinny pomóc rozwiązać problem.

DarkEvE
źródło
Forum mówi: „Jest to aplikacja, dzięki której okna folderów eksploratora Windows 7 zapamiętują ich rozmiar i pozycję” oraz „NIE zarządza rozmiarem / pozycjami okien zwykłych aplikacji, jeśli tego chcesz, robią to inne aplikacje, takie jak Menedżer okien ”. Co oznacza Menedżer okien ? Czy to usługa Microsoft Windows Manager lub produkt z linku
DeskSoft
tak, to produkt DeskSoft
DarkEvE