Lembre-se dos locais das janelas quando encaixados e desencaixados


45

Acho isso além de frustrante.

Eu tenho duas telas extras no meu laptop no trabalho. Pego meu laptop e vou para casa, sem telas extras conectadas. Volto, conecto o laptop e as janelas precisam ser reorganizadas novamente.

Existe uma maneira de fazer com que o Windows (ou um utilitário) acompanhe a configuração geral da tela (número, tamanho, resolução) e lembre-se de onde as janelas foram colocadas; portanto, quando a configuração da tela coincide novamente, ele coloca os aplicativos de volta onde estavam ?


1
O problema é o mesmo, mas minha reclamação é quando abro o laptop mais tarde e a janela do aplicativo ainda está fora da tela (acabe usando as setas do teclado para movê-lo de volta à tela). Eu não acho que exista uma solução embutida para isso.
Brad Patton

Respostas:


8

AVISO LEGAL: Eu sou o criador desta ferramenta.

Eu criei uma pequena ferramenta para reorganizar janelas em um clique no ícone da barra de bandejas. Você pode compilá-lo da fonte ou pedir para ter um binário (portátil) através do link de problemas.

Está hospedado no Github: https://github.com/manutalcual/winredock

Eu ficaria feliz em ouvir de você, se você tiver sugestões.

EDIT: 2018/11/22

Agora é totalmente automatizado.


Parece bom, mas estou procurando algo mais automático.
Sellorio 30/10/18

3
Eu adicionei o recurso de automação devido a solicitações do usuário.
Manuel

Observe que a versão no Master tem problemas pelo menos no Windows 10 com áreas de trabalho virtuais. Use o ramo chamado I0010-restore-position-doesnt-work
HansHarhoff

Mesclei o ramo I0010-restore-position-doesnt-work no master, então agora podemos estar trabalhando melhor
Manuel

1
Isto é fantástico! Funciona super bem na primeira tentativa! Obrigado por fazer isso!
BT

6

Atualmente, estou usando o DisplayFusion Pro para localização da janela (não apenas). Não sei como isso funciona quando você desconecta e conecta seu monitor - eu tenho três sempre.

Eu acho que você deve fechar e reabrir seus aplicativos para ser reorganizado.

Editar: esse recurso está disponível apenas na versão Pro. - Informações de comentários.

captura de tela das configurações

página inicial do DisplayFusion


2
Para sua informação, o recurso Localização da Janela aparece para resolver minha solicitação. Deve-se observar para qualquer outra pessoa que esta é uma versão PRO que requer uma licença adquirida.
MADCookie

Consulte o recurso "Salvar ou restaurar todos os locais das janelas" na Comparação de recursos do Free vs. Pro. Infelizmente, a solução mais barata é US $ 25.
precisa saber é o seguinte

1
Isso funciona quando você tem várias áreas de trabalho virtuais nativas no Windows 10?
K Robinson

2

O problema é que os aplicativos do Windows realmente não veem vários monitores. O gerenciador de janelas controla as posições das janelas em referência ao canto superior esquerdo ou à tela principal. Não conheço nenhum aplicativo comercial que faça isso, mas você pode gravar um aplicativo em C # ou até VB.NET que possa gravar esses valores em um arquivo e restaurá-los mais tarde, mas não haveria "gatilho" para ele. Você precisaria informar ao programa quando armazenar e recuperar os dados manualmente.


2

Experimente este script, escrito para o Excel. Ele armazena as posições da janela em uma folha e as restaura a partir daí. Você pode ter botões em uma das folhas para executar o armazenamento e restaurar macros, ou atalhos para scripts VBS que executam as macros do Excel, talvez com as teclas de atalho atribuídas. Dessa forma, a pasta de trabalho do Excel pode permanecer minimizada. Obviamente, algo semelhante pode ser escrito em um 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

Por favor, explique o que isso deve fazer, limpe e formate o bloco de código inteiro corretamente, pois é difícil ler como está.
Pimp Juice IT

E você pode explicar como ter scripts VBS que executam as macros do Excel? Como algo semelhante pode ser escrito em um programa compilado?
G-Man diz 'Reinstate Monica'

Esta é uma abordagem interessante. Você mesmo usa? Estou certo de que muitas pessoas se beneficiariam se você pode criar uma amostra end-to-end de trabalho
Variable Miserable

1

Este parecia promissor: https://github.com/adamsmith/WindowsLayoutSnapshot

Infelizmente, no meu caso, ao salvar o layout em 3x 24 "1920x1200 monitores, mudar para um laptop 1920x1080 e depois voltar para três e tentar restaurar o layout, o Windows não se moveu para outros monitores. Mas talvez para outra pessoa em outra configuração funcionará.


Parece promissor, mas que não será executado no meu PC (Windows 8.1)
Dunc

Infelizmente, ele foi descontinuado e perde toda a configuração quando o programa é fechado ou o PC é reiniciado, o que o autor não planeja corrigir.
laurent

A nova versão disponível aqui - github.com/nefarius/WindowsLayoutSnapshot . Funciona perfeitamente no win10!
Max Lazar

1

Aqui está um aplicativo de console para salvar e restaurar locais e estados de janelas em uma área de trabalho do Windows. Para salvar os locais do Windows, execute:

  winLayout save

para restaurar as posições do Windows, execute:

  winLayout restore

Coloque esses comandos em um atalho da área de trabalho e fixe-o na barra de tarefas por conveniência.

Isenção de responsabilidade: escrevi este utilitário porque as outras ferramentas nesta página não funcionaram para mim.

Advertência: Funciona para aplicativos, mas não para janelas do Explorer (atualmente)


0

Eu usei cercas de Stardock antes em um cenário semelhante:

O Fences ajuda a organizar o seu PC, colocando automaticamente seus atalhos e ícones em áreas sombreadas redimensionáveis ​​na área de trabalho chamadas cercas. Seus muitos recursos de personalização são o que faz do Fences o aprimoramento da área de trabalho do Windows mais popular do mundo.


8
Isso organiza ícones. Não janelas. Meu problema é que tenho 8 programas abertos em três telas. Ao fechar o laptop e reabri-lo com as três telas, todas as janelas do meu aplicativo estão abertas em uma tela, não organizadas como eu as tinha.
CaffGeek #

0

Muitos usuários do Windows tiveram esse problema, um aplicativo foi desenvolvido e compartilhado nos fóruns do Windows 7, como mostrado aqui:

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

Existem instruções no site que ajudam e devem corrigir seu problema.


O fórum diz "Este é um aplicativo para fazer com que as janelas das pastas do Windows 7 Explorer se lembrem de seu tamanho e posição" e "Ele NÃO gerencia o tamanho / posições da janela de aplicativos regulares; se você desejar, outros aplicativos como o Window Manager o fazem". O que se entende por Gerenciador de Janelas ? É esse o serviço do Microsoft Windows Manager ou o produto do link
DeskSoft

sim, é o produto da DeskSoft
DarkEvE 07/10
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.