ドッキングおよびドッキング解除時にウィンドウの位置を記憶する


45

これはイライラする以上です。

職場のラップトップに2つの余分な画面があります。余分な画面を接続せずに、ラップトップを持って帰宅します。戻ってきてラップトップをドッキングすると、ウィンドウを再配置する必要があります。

全体の画面構成(#、サイズ、解像度)を追跡するウィンドウ(またはユーティリティ)を取得し、ウィンドウが配置された場所を覚えて、画面構成が再び一致すると、アプリケーションを元の場所に戻す方法があります?


1
私は同じ問題に遭遇しましたが、私のラップトップを後で開き、アプリケーションウィンドウがまだ画面外にあるとき(矢印キーを使用して画面上に戻すことで終わる)の苦情です。これには組み込みのソリューションはないと思います。
ブラッドパットン

回答:


8

免責事項:私はこのツールの作成者です。

トレイバーアイコンクリックでウィンドウを再配置する小さなツールを作成しました。ソースからコンパイルするか、issuesリンクから(ポータブル)バイナリを要求することができます。

Githubでホストされていますhttps : //github.com/manutalcual/winredock

ご提案がありましたら、お気軽にご連絡ください。

編集:2018/11/22

現在は完全に自動化されています。


これは良さそうに見えますが、もっと自動化されたものを探しています。
セリリオ

3
ユーザーのリクエストにより自動化機能を追加しました。
マヌエル

マスターのバージョンには、少なくとも仮想デスクトップを備えたWindows 10で問題があることに注意してください。I0010-restoring-positions-doesnt-work
HansHarhoff

私は今、私たちはより良い仕事ができることも、マスターにマージされたブランチI0010-復元位-doesntの仕事をしました
マヌエル・

1
これは素晴らしいです!最初の試行で非常にうまく機能します!これを作ってくれてありがとう!
BT

6

現在、ウィンドウの場所にDisplayFusion Proを使用しています(だけでなく)。モニターの接続を解除して接続したとき、これがどのように機能するのかわかりません。常に3つあります。

再配置するには、アプリを閉じて再度開く必要があると思います。

編集:これは、Proバージョンでのみ使用可能な機能です。-コメントからの情報。

設定のスクリーンショット

DisplayFusionのホームページ


2
参考までに、ウィンドウの場所機能は私の要求を解決するようです。これは、購入したライセンスを必要とするPROバージョンであることに注意してください。
MADCookie 14年

無料とプロの機能比較の「すべてのウィンドウの場所を保存または復元する」機能をご覧ください。残念ながら、最も安価なソリューションは25ドルです。
ちらみす

1
これは、Windows 10に複数のネイティブ仮想デスクトップがある場合に機能しますか?
Kロビンソン

2

問題は、Windowsアプリケーションが実際に複数のモニターを認識しないことです。ウィンドウマネージャは、左上隅またはメインディスプレイを基準にしてウィンドウの位置を追跡します。私は商用アプリケーションを認識していませんが、これらの値をファイルに書き込んで後で復元できるアプリケーションをC#またはVB.NETで作成できますが、「トリガー」はありません。データを手動で保存および取得するタイミングをプログラムに指示する必要があります。


2

Excel用に作成されたこのスクリプトをお試しください。ウィンドウの位置をシートに保存し、そこから復元します。シートの1つに、ストアを実行してマクロを復元するためのボタン、または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

これが何をするのか説明し、そのまま読みにくいので、コードブロック全体を適切にクリーンアップおよびフォーマットしてください。
ピンプジュースIT

また、Excelマクロを実行するVBSスクリプトを作成する方法を説明できますか?コンパイルされたプログラムに同様の何かを書き込むにはどうすればよいですか?
G-Manは「Reinstate Monica」と言う

これは興味深いアプローチです。あなた自身がそれを使用していますか?私は確かにあなたは、エンドツーエンドの作業のサンプルを作成することができれば、多くの人々が恩恵を受けるだろうよ
惨めな変数

1

これは有望そうです:https : //github.com/adamsmith/WindowsLayoutSnapshot

残念ながら、私の場合、3x 24 "1920x1200モニターでレイアウトを保存し、1台のラップトップ1920x1080に変更してから3台に戻ってレイアウトを復元しようとすると、ウィンドウは他のモニターに移動しませんでした。他のセットアップは動作します。


有望に見えますが、それは私のPC(Windows 8.1)では実行されません
-Dunc

残念ながら廃止され、プログラムが閉じられたりPCが再起動されたときにすべての設定が失われますが、作成者は修正する予定はありません。
ローラン

新しいバージョンはgithub.com/nefarius/WindowsLayoutSnapshotから入手できます。win10で完全に動作します!
マックスラザール

1

Windowsデスクトップでウィンドウの場所と状態を保存および復元するコンソールアプリケーション次に示します。Windowsの場所を保存するには、次を実行します。

  winLayout save

Windowsの位置を復元するには、次を実行します。

  winLayout restore

これらのコマンドをデスクトップのショートカットに入れて、便宜上、タスクバーに固定します。

免責事項:このページの他のツールが役に立たなかったため、このユーティリティを作成しました。

警告:アプリケーションでは機能しますが、エクスプローラウィンドウでは機能しません(現在)


0

同様のシナリオでStardockのフェンスを使用したことがあります。

Fencesは、フェンスと呼ばれるデスクトップ上のサイズ変更可能な影付き領域にショートカットとアイコンを自動的に配置することにより、PCを整理するのに役立ちます。その多くのカスタマイズ機能が、Fencesを世界で最も人気のあるWindowsデスクトップ拡張機能にしている理由です。


8
それはアイコンを配置します。窓ではありません。私の問題は、3つの画面で8つのプログラムを開いていることです。ラップトップを閉じて、3つの画面で再び開くと、すべてのアプリケーションウィンドウが1つの画面で開かれます。
CaffGeek

0

多くのWindowsユーザーがこの問題を抱えていました。次に示すように、アプリケーションが開発され、Windows 7フォーラム内で共有されました。

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

このサイトには、問題を解決するのに役立つ指示があります。


フォーラムによると、「これはWindows 7エクスプローラーフォルダーウィンドウのサイズと位置を記憶させるアプリです」と「通常のアプリケーションのウィンドウサイズ/位置は管理しません。必要に応じて、ウィンドウマネージャーなどの他のアプリも管理します」。Window Managerの意味は何ですか?Microsoft WindowsマネージャーサービスまたはDeskSoft リンク
MADCookie 14年

はい、それはDeskSoftからの製品である
DarkEvE
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.