Q:

How to prevent a disabled Form from being dragged?

The following code works as expected except that if the Form is "dragged" while disabled – when notepad exits – the Form will be in the new position. How can that be prevented?
Enabled = false;
Process p = Process.Start("notepad");
p.WaitForExit();
Enabled = true;

A:

Okay, I repro the problem.  The issue is that you are calling WaitForExit() on the UI thread.  That stops it from pumping the message loop and processing input events.  They will get put in the message queue.  As soon as the process exits, your method returns and the UI thread starts pumping messages again.  And finds the mouse messages that were buffered, executing them because the window is no longer disabled.
The general rule for code that runs on the UI thread is that it should never block.  Lots of things will go wrong, this is just one example.  It is easy to do with the Process class, it has an event that fires when the process exited.  So you don't need to use WaitForExit().  Make your code look like this:
        this.Enabled = false;
        var prc = System.Diagnostics.Process.Start("notepad.exe");
        prc.EnableRaisingEvents = true;
        prc.SynchronizingObject = this;
        prc.Exited += delegate { 
            this.Enabled = true;
            this.Activate();
        };

Note that the Activate() call is necessary to put your window back into the foreground.  This might not always work.

