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.
Best Answer
Windows themes that are set via Setting > Personalization > Colors > Choose your app mode, are meant to be used mostly for UWP applications, so only very few desktop apps use this theme. Unfortunately, Windows Explorer is one of them, even if the the Dark theme looks pretty horrible on it.
I see the following two possibilities:
Create your own custom theme.
Many resources are available, for example How to create Custom Themes in Windows 10. You may also find many user-volunteered ready-made themes in the Microsoft Store Windows Themes.
Stay with the Windows Dark theme, but change the Explorer colors.
For the second option, you could use the free QTTabBar, which can pretty well change most attributes of Explorer, adding in addition more goodies such as tabs and extra folder views.
You will find the color settings inside QTTabBar Options, tabs Appearance, Compatible Folder View and possibly also Navigation pane. Some options will require Explorer to be restarted.
A detailed description of doing this can be found in the article
How To Change Folder Background Color In Windows 10.
An example of what is possible is: