How can I force Windows 10 to truly open programs in the exact same location with the exact same size?

A free tool exists that uses the script language of AutoHotkey.

A user named gallaxhar has created a script in the post Automatically Restore Last Window Position For Each Process that acts as an automatic window manager that saves window positions with no user input or setup. It works by getting the current active window information (id and processname). It saves the latest window size/pos to an ini file, and reads from that file when new window IDs become active. It will auto-size only windows from after it is run, it will only autosize new ID's, and it will only do so one time for that ID.

After installing AutoHotkey, place the script in an .ahk file. Test by double-click to launch. It will have a green "H" icon in the traybar, which you may right-click to Exit. Once proven as working correctly, you may place it in your Startup folder.

I tested the script and it seems to work in your scenario.

The script is reproduced here:

; 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

A commercial tool that also remembers and restores the position and size of programs and windows is DeskSoft WindowManager (10$, trialware).

This tool will remember positions and sizes across reboots.


This problem is so old and so common that many different developers have released projects to cover the deficiency in Windows OS.

Many are free: http://www.stefandidak.com/windows-layout-manager/

or open source: https://github.com/lapo-luchini/WindowsLayoutSnapshot/tree/v1.3.0.0

Some people have noticed that if you move the start menu to the top, instead of the bottom, that Windows behaves differently.

You can also complain to Microsoft. This is something that should just work like it does in other window management systems available for Linux and MacOS. Use the feedback tool to complain: https://support.microsoft.com/en-us/help/4021566/windows-10-send-feedback-to-microsoft-with-feedback-hub-app