v2: Tweak and reduce a bit more the conditions where the SetForegroundWindow call is refused:
* Set NULL foreground input, allowing any later change, if `SetForegrdounWindow(GetDesktopWindow())` is called from the application. The `d3d8:device` and `d3d9:device` tests do that a lot (and probably shouldn't), and expect to be able to get foreground back right after. We still actually make the desktop window foreground, and forbid further changes, when the user drivers are calling it to indicate a host focus loss to a foreign window.
* Allow processes to set foreground again after SetThreadDesktop has been called. This shouldn't happen very often in practice, and it fixes an `dinput:joystick8` test with and exotic cross-desktop use case.
* Allow any thread from the current foreground process to set foreground to a different window.