Помните места окна, когда состыкованы и отстыкованы

45

Я нахожу это за пределами разочарования.

У меня на ноутбуке два дополнительных экрана на работе. Я беру свой ноутбук и иду домой, без дополнительных подключенных экранов. Я возвращаюсь, док-ноутбук, и окна должны быть переставлены.

Есть ли способ получить окна (или утилиту), чтобы отслеживать общую конфигурацию экрана (#, размер, разрешение) и помнить, где были размещены окна, поэтому, когда конфигурация экрана снова совпадает, это ставит приложения НАЗАД, где они были ?

CaffGeek
источник
1
Я сталкиваюсь с той же проблемой, но моя жалоба возникает, когда я позже открываю ноутбук, а окно приложения все еще остается за кадром (в конечном итоге, используя клавиши со стрелками, чтобы вернуть его обратно на экран). Я не думаю, что есть встроенное решение для этого.
Брэд Паттон

Ответы:

8

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я создатель этого инструмента.

Я создал небольшой инструмент для перестановки окон по щелчку значка на панели задач. Вы можете скомпилировать его из исходного кода или попросить иметь (переносимый) двоичный файл по ссылке проблем.

Он размещен на Github: https://github.com/manutalcual/winredock

Я был бы рад услышать от вас, если у вас есть предложения.

РЕДАКТИРОВАТЬ: 2018/11/22

Теперь он полностью автоматизирован.

Manuel
источник
Это выглядит красиво, но я ищу что-то более автоматическое.
Селлорио
3
Я добавил функцию автоматизации из-за пользовательских запросов.
Мануэль
Обратите внимание, что версия в Master имеет проблемы по крайней мере в Windows 10 с виртуальными рабочими столами. Используйте ветку под названием I0010-restoring-позиции-не работает
HansHarhoff
Я слил ветку I0010-restoring-позиции-not-work в master, так что теперь мы можем работать лучше
Мануэль
1
Это фантастика! Это работает очень хорошо с первой попытки! Спасибо за это!
BT
6

В настоящее время я использую DisplayFusion Pro для расположения окна (не только). Я не знаю, как это работает, когда вы отключаете и подключаете свой монитор - у меня всегда три.

Я думаю, что вы должны закрыть и снова открыть свои приложения, чтобы перестроить.

Редактировать: эта функция доступна только в Pro версии. - Информация из комментариев.

скриншот настроек

домашняя страница DisplayFusion

Wild_A
источник
2
К вашему сведению, функция «Расположение окна» появляется для решения моего запроса. Следует отметить, что это ПРО-версия, требующая приобретенной лицензии.
MADCookie
См. Функцию «Сохранить или восстановить все местоположения окон» в Сравнении функций « Бесплатно против Pro». К сожалению, самое дешевое решение - 25 долларов.
Тирамису
1
Это работает, когда у вас есть несколько собственных виртуальных рабочих столов в Windows 10?
К Робинсон
2

Проблема в том, что приложения Windows на самом деле не видят несколько мониторов. Диспетчер окон отслеживает положение окон относительно верхнего левого угла или вашего основного дисплея. Я не знаю ни одного коммерческого приложения, которое бы это делало, но вы могли бы написать приложение на C # или даже на VB.NET, которое могло бы записать эти значения в файл и восстановить их позже, но для этого не было бы «триггера». Вы должны указать программе, когда сохранять и извлекать данные вручную.

Мистер Маскаро
источник
2

Попробуйте этот скрипт, написанный для Excel. Он сохраняет позиции окна на листе и восстанавливает их оттуда. У вас могут быть кнопки на одном из листов для запуска сохранения и восстановления макросов или ярлыки для сценариев VBS, которые запускают макросы Excel, возможно, с назначенными сочетаниями клавиш. Таким образом, книга Excel может быть сведена к минимуму. Конечно, нечто подобное может быть написано в скомпилированной программе.

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
Максимум
источник
Пожалуйста, объясните, что это должно делать, очистите и отформатируйте весь блок кода, так как его трудно прочитать как есть.
Сок Pimp IT
А можете ли вы объяснить, как использовать VBS-скрипты, которые запускают макросы Excel? Как можно записать нечто подобное в скомпилированную программу?
G-Man говорит: «Восстановите Монику»
Это интересный подход. Вы сами этим пользуетесь? Я уверен, что многие люди выиграют, если вы сможете создать сквозной рабочий образец
Miserable Variable
1

Это выглядело многообещающе: https://github.com/adamsmith/WindowsLayoutSnapshot

К сожалению, в моем случае, при сохранении макета на 3х 24 "мониторах 1920x1200, изменении на один ноутбук 1920x1080, а затем возвращаясь к трем и пытаясь восстановить компоновку, окна на самом деле не перемещались на другие мониторы. Но, возможно, для кого-то еще на другие настройки это будет работать.

Koshmaar
источник
Выглядит многообещающим, но это не будет работать на моем компьютере (Windows 8.1)
Dunc
К сожалению, прекращено и теряет все настройки, когда программа закрывается или перезагружается компьютер, что автор не планирует исправлять.
Лоран
Новая версия доступна здесь - github.com/nefarius/WindowsLayoutSnapshot . Отлично работает на win10!
Макс Лазар
1

Вот консольное приложение для сохранения и восстановления расположения и состояний окон на рабочем столе Windows. Чтобы сохранить расположение окон, выполните:

  winLayout save

для восстановления положения окон выполните:

  winLayout restore

Поместите эти команды в ярлык на рабочем столе и закрепите их на панели задач для удобства.

Отказ от ответственности: я написал эту утилиту, потому что другие инструменты на этой странице не работают для меня.

Предостережение: работает для приложений, но не для окон проводника (в настоящее время)

Филипп Нган
источник
0

Я уже использовал Stardock's Fences в похожем сценарии:

Заборы помогают организовать ваш компьютер, автоматически помещая ярлыки и значки в изменяемые размеры затененных областей на рабочем столе, которые называются заборами. Благодаря многочисленным функциям настройки, Fences - самое популярное в мире расширение для Windows.

Пит Q
источник
8
Это устраивает иконки. Не окна. Моя проблема в том, что у меня есть 8 открытых программ на трех экранах. Когда я закрываю ноутбук и снова открываю его с тремя экранами, все окна моего приложения открываются на одном экране, а не так, как у меня.
CaffGeek
0

У многих пользователей Windows была эта проблема, приложение было разработано и распространено на форумах Windows 7, как показано здесь:

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

На сайте есть инструкции, которые помогут вам решить проблему.

DarkEvE
источник
На форуме говорится: «Это приложение для того, чтобы окна папок проводника Windows 7 запомнили их размер и положение» и «Он НЕ управляет размером / положением окон обычных приложений, если вы этого хотите, другие приложения, такие как Window Manager, делают это». Что подразумевается под оконным менеджером ? Это служба Microsoft Windows Manager или продукт по ссылке
DeskSoft
да, это продукт от DeskSoft
DarkEvE