Rappelez-vous les emplacements des fenêtres lorsqu'ils sont ancrés et désamarrés

45

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 écran supplémentaire connecté. Je reviens, amarrer l'ordinateur portable et les fenêtres doivent être réorganisées à nouveau.

Existe-t-il un moyen d'obtenir des fenêtres (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, donc lorsque la configuration de l'écran correspond à nouveau, elle remet les applications où elles étaient ?

CaffGeek
la source
1
Je rencontre le même problème mais ma plainte est lorsque j'ouvre l'ordinateur portable plus tard et que la fenêtre de l'application est toujours hors écran (finissez par utiliser les touches fléchées pour le faire revenir à l'écran). Je ne pense pas qu'il existe une solution intégrée à cela.
Brad Patton

Réponses:

8

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

J'ai créé un petit outil pour réorganiser les fenêtres sur un clic d'icône de barre d'outils. Vous pouvez le compiler depuis la source ou demander d'avoir un binaire (portable) via le lien des problèmes.

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

Je serais heureux de vous entendre si vous avez des suggestions.

EDIT: 2018/11/22

Il est maintenant entièrement automatisé.

Manuel
la source
Cela a l'air bien mais je cherche quelque chose de plus automatique.
Sellorio
3
J'ai ajouté la fonction d'automatisation en raison des demandes des utilisateurs.
Manuel
Notez que la version dans Master présente des problèmes au moins sur Windows 10 avec des bureaux virtuels. Utilisez la branche appelée I0010-restoring-positions-doesnt-work
HansHarhoff
J'ai fusionné la branche I0010-restoring-positions-doesnt-work en master, donc maintenant nous pouvons mieux travailler
Manuel
1
C'est fantastique! Cela fonctionne très bien au premier essai! Merci d'avoir fait ça!
BT
6

J'utilise actuellement DisplayFusion Pro pour l'emplacement des fenêtres (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 être réorganisées.

Modifier: Cette fonctionnalité est disponible uniquement dans la version Pro. - Informations issues des commentaires.

capture d'écran des paramètres

page d'accueil de DisplayFusion

Wild_A
la source
2
Pour info, la fonction Emplacement de la fenêtre apparaît pour résoudre ma demande. Il convient de noter à quiconque qu'il s'agit d'une version PRO nécessitant une licence achetée.
MADCookie
Voir la fonction "Enregistrer ou restaurer tous les emplacements de fenêtre" dans la comparaison des fonctionnalités de Free vs. Pro. Malheureusement, la solution la moins chère est de 25 $.
Chiramisu
1
Est-ce que cela fonctionne lorsque vous disposez de plusieurs bureaux virtuels natifs dans Windows 10?
K Robinson
2

Le problème est que les applications Windows ne voient pas vraiment plusieurs moniteurs. Le gestionnaire de fenêtres garde une trace des positions des fenêtres en référence au coin supérieur gauche ou à votre affichage principal. Je ne connais aucune application commerciale qui le fasse, mais vous pourriez é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 à quel moment stocker et récupérer les données manuellement.

M. Mascaro
la source
2

Essayez ce script, écrit pour Excel. Il stocke les positions des fenêtres 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 des macros, ou des raccourcis vers des scripts VBS qui exécutent les macros Excel, peut-être avec des touches de raccourci attribuées. De cette façon, le classeur Excel peut rester minimisé. 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
Max
la source
Veuillez expliquer ce que cela est censé faire et nettoyer et formater correctement tout le bloc de code car il est difficile à lire tel quel.
Pimp Juice IT
Et pouvez-vous expliquer comment avoir des scripts VBS qui exécutent les macros Excel? Comment quelque chose de similaire peut-il être écrit dans un programme compilé?
G-Man dit «Réinstalle Monica»
Il s'agit d'une approche intéressante. L'avez-vous utilisé vous-même? Je suis sûr que beaucoup de gens en bénéficieraient si vous pouviez créer un échantillon de travail de bout en bout
Variable misérable
1

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

Malheureusement dans mon cas, lors de l'enregistrement de la disposition sur 3 moniteurs 24 "1920 x 1200, en passant à un ordinateur portable 1920 x 1080, puis en revenant à trois et en essayant de restaurer la disposition, les fenêtres ne se déplaçaient pas vraiment vers d'autres moniteurs. Mais peut-être pour quelqu'un d'autre sur autre configuration cela fonctionnera.

Koshmaar
la source
Semble prometteur, mais cela ne fonctionnera pas sur mon PC (Windows 8.1)
Dunc
Arrêté malheureusement, et il perd toute la configuration lorsque le programme est fermé ou le PC est redémarré, ce que l'auteur n'a pas l'intention de réparer.
laurent
La nouvelle version disponible ici - github.com/nefarius/WindowsLayoutSnapshot . Fonctionne parfaitement sur win10!
Max Lazar
1

Voici une application console pour enregistrer et restaurer les emplacements et les états des fenêtres sur un bureau Windows. Pour enregistrer les emplacements des fenêtres, exécutez:

  winLayout save

pour restaurer les positions des fenêtres exécutées:

  winLayout restore

Placez ces commandes dans un raccourci sur le Bureau et épinglez-les dans la barre des tâches pour plus de commodité.

Avertissement: J'ai écrit cet utilitaire parce que les autres outils de cette page ne fonctionnaient pas pour moi.

Avertissement: cela fonctionne pour les applications, mais pas pour les fenêtres d'explorateur (actuellement)

Phillip Ngan
la source
0

J'ai déjà utilisé les clôtures de Stardock dans un scénario similaire:

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

Pete Q
la source
8
Cela organise les icônes. Pas des fenêtres. Mon problème est que j'ai 8 programmes ouverts sur trois écrans. Lorsque je ferme l'ordinateur portable et le rouvre avec les trois écrans, toutes mes fenêtres d'application sont ouvertes sur un seul écran, pas arrangées comme je les avais.
CaffGeek
0

Beaucoup d'utilisateurs de Windows ont eu ce problème, une application a été développée et partagée dans les forums Windows 7 comme indiqué ici:

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

Il y a des instructions sur le site qui aident et cela devrait résoudre votre problème.

DarkEvE
la source
Le forum dit "Il s'agit d'une application pour que les fenêtres des dossiers de l'explorateur Windows 7 se souviennent de leur taille et de leur position" et "Elle ne gère PAS la taille / la position des fenêtres des applications normales, si vous le souhaitez, d'autres applications comme Window Manager le font". Qu'entend-on par gestionnaire de fenêtres ? Est-ce le service Microsoft Windows Manager ou le produit du lien
DeskSoft
oui c'est le produit de DeskSoft
DarkEvE