Ricorda le posizioni delle finestre quando agganciate e sganciate


45

Lo trovo oltre frustrante.

Ho due schermi extra sul mio laptop al lavoro. Prendo il mio laptop e vado a casa, senza schermi aggiuntivi collegati. Torno, aggancio il laptop e le finestre devono essere riorganizzate di nuovo.

C'è un modo per ottenere windows (o un'utilità) per tenere traccia della configurazione generale dello schermo (#, dimensioni, risoluzione) e ricordare dove sono state posizionate le finestre, quindi quando la configurazione dello schermo corrisponde di nuovo, mette le applicazioni INDIETRO dove erano ?


1
Ho riscontrato lo stesso problema, ma il mio reclamo è quando apro il laptop in un secondo momento e la finestra dell'applicazione è ancora fuori dallo schermo (finendo con i tasti freccia per spostarlo nuovamente sullo schermo). Non penso che ci sia una soluzione integrata a questo.
Brad Patton,

Risposte:


8

DISCLAIMER: sono il creatore di questo strumento.

Ho creato un piccolo strumento per riorganizzare le finestre con un clic sull'icona della barra delle applicazioni. Puoi compilarlo dalla fonte o chiedere di avere un binario (portatile) attraverso il link dei problemi.

È ospitato su Github: https://github.com/manutalcual/winredock

Sarei felice di sentirti se hai suggerimenti.

EDIT: 2018/11/22

Ora è completamente automatizzato.


Sembra carino ma sto cercando qualcosa di più automatico.
Sellorio,

3
Ho aggiunto la funzione di automazione a causa delle richieste dell'utente.
Manuel,

Si noti che la versione in Master presenta problemi almeno su Windows 10 con desktop virtuali. Usa il ramo chiamato I0010-restoring-position-doesnt-work
HansHarhoff

Ho unito il ramo I0010-restoring-posizioni-non-funziona in master, quindi ora potremmo lavorare meglio
Manuel

1
È fantastico! Funziona benissimo al primo tentativo! Grazie di averlo fatto!
BT

6

Attualmente sto usando DisplayFusion Pro per la posizione della finestra (non solo). Non so come funzioni quando ti disconnetti e colleghi il monitor - ne ho sempre tre.

Penso che devi chiudere e riaprire le tue app per essere riorganizzate.

Modifica: questa funzione è disponibile solo nella versione Pro. - Informazioni dai commenti.

screenshot delle impostazioni

homepage di DisplayFusion


2
Cordiali saluti, la funzione Posizione finestra sembra risolvere la mia richiesta. Dovrebbe essere notato a chiunque altro che questa è una versione PRO che richiede una licenza acquistata.
MADCookie,

Vedi la funzione "Salva o ripristina tutte le posizioni delle finestre" nel Confronto delle funzioni per Free vs. Pro. Purtroppo la soluzione più economica è $ 25.
Chiramisu,

1
Funziona quando hai più desktop virtuali nativi in ​​Windows 10?
K Robinson,

2

Il problema è che le applicazioni Windows non vedono davvero più monitor. Il gestore delle finestre tiene traccia delle posizioni delle finestre in riferimento all'angolo in alto a sinistra o al display principale. Non sono a conoscenza di applicazioni commerciali che lo fanno, ma potresti scrivere un'applicazione in C # o persino VB.NET che potrebbe scrivere questi valori in un file e ripristinarli in seguito, ma non ci sarebbe alcun "trigger" per esso. Dovresti dire al programma quando archiviare e recuperare i dati manualmente.


2

Prova questo script, scritto per Excel. Memorizza le posizioni della finestra in un foglio e le ripristina da lì. Potresti avere pulsanti su uno dei fogli per eseguire il negozio e ripristinare le macro, o scorciatoie per gli script VBS che eseguono le macro di Excel, magari con i tasti di scelta rapida assegnati. In questo modo la cartella di lavoro di Excel può rimanere ridotta al minimo. Naturalmente qualcosa di simile può essere scritto in un programma compilato.

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

Spiega cosa dovrebbe fare, ripulisci e formatta correttamente l'intero blocco di codice poiché è difficile da leggere così com'è.
Pimp Juice IT

E puoi spiegare come avere script VBS che eseguono le macro di Excel? Come si può scrivere qualcosa di simile in un programma compilato?
G-Man dice "Ripristina Monica" il

Questo è un approccio interessante. L'hai usato tu stesso? Sono sicuro che molte persone trarrebbero beneficio se si potesse creare un campione di lavoro end-to-end
Miserabile variabile

1

Questo sembrava promettente: https://github.com/adamsmith/WindowsLayoutSnapshot

Sfortunatamente nel mio caso, quando si salva il layout su monitor 3x 24 "1920x1200, si passa a un laptop 1920x1080 e si torna a tre e si tenta di ripristinare il layout, Windows non si è spostato su altri monitor. Ma forse per qualcun altro su altra configurazione funzionerà.


Sembra promettente, ma non funzionerà sul mio PC (Windows 8.1)
Dunc il

Interrotto purtroppo e perde tutta la configurazione quando il programma viene chiuso o il PC viene riavviato, che l'autore non prevede di risolvere.
laurent,

La nuova versione disponibile qui - github.com/nefarius/WindowsLayoutSnapshot . Funziona perfettamente su win10!
Max Lazar,

1

Ecco un'applicazione console per salvare e ripristinare posizioni e stati delle finestre su un desktop di Windows. Per salvare le posizioni di Windows eseguite:

  winLayout save

per ripristinare le posizioni di Windows eseguite:

  winLayout restore

Inserisci questi comandi in un collegamento sul desktop e aggiungi la barra delle applicazioni per comodità.

Disclaimer: ho scritto questa utility perché gli altri strumenti in questa pagina non hanno funzionato per me.

Avvertenza: funziona per le applicazioni, ma non per Windows Explorer (al momento)


0

Ho usato Stardock's Fences in uno scenario simile:

Recinzioni ti aiuta a organizzare il tuo PC posizionando automaticamente le scorciatoie e le icone in aree ombreggiate ridimensionabili sul desktop chiamate recinzioni. Le sue numerose funzioni di personalizzazione sono ciò che rende Fences il miglioramento desktop Windows più famoso al mondo.


8
Questo organizza le icone. Non windows. Il mio problema è che ho 8 programmi aperti su tre schermi. Quando chiudo il laptop e lo riapro con le tre schermate, tutte le finestre della mia applicazione sono aperte su una schermata, non disposta come le avevo.
CaffGeek,

0

Molti utenti di Windows avevano questo problema, un'applicazione è stata sviluppata e condivisa all'interno dei forum di Windows 7 come mostrato qui:

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

Ci sono istruzioni sul sito che aiutano e dovrebbe risolvere il tuo problema.


Il forum dice "Questa è un'app per fare in modo che le finestre delle cartelle di Windows 7 Explorer ricordino le loro dimensioni e posizione" e "NON gestisce le dimensioni / posizioni delle finestre delle applicazioni normali, se lo desideri, altre app come Window Manager lo fanno". Cosa si intende per Window Manager ? È il servizio Microsoft Windows Manager o il prodotto dal collegamento
DeskSoft

sì, è il prodotto di DeskSoft
DarkEvE
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.