Recuerde ubicaciones de ventanas cuando está acoplado y desacoplado

45

Esto me parece más que frustrante.

Tengo dos pantallas adicionales en mi computadora portátil en el trabajo. Tomo mi computadora portátil y me voy a casa, sin pantallas adicionales conectadas. Regreso, conecto la computadora portátil y las ventanas necesitan ser reorganizadas nuevamente.

¿Hay alguna manera de obtener ventanas (o una utilidad) para realizar un seguimiento de la configuración general de la pantalla (#, tamaño, resolución) y recordar dónde se colocaron las ventanas, por lo que cuando la configuración de la pantalla vuelve a coincidir, las aplicaciones vuelven a estar donde estaban? ?

CaffGeek
fuente
1
Me encuentro con el mismo problema, pero mi queja es cuando abro la computadora portátil más tarde y la ventana de la aplicación todavía está fuera de la pantalla (termina usando las teclas de flecha para moverla de nuevo a la pantalla). No creo que haya una solución integrada para esto.
Brad Patton

Respuestas:

8

DESCARGO DE RESPONSABILIDAD: Soy el creador de esta herramienta.

He creado una pequeña herramienta para reorganizar las ventanas con un clic en el icono de la barra de bandeja Puede compilarlo desde la fuente o solicitar un binario (portátil) a través del enlace de problemas.

Está alojado en Github: https://github.com/manutalcual/winredock

Me gustaría saber de usted si tiene sugerencias.

EDITAR: 2018/11/22

Está completamente automatizado ahora.

Manuel
fuente
Esto se ve bien, pero estoy buscando algo más automático.
Sellorio
3
He agregado la función de automatización debido a las solicitudes de los usuarios.
Manuel
Tenga en cuenta que la versión en Master tiene problemas al menos en Windows 10 con escritorios virtuales. Use la rama llamada I0010-restaurando-posiciones-no funciona
HansHarhoff
He fusionado la rama I0010-posiciones-de-restauración-no funciona en master, por lo que ahora podemos estar trabajando mejor
Manuel
1
¡Esto es fantástico! ¡Funciona súper bien en el primer intento! ¡Gracias por hacer esto!
BT
6

Actualmente estoy usando DisplayFusion Pro para la ubicación de la ventana (no solo). No sé cómo funciona esto cuando desconectas y conectas tu monitor; siempre tengo tres.

Creo que debe cerrar y volver a abrir sus aplicaciones para volver a organizarlas.

Editar: Esta función solo está disponible en la versión Pro. - Información de los comentarios.

captura de pantalla de la configuración

página de inicio de DisplayFusion

Wild_A
fuente
2
Para su información, la función de ubicación de la ventana parece resolver mi solicitud. Debe notarse a cualquiera que esta es una versión PRO que requiere una licencia comprada.
MADCookie
Consulte la función "Guardar o restaurar todas las ubicaciones de las ventanas" en la Comparación de funciones para Free vs. Pro. Lamentablemente, la solución más barata es de $ 25.
Chiramisu
1
¿Funciona esto cuando tienes múltiples escritorios virtuales nativos en Windows 10?
K Robinson el
2

El problema es que las aplicaciones de Windows realmente no ven múltiples monitores. El administrador de ventanas realiza un seguimiento de las posiciones de las ventanas en referencia a la esquina superior izquierda o su pantalla principal. No conozco ninguna aplicación comercial que lo haga, pero podría escribir una aplicación en C # o incluso VB.NET que podría escribir estos valores en un archivo y restaurarlos más tarde, pero no habría un "disparador" para ello. Tendría que decirle al programa cuándo almacenar y recuperar los datos manualmente.

Señor mascaro
fuente
2

Pruebe este script, escrito para Excel. Almacena las posiciones de las ventanas en una hoja y las restaura desde allí. Es posible que tenga botones en una de las hojas para ejecutar la tienda y restaurar macros, o accesos directos a scripts de VBS que ejecutan las macros de Excel, tal vez con teclas de acceso directo asignadas. De esa manera, el libro de Excel puede permanecer minimizado. Por supuesto, algo similar puede escribirse en un programa compilado.

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
fuente
Explique qué se supone que debe hacer y limpie y formatee todo el bloque de código correctamente, ya que es difícil de leer tal cual.
Pimp Juice IT
¿Y puede explicar cómo tener secuencias de comandos VBS que ejecuten las macros de Excel? ¿Cómo se puede escribir algo similar en un programa compilado?
G-Man dice 'reinstalar a Monica' el
Este es un enfoque interesante. ¿Lo has usado tú mismo? Estoy seguro de que mucha gente se beneficiaría si pudiera crear una muestra de trabajo de extremo a extremo
Variable miserable
1

Este parecía prometedor: https://github.com/adamsmith/WindowsLayoutSnapshot

Desafortunadamente en mi caso, al guardar el diseño en 3x 24 "monitores 1920x1200, cambiar a una computadora portátil 1920x1080, y luego volver a tres e intentar restaurar el diseño, Windows realmente no se movió a otros monitores. Pero tal vez para alguien más en otra configuración funcionará.

Koshmaar
fuente
Parece prometedor, pero eso no se ejecutará en mi PC (Windows 8.1)
Dunc
Desafortunadamente, se descontinuó y pierde toda la configuración cuando se cierra el programa o se reinicia la PC, lo que el autor no planea arreglar.
laurent
La nueva versión disponible aquí: github.com/nefarius/WindowsLayoutSnapshot . Funciona perfectamente en win10!
Max Lazar
1

Aquí hay una aplicación de consola para guardar y restaurar ubicaciones y estados de ventanas en un escritorio de Windows. Para guardar ubicaciones de Windows, ejecute:

  winLayout save

para restaurar las posiciones de Windows ejecute:

  winLayout restore

Coloque estos comandos en un acceso directo de escritorio y anclar a la barra de tareas para mayor comodidad.

Descargo de responsabilidad: escribí esta utilidad porque las otras herramientas en esta página no funcionaron para mí.

Advertencia: funciona para aplicaciones, pero no para Windows Explorer (en la actualidad)

Phillip Ngan
fuente
0

He usado las cercas de Stardock antes en un escenario similar:

Fences lo ayuda a organizar su PC colocando automáticamente sus accesos directos e íconos en áreas sombreadas redimensionables en su escritorio llamadas cercas. Sus numerosas características de personalización son las que hacen de Fences la mejora de escritorio de Windows más popular del mundo.

Pete Q
fuente
8
Eso organiza los iconos. No ventanas Mi problema es que tengo 8 programas abiertos en tres pantallas. Cuando cierro la computadora portátil y la vuelvo a abrir con las tres pantallas, todas las ventanas de mi aplicación están abiertas en una sola pantalla, sin organizar cómo las tenía.
CaffGeek
0

Muchos usuarios de Windows tuvieron este problema, una aplicación fue desarrollada y compartida en los foros de Windows 7 como se muestra aquí:

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

Hay instrucciones en el sitio que ayudan y debería solucionar su problema.

DarkEvE
fuente
El foro dice "Esta es una aplicación para hacer que las ventanas de la carpeta del explorador de Windows 7 recuerden su tamaño y posición" y "NO administra el tamaño / posición de las ventanas de las aplicaciones normales, si lo desea, otras aplicaciones como Window Manager lo hacen". ¿Qué se entiende por Window Manager ? ¿Es ese el servicio Microsoft Windows Manager o el producto del enlace
DeskSoft
sí, es el producto de DeskSoft
DarkEvE