如何強制 Windows 10 真正在完全相同的位置以完全相同的大小開啟程式?

如何強制 Windows 10 真正在完全相同的位置以完全相同的大小開啟程式?

我最近在我的家用電腦上升級到了 Windows 10。在 Windows 7 中,我經常將一些啟動程式設定為在啟動時在第二台顯示器上開啟。這些程式總是會在相同的位置以相同的大小開啟。我認為這是 Windows 和/或程式本身的功能。

在 Windows 10 中,我注意到某些程式不會顯示此行為。它們具體在同一位置打開,但在水平方向上短 10-20px。例如,在啟動時(甚至在一般使用期間)我將水平最大化 Windows explorer.exe。但是,當再次開啟資源管理器時,會從視窗的左側和右側取得 10-20px 的寬度

在此輸入影像描述

在上圖中,頂部顯示資源管理器開啟並水平最大化。底部顯示資源管理器在關閉後再次打開,其預設位置和大小由(我假設)Windows 設定。 (淺藍色是圖像背景,黑色是桌面空間中的“無人區”,深灰色是我的桌面背景,紅線顯示了視窗寬度缺失的大致位置)。


如何強制 Windows 10確實並且始終在完全相同的位置以完全相同的大小打開程式?

請注意,某些程式不存在此問題。特別是 Firefox,它將始終在完全相同的位置以完全相同的大小打開。儘管我完全確定這是 Firefox 的功能。鑑於explorer.exe是Windows',那麼我知道這個問題也出現在Windows'端。

答案1

有一個使用腳本語言的免費工具 自動熱鍵

名為 gallaxhar 的用戶在貼文中建立了一個腳本 自動恢復每個進程的最後一個視窗位置 它充當自動視窗管理器,無需用戶輸入或設定即可保存視窗位置。它透過取得當前活動視窗資訊(id 和進程名)來運作。它將最新的視窗大小/位置保存到ini文件中,並在新視窗 ID 變為活動狀態時從該文件中讀取。它只會在運行後自動調整視窗大小,只會自動調整新 ID 的大小,並且只會為該 ID 執行一次。

安裝 AutoHotkey 後,將腳本放入.ahk檔案中。透過雙擊啟動進行測試。它的托盤欄中將有一個綠色的“H”圖標,您可以右鍵單擊該圖標以退出。一旦證明工作正常,您可以將其放入“啟動”資料夾中。

我測試了該腳本,它似乎適用於您的場景。

該腳本複製如下:

; Automatically Restore Previous Window Size/Pos

; To make this script run when windows starts, make sure RegistryAdd.ahk is in the same directory as this script, run this script, and it will be added to the registry. Then delete RegistryAdd.ahk
#Include *i RegistryAdd.ahk

; To easily remove the previously added registry entry, make sure RegistryRemove.ahk is in the same directory as this script, run this script, and it will be removed from the registry. Then delete RegistryRemove.ahk
#Include *i RegistryRemove.ahk

#SingleInstance Force
#Persistent
#NoEnv
;#NoTrayIcon
SetWinDelay, 50
Process, Priority, , Normal

MatchList := ""

; Build the MatchList
WinGet, id, list,,, Program Manager
Loop, %id%
{
    this_id := id%A_Index%
    if (MatchList = "")
    MatchList := this_id
    else
    MatchList := MatchList . "," . this_id 
}

; ExclusionList
ExclusionList = ShellExperienceHost.exe,SearchUI.exe

; The main program loop, which manages window positions/sizes and saves their last known configuration to an ini file in the script directory.
Loop,
{
    Sleep, 350
    WinGet, active_id, ID, A
    if active_id not in %MatchList% ; Then this is a new window ID! So, check if it has a configuration saved.
    {
        MatchList := MatchList . "," . active_id ; This window ID is not new anymore!
        WinGet, active_ProcessName, ProcessName, A
        WinGetClass, active_Class, A
        IniRead, savedSizePos, %A_ScriptDir%\WindowSizePosLog.ini, Process Names, %active_ProcessName%
        if (savedSizePos != "ERROR" AND active_Class != "MultitaskingViewFrame" AND active_class != "Shell_TrayWnd") ; Then a saved configuration exists, size/move the window!
        {
            StringSplit OutputArray, savedSizePos,`,
            if (active_ProcessName = "explorer.exe" AND active_Class != "CabinetWClass")
            {

            }
            else
            {
                WinMove, A,, OutputArray1, OutputArray2, OutputArray3, OutputArray4
            }
        }
        else ; No saved configuration exists, save the current window size/pos as a configuration instead!
        {
            WinGetPos X, Y, Width, Height, A
            WinGet, active_ProcessName, ProcessName, A
            WinGetClass, active_Class, A
            If (X != "" AND Y != "" AND Width != "" AND Height != "" AND Width > 0 AND Height > 0 AND active_Class != "MultitaskingViewFrame" AND active_class != "Shell_TrayWnd")
            {
                if (active_ProcessName = "explorer.exe" AND active_Class != "CabinetWClass")
                {

                }
                else if active_ProcessName not in %ExclusionList%
                {
                    IniWrite %X%`,%Y%`,%Width%`,%Height%, %A_ScriptDir%\WindowSizePosLog.ini, Process Names, %active_ProcessName%
                }
            }
        }
    }
    else ; Save/overwrite the active window size and position to a file with a link to the processname, for later use.
    {
        WinGetPos X, Y, Width, Height, A
        WinGet, active_ProcessName, ProcessName, A
        WinGetClass, active_Class, A
        If (X != "" AND Y != "" AND Width != "" AND Height != "" AND Width > 0 AND Height > 0 AND active_Class != "MultitaskingViewFrame" AND active_class != "Shell_TrayWnd")
        {
            if (active_ProcessName = "explorer.exe" AND active_Class != "CabinetWClass")
            {

            }
            else if active_ProcessName not in %ExclusionList%
            {
                IniWrite %X%`,%Y%`,%Width%`,%Height%, %A_ScriptDir%\WindowSizePosLog.ini, Process Names, %active_ProcessName%
            }
        }
    }
}
Return

一種可以記住並恢復程式和視窗的位置和大小的商業工具是 DeskSoft 視窗管理器 (10 美元,試用軟體)。

該工具將在重新啟動後記住位置和大小。

答案2

這個問題如此古老且如此普遍,以至於許多不同的開發人員發布了專案來彌補 Windows 作業系統的缺陷。

許多是免費的: http://www.stefandidak.com/windows-layout-manager/

或開源: https://github.com/lapo-luchini/WindowsLayoutSnapshot/tree/v1.3.0.0

有些人注意到,如果將開始功能表移至頂部而不是底部,Windows 的行為會有所不同。

您也可以向微軟投訴。這應該像在適用於 Linux 和 MacOS 的其他視窗管理系統中一樣運作。使用回饋工具進行投訴:https://support.microsoft.com/en-us/help/4021566/windows-10-send-feedback-to-microsoft-with-feedback-hub-app

相關內容