Помните места окна, когда состыкованы и отстыкованы
Я нахожу это за пределами разочарования.
У меня на ноутбуке два дополнительных экрана на работе. Я беру свой ноутбук и иду домой, без дополнительных подключенных экранов. Я возвращаюсь, док-ноутбук, и окна должны быть переставлены.
Есть ли способ получить окна (или утилиту), чтобы отслеживать общую конфигурацию экрана (#, размер, разрешение) и помнить, где были размещены окна, поэтому, когда конфигурация экрана снова совпадает, это ставит приложения НАЗАД, где они были?
10 ответов
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я создатель этого инструмента.
Я создал небольшой инструмент для перестановки окон по щелчку значка на панели задач. Вы можете скомпилировать его из исходного кода или попросить иметь (переносимый) двоичный файл по ссылке проблем.
Он размещен на Github: https://github.com/manutalcual/winredock
Я был бы рад услышать от вас, если у вас есть предложения.
РЕДАКТИРОВАТЬ: 2018/11/22
Теперь он полностью автоматизирован.
В настоящее время я использую DisplayFusion Pro для расположения окна (не только). Я не знаю, как это работает, когда вы отключаете и подключаете свой монитор - у меня всегда три.
Я думаю, что вы должны закрыть и снова открыть свои приложения, чтобы перестроить.
Редактировать: эта функция доступна только в Pro версии. - Информация из комментариев.
домашняя страница DisplayFusion
Вот консольное приложение для сохранения и восстановления расположения и состояний окон на рабочем столе Windows. Чтобы сохранить расположение окон, выполните:
winLayout save
для восстановления положения окон выполните:
winLayout restore
Поместите эти команды в ярлык на рабочем столе и закрепите их на панели задач для удобства.
Отказ от ответственности: я написал эту утилиту, потому что другие инструменты на этой странице не работают для меня.
Предостережение: работает для приложений, но не для окон проводника (в настоящее время)
Попробуйте этот скрипт, написанный для 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
Проблема в том, что приложения Windows на самом деле не видят несколько мониторов. Диспетчер окон отслеживает положение окон относительно верхнего левого угла или вашего основного дисплея. Я не знаю ни одного коммерческого приложения, которое бы это делало, но вы могли бы написать приложение на C# или даже на VB.NET, которое могло бы записать эти значения в файл и восстановить их позже, но для этого не было бы "триггера". Вы должны сообщить программе, когда хранить и извлекать данные вручную.
Это выглядело многообещающе: https://github.com/adamsmith/WindowsLayoutSnapshot
К сожалению, в моем случае, при сохранении макета на 3х 24"мониторах 1920x1200, переходе на один ноутбук 1920x1080, а затем возвращаясь к трем и пытаясь восстановить компоновку, окна на самом деле не переходили на другие мониторы. Но, может быть, для кого-то еще на другие настройки это будет работать.
У многих пользователей Windows была эта проблема, приложение было разработано и распространено на форумах Windows 7, как показано здесь:
http://www.sevenforums.com/free-developer-programs-projects/40916-shellfolderfix-manage-folder-window-positions-size.html#post396744
На сайте есть инструкции, которые помогут вам решить проблему.
Windows 11 может запоминать расположение окон:
Сопутствующая программа для сохранения видимых местоположений окон и последующего восстановления макета .
Я исправил проблему с помощью Window Manager с сайта Desksoft.com (есть бесплатный пробный период (текущая цена — 10 долларов)).
Вы настраиваете два профиля (прикрепленный и открепленный) и добавляете правило для каждого окна, которое хотите разместить конкретно. Профили можно переключать автоматически с помощью «Экранного триггера».
У меня есть сеанс VNC, работающий в полноэкранном режиме на одном из двух мониторов, но когда я отстыковываю ноутбук (например, чтобы пойти на встречу), я хочу скрыть сеанс VNC, не сворачивая его. Это можно сделать, переместив его на дополнительный рабочий стол Windows.
Я никак не связан с DeskSoft.
Я уже использовал Stardock's Fences в похожем сценарии:
Заборы помогают организовать ваш компьютер, автоматически помещая ярлыки и значки в изменяемые размеры затененных областей на рабочем столе, которые называются заборами. Благодаря многочисленным функциям настройки, Fences - самое популярное в мире расширение для Windows.