In a previous post I showed how you could create a constructor that a layout could use but no other code could.
Seems that in oder to make this a little more generic and cross-platform you need to look for a different stack entry.
Because macOS and Windows do things differently you can get a very different stack trace on Windows that you would on the Mac. So instead of looking for Window.__Init%%o you should look for the substring ._CreateControls0%%o<
So the updated code in the no parameter constructor looks like
Try
Raise New NilObjectException
Catch noe As NilObjectException
Dim stack() As String = noe.Stack
// IF this is an instance created on a layout we should find a
// ._CreateControls0%%o< in the stack above the call to this
// Constructor
// cant look for the whole string as parts of it are the specific
// name of the window being constructed which will change by
// window name
For i As Integer = 0 To stack.Ubound
If stack(i).InStr("._CreateControls0%%o<") > 0 Then
#Pragma BreakOnExceptions default
Return
End If
Next
// and if we do not then raise an UnsupportedOperation error
Raise New UnsupportedOperationException
End Try