The Load event is the earliest possible moment to find out what the "normal" size of the form will be. At that point, any scaling induced by AutoSizeMode and any user overrides to border and caption sizes have been applied. However, that size will only be valid if the WindowState is not set to Minimized in the designer. You'll have to wait until the form is at least shown once in the Normal state.
Also beware that the size you'll get is faked if you run with Aero fat borders enabled. Vista and Win7 intentionally return a window size that would be reported if earlier operating systems ran your program. If this really matters, you'll have to use Editbin.exe to mark your program Vista compatible.
Bear traps out there, try to avoid having to ask the question. You can always change the window location or size when you get the Resize event.
If this is only to memorize the form location and size then you'll want to use Settings. Use Project + Properties, Settings tab to add them. You cannot use the automatic ApplicationSettings binding because you don't want to save the location and size of the form when it is minimized or maximized. Make it look like this:
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
}
protected override void OnLoad(EventArgs e) {
if (Properties.Settings.Default.Form1Size.Width > 0) { // Valid?
this.Size = Properties.Settings.Default.Form1Size;
this.Location = Properties.Settings.Default.Form1Location;
}
base.OnLoad(e);
}
protected override void OnLocationChanged(EventArgs e) {
if (this.WindowState == FormWindowState.Normal)
Properties.Settings.Default.Form1Location = this.Location;
base.OnLocationChanged(e);
}
protected override void OnResize(EventArgs e) {
if (this.WindowState == FormWindowState.Normal)
Properties.Settings.Default.Form1Size = this.Size;
base.OnResize(e);
}
protected override void OnFormClosed(FormClosedEventArgs e) {
Properties.Settings.Default.Save();
base.OnFormClosed(e);
}
}