Final solution which seems to work for me:
My.Settings

Code
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
' Restore Form Size, Location and WindowState - override by holding down Ctrl+Shift when opening app
If (Control.ModifierKeys And Keys.Shift) = 0 Then
If IsOnScreen(My.Settings.FormLocation, My.Settings.FormSize) Then
Size = My.Settings.FormSize
Location = My.Settings.FormLocation
WindowState = My.Settings.FormWindowState
Else
Size = My.Settings.FormSize
WindowState = My.Settings.FormWindowState
End If
End If
End Sub
Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
' Save Form Size, Location and WindowState
' Save Size and Location (or RestoreBounds Size and Location if Minimized or Maximized)
If Me.WindowState = FormWindowState.Normal Then
My.Settings.FormSize = Size
My.Settings.FormLocation = Location
Else
My.Settings.FormSize = RestoreBounds.Size
My.Settings.FormLocation = RestoreBounds.Location
End If
' Only save the WindowState if Normal or Maximized
If Me.WindowState = FormWindowState.Normal Or Me.WindowState = FormWindowState.Maximized Then
My.Settings.FormWindowState = WindowState
Else
My.Settings.FormWindowState = FormWindowState.Normal
End If
' save settings
My.Settings.Save()
End Sub
Public Function IsOnScreen(ByVal RecLocation As System.Drawing.Point, ByVal RecSize As System.Drawing.Size, Optional ByVal MinPercentOnScreen As Double = 0.2) As Boolean
Dim PixelsVisible As Double = 0
Dim Rec As New System.Drawing.Rectangle(RecLocation, RecSize)
For Each Scrn As Screen In Screen.AllScreens
Dim r As System.Drawing.Rectangle = System.Drawing.Rectangle.Intersect(Rec, Scrn.WorkingArea)
' intersect rectangle with screen
If r.Width <> 0 And r.Height <> 0 Then
PixelsVisible += (r.Width * r.Height)
' tally visible pixels
End If
Next Scrn
Return PixelsVisible >= (Rec.Width * Rec.Height) * MinPercentOnScreen
End Function