More info
If I change my debug output to do this
monitor := Screen.MonitorFromPoint(Self.BoundsRect.CenterPoint);// MonitorFromWindow(Self.Handle);
Memo1.Lines.Add('Current Monitor : ' + IntToStr(monitor.MonitorNum));
It always give the correct monitor.
Current Monitor : 1
Windows Bounds (Top,Left,Bottom,Right) : -8,-8,1408,2568
Current Monitor : 0
Windows Bounds (Top,Left,Bottom,Right) : -11,2549,2111,6411
Those top/left values on monitor 0 looked odd, so I turned off themes
Current Monitor : 1
Windows Bounds (Top,Left,Bottom,Right) : -8,-8,1408,2568
Current Monitor : 0
Windows Bounds (Top,Left,Bottom,Right) : -11,2549,2111,6411
So that's not it, some googling found this is explained here - https://devblogs.microsoft.com/oldnewthing/20120326-00/?p=8003
So I'm no closer to figuring this out.