web-dev-qa-db-fra.com

Rappelez-vous les emplacements des fenêtres quand ils sont ancrés et non ancrés

Je trouve cela plus que frustrant.

J'ai deux écrans supplémentaires sur mon ordinateur portable au travail. Je prends mon ordinateur portable et rentre chez moi, sans écrans supplémentaires connectés. Je reviens, installe l'ordinateur portable et il faut réorganiser les fenêtres.

Existe-t-il un moyen d’obtenir Windows (ou un utilitaire) pour garder une trace de la configuration globale de l’écran (#, taille, résolution) et se rappeler où les fenêtres ont été placées; ainsi, lorsque la configuration de l’écran correspond à nouveau, les applications sont RETOURÉES là où elles étaient ?

31
CaffGeek

AVERTISSEMENT: Je suis le créateur de cet outil.

J'ai créé un petit outil pour réorganiser les fenêtres sur une icône de barre des tâches, cliquez sur OK. Vous pouvez le compiler à partir des sources ou demander l’utilisation d’un fichier binaire (portable) via le lien issues.

Il est hébergé sur Github: https://github.com/manutalcual/winredock

Je serais heureux d'avoir de vos nouvelles si vous avez des suggestions.

EDIT: 2018/11/22

Il est entièrement automatisé maintenant.

5
Manuel

J'utilise actuellement DisplayFusion Pro pour l'emplacement de la fenêtre (pas seulement). Je ne sais pas comment cela fonctionne lorsque vous déconnectez et connectez votre moniteur - j'en ai toujours trois.

Je pense que vous devez fermer et rouvrir vos applications pour pouvoir les réorganiser.

Edit: Cette fonctionnalité est disponible uniquement dans la version Pro. - Informations tirées des commentaires.

screenshot of settings

page d'accueil de DisplayFusion

5
Wild_A

Essayez ce script, écrit pour Excel. Il stocke les positions de la fenêtre dans une feuille et les restaure à partir de là. Vous pouvez avoir des boutons sur l’une des feuilles pour exécuter le magasin et restaurer les macros, ou des raccourcis vers les scripts VBS qui exécutent les macros Excel, éventuellement avec des touches de raccourci. De cette façon, le classeur Excel peut rester réduit. Bien sûr, quelque chose de similaire peut être écrit dans un programme compilé.

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
2
Max

Le problème est que les applications Windows ne voient pas vraiment plusieurs moniteurs. Le gestionnaire de fenêtres garde la trace des positions des fenêtres par rapport au coin supérieur gauche ou à votre écran principal. Je ne suis au courant d'aucune application commerciale qui en ait, mais vous pouvez écrire une application en C # ou même VB.NET qui pourrait écrire ces valeurs dans un fichier et les restaurer plus tard, mais il n'y aurait pas de "déclencheur" pour cela. Vous devez indiquer au programme quand stocker et récupérer les données manuellement.

2
Mr. Mascaro

J’ai déjà utilisé les barrières de Stardock dans un scénario similaire:

Clôtures vous aide à organiser votre PC en plaçant automatiquement vos raccourcis et vos icônes dans des zones ombrées redimensionnables de votre bureau, appelées clôtures. Ses nombreuses fonctionnalités de personnalisation font de Fences l’amélioration de bureau Windows la plus répandue au monde.

0
Pete Q

Beaucoup d'utilisateurs de Windows avaient ce problème, une application a été développée et partagée au sein des forums Windows 7, comme indiqué ici:

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

Il existe des instructions sur le site qui aident et qui devraient résoudre votre problème.

0
DarkEvE

Celui-ci semblait prometteur: https://github.com/adamsmith/WindowsLayoutSnapshot

Malheureusement, dans mon cas, lors de la sauvegarde de la mise en page sur des moniteurs 3 x 24 "1920x1200, en passant à un ordinateur portable 1920x1080, puis en tentant de restaurer la mise en page, Windows ne passait pas vraiment sur d'autres moniteurs. Mais peut-être pour quelqu'un d'autre autre configuration cela fonctionnera.

0
Koshmaar