도킹 및 도킹 해제시 창 위치 기억


45

나는 이것을 실망스럽게 생각합니다.

직장에서 랩톱에 두 개의 추가 화면이 있습니다. 추가 화면이 연결되지 않은 채 랩톱을 가져와 집으로 돌아갑니다. 돌아와서 노트북을 도킹하면 창문을 다시 정리해야합니다.

전체 화면 구성 (#, 크기, 해상도)을 추적하고 창 배치 위치를 기억하기 위해 창 (또는 유틸리티)을 얻는 방법이 있습니까? 따라서 화면 구성이 다시 일치하면 응용 프로그램을 원래 위치로 되돌립니다. ?


1
같은 문제가 발생하지만 나중에 랩톱을 열고 응용 프로그램 창이 화면을 벗어난 경우 불만이 발생합니다 (화살표 키를 사용하여 화면으로 다시 이동). 나는 이것에 대한 빌트인 솔루션이 없다고 생각합니다.
브래드 패튼

답변:


8

면책 조항 : 나는이 도구의 제작자입니다.

트레이 바 아이콘 클릭시 창을 재정렬하는 작은 도구를 만들었습니다. 소스에서 컴파일하거나 이슈 링크를 통해 (휴대용) 바이너리를 요청할 수 있습니다.

Github에서 호스팅됩니다 : https://github.com/manutalcual/winredock

제안이 있으시면 기뻐할 것입니다.

편집 : 2018/11/22

이제 완전히 자동화되었습니다.


이것은 좋아 보이지만 더 자동적 인 것을 찾고 있습니다.
Sellorio

3
사용자 요청으로 인해 자동화 기능을 추가했습니다.
마누엘

Master의 버전에는 가상 데스크톱이있는 Windows 10 이상에서 문제가 있습니다.
HansHarhoff

나는 지점 I0010- 복원 위치 -doesnt- 작업을 마스터로 병합 했으므로 이제 우리는 더 잘 작동 할 수 있습니다
Manuel

1
환상적이다! 첫 번째 시도에서 잘 작동합니다! 이것을 만들어 주셔서 감사합니다!
BT

6

현재 창 위치에 DisplayFusion Pro를 사용하고 있습니다 (뿐만 아니라). 모니터 연결을 끊고 연결할 때 이것이 어떻게 작동하는지 모르겠습니다. 항상 3 개가 있습니다.

다시 정렬하려면 앱을 닫았다가 다시 열어야한다고 생각합니다.

편집 :이 기능은 Pro 버전에서만 사용할 수 있습니다. -의견 정보.

설정 스크린 샷

DisplayFusion 홈페이지


2
참고로, 창 위치 기능이 내 요청을 해결하는 것처럼 보입니다. 이 라이센스는 구매 한 라이센스가 필요한 PRO 버전입니다.
MADCookie

무료 대 Pro 의 기능 비교 에서 "모든 창 위치 저장 또는 복원"기능을 참조하십시오 . 불행히도 가장 저렴한 솔루션은 $ 25입니다.
Chiramisu

1
Windows 10에 여러 개의 기본 가상 데스크톱이있는 경우이 기능이 작동합니까?
K Robinson

2

문제는 Windows 응용 프로그램에 실제로 여러 모니터가 표시되지 않는다는 것입니다. 창 관리자는 왼쪽 상단 또는 기본 디스플레이를 참조하여 창 위치를 추적합니다. 나는 상업적 응용 프로그램을 알고 있지는 않지만 C # 또는 VB.NET으로 응용 프로그램을 작성하여 이러한 값을 파일에 쓰고 나중에 복원 할 수는 있지만 "트리거"는 없습니다. 데이터를 수동으로 저장하고 검색 할시기를 프로그램에 알려야합니다.


2

Excel 용으로 작성된이 스크립트를 사용해보십시오. 창 위치를 시트에 저장하고 거기서부터 복원합니다. 저장 및 복원 매크로를 실행하는 시트 중 하나에 단추가 있거나 단축키 매크로가 지정된 Excel 매크로를 실행하는 VBS 스크립트에 대한 단축키가있을 수 있습니다. 이렇게하면 Excel 통합 문서가 최소화 된 상태로 유지 될 수 있습니다. 물론 비슷한 프로그램이 컴파일 된 프로그램으로 작성 될 수 있습니다.

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

이 작업을 설명하고있는 그대로 읽기 어렵 기 때문에 전체 코드 블록을 정리하고 형식을 지정하십시오.
Pimp Juice IT

Excel 매크로를 실행하는 VBS 스크립트를 사용하는 방법을 설명 할 수 있습니까? 어떻게 비슷한 프로그램을 컴파일 된 프로그램에 작성할 수 있습니까?
G-Man, 'Reinstate

이것은 흥미로운 접근법입니다. 직접 사용하셨습니까? 엔드 투 엔드 작업 샘플을 만들 수 있다면 많은 사람들이 혜택을 얻을 수 있다고 확신합니다
Miserable Variable

1

이것은 유망한 것으로 보였습니다. https://github.com/adamsmith/WindowsLayoutSnapshot

불행히도 제 경우에는 3x 24 "1920x1200 모니터에 레이아웃을 저장하고 하나의 랩톱 1920x1080으로 변경 한 다음 3으로 돌아가 레이아웃을 복원하려고 할 때 Windows가 실제로 다른 모니터로 이동하지 않았습니다. 다른 설정은 작동합니다.


유망 해 보이지만 내 PC에서 실행되지는 않습니다 (Windows 8.1)
Dunc

불행히도 중단되었으며 프로그램을 닫거나 PC를 다시 시작할 때 모든 구성이 손실되며 작성자는 수정할 계획이 없습니다.
laurent

새 버전은 여기 ( github.com/nefarius/WindowsLayoutSnapshot)에서 제공 됩니다. win10에서 완벽하게 작동합니다!
Max Lazar

1

다음은 Windows 바탕 화면에서 창 위치와 상태를 저장하고 복원 하는 콘솔 응용 프로그램 입니다. Windows 위치를 저장하려면 다음을 실행하십시오.

  winLayout save

창 위치를 복원하려면 다음을 실행하십시오.

  winLayout restore

편의를 위해 이러한 명령을 바탕 화면 바로 가기에 넣고 작업 표시 줄에 고정하십시오.

면책 조항 :이 페이지의 다른 도구가 작동하지 않아서이 유틸리티를 작성했습니다.

주의 사항 : 응용 프로그램에서는 작동하지만 탐색기 창에서는 작동하지 않습니다 (현재)


0

내가 사용했던 스타 독의 울타리를 비슷한 시나리오에서 전에 :

Fences를 사용하면 바로 가기와 아이콘을 데스크톱의 펜스라는 크기 조정 가능한 음영 영역에 자동으로 배치하여 PC를 구성 할 수 있습니다. 많은 사용자 정의 기능은 Fences를 세계에서 가장 널리 사용되는 Windows 데스크탑 향상으로 만듭니다.


8
아이콘이 정렬됩니다. 창문이 아닙니다. 내 문제는 세 개의 화면에서 8 개의 프로그램이 열려 있다는 것입니다. 랩톱을 닫고 세 개의 화면으로 노트북을 다시 열면 모든 응용 프로그램 창이 한 화면에서 열리 며 내가 가진 방법을 정렬하지 않았습니다.
CaffGeek

0

많은 Windows 사용자 가이 문제를 겪고 응용 프로그램이 다음과 같이 Windows 7 포럼 내에서 개발되고 공유되었습니다.

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

사이트에 도움이되는 지침이 있으며 문제를 해결해야합니다.


포럼은 그리고 "그것은 당신이 원하는 경우 창 크기 / 일반 응용 프로그램의 위치는, 같은 다른 애플 리케이션 관리하지 않습니다"이것은 윈도우 7 탐색기 폴더 창 크기와 위치를 기억하게하는 응용 프로그램입니다 "라는 창 관리자는 그것을". Window Manager의 의미는 무엇입니까 ? Microsoft Windows Manager 서비스 또는 DeskSoft 링크
MADCookie

예, 그것은 DeskSoft의 제품입니다.
DarkEvE
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.