Запам’ятайте місця розташування вікон, коли вони стиковані та розблоковані


45

Мені це здається неприємним.

У мене на роботі два додаткові екрани. Я беру свій ноутбук і їду додому, без додаткових екранів. Я повертаюся, стикую ноутбук, і Windows потрібно переставити знову.

Чи є спосіб отримати вікна (або утиліта), щоб відстежувати загальну конфігурацію екрана (#, розмір, роздільну здатність) і пам'ятати, де розміщувалися вікна, тож коли конфігурація екрана знову збігається, він додає додатки НАЗАД, де вони були ?


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

Відповіді:


8

ВІДМОВА: Я творець цього інструменту.

Я створив невеликий інструмент для перестановки вікон на клацанні піктограми панелі трей. Ви можете скласти його з джерела або попросити мати (портативний) двійковий файл за посиланням "Питання".

Він розміщений у Github: https://github.com/manutalcual/winredock

Буду рада почути від вас, якщо у вас є пропозиції.

РЕДАКТ: 2018/11/22

Зараз він повністю автоматизований.


Це виглядає приємно, але я шукаю щось більш автоматичне.
Sellorio

3
Я додав функцію автоматизації завдяки запитам користувачів.
Мануель

Зауважте, що версія в програмі Master має проблеми принаймні в Windows 10 з віртуальними настільними комп'ютерами. Використовуйте гілку під назвою I0010-відновлення-позиції-не працює
HansHarhoff

Я об'єднав гілку I0010-відновлення-позиції-не працює в майстер, тому зараз ми можемо працювати краще
Мануель

1
Це фантастично! Це чудово працює з першої спроби! Дякую, що зробили це!
BT

6

Зараз я використовую DisplayFusion Pro для розташування вікон (не тільки). Я не знаю, як це працює, коли відключаєш і підключаєш монітор - у мене завжди три.

Я думаю, що ви повинні закрити і знову відкрити свої додатки, щоб їх переупорядкувати.

Редагувати: Ця функція доступна лише у версії Pro. - Інформація з коментарів.

скріншот налаштувань

домашня сторінка DisplayFusion


2
FYI, з'являється функція Місце розташування вікон, щоб вирішити мій запит. Слід зазначити, що це версія PRO, яка вимагає придбаної ліцензії.
MADCookie

Дивіться функцію "Зберегти або відновити всі місця у вікні" в Порівнянні функцій для Free проти Pro. На жаль, найдешевше рішення - 25 доларів.
Chiramisu

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 Juice IT

А чи можете ви пояснити, як мати сценарії VBS, які запускають макроси Excel? Як щось подібне можна записати у складену програму?
G-Man каже: "Відновіть Моніку"

Це цікавий підхід. Ви самі це використовуєте? Я впевнений, що багатьом людям вигідно, якщо ви зможете створити робочий зразок від кінця до кінця
Жалюгідна змінна

1

Це виглядало перспективно: https://github.com/adamsmith/WindowsLayoutSnapshot

На жаль, у моєму випадку, зберігаючи макет на 3x 24 "1920x1200 моніторах, змінюючи один ноутбук 1920x1080, а потім повертаючись до трьох і намагаючись відновити макет, Windows насправді не перемістився до інших моніторів. Але, можливо, для когось іншого на інша установка працюватиме.


Виглядає багатообіцяюче, але це не працюватиме на моєму ПК (Windows 8.1)
Dunc

На жаль, припинено, і він втрачає всю конфігурацію при закритті програми або перезавантаженні ПК, що автор не планує виправляти.
Лоран

Тут доступна нова версія - github.com/nefarius/WindowsLayoutSnapshot . Відмінно працює на win10!
Макс Лазар

1

Ось консольний додаток для збереження та відновлення розташування вікон та станів на робочому столі Windows. Щоб зберегти місця розташування Windows, виконайте такі дії:

  winLayout save

для відновлення запущених позицій Windows:

  winLayout restore

Покладіть ці команди на ярлик робочого столу та прив’яжіть до панелі завдань для зручності.

Відмова: Я написав цю утиліту, оскільки інші інструменти на цій сторінці не працювали для мене.

Caveat: Він працює для додатків, але не Windows Explorer (на даний момент)


0

Раніше я використовував паркани Stardock's за аналогічним сценарієм:

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


8
Це розташовує іконки. Не вікна. Моє питання полягає в тому, що у мене відкрито 8 програм на трьох екранах. Коли я закриваю ноутбук і повторно відкриваю його за допомогою трьох екранів, на одному екрані відкриваються вікна моїх програм, а не влаштовано, як у мене їх було.
CaffGeek

0

У багатьох користувачів Windows була ця проблема, розроблено програму та поділитися на форумах Windows 7, як показано тут:

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

На сайті є інструкції, які допомагають, і вони повинні вирішити вашу проблему.


На форумі написано: "Це програма, щоб змусити Windows пам’ятати про розміри та положення вікон папок провідника Windows 7" та "Він НЕ керує розміром вікна / положеннями звичайних додатків, якщо ви цього хочете, це роблять інші програми, наприклад Window Manager ". Що означає Window Manager ? Це служба Microsoft Windows Manager або продукт із посилання
MADCookie

так, це продукт від DeskSoft
DarkEvE
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.