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 ?
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.
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.
page d'accueil de DisplayFusion
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
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.
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.
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.
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.