Just an additional info on fullscreen debugging in VS:
VS does show an error message, which is the actual problem. It displays the "debug or abort" dialog, which cannot be shown in full screen modes (because the main window of an app that goes fullscreen usually gets topmost set)
In such cases press Escape and then try to abort debugging (Shift-F5 is the default debug cancel key AFAIR)
Here's an old game I made for Dr. Dobb's Challenge back in the days: It's using DX8 in the back and comes with the full source. No other external libraries are required. You may have to search for an old DX8 SDK though:
Little note on WM_QUIT: If you have more than one message pumps going (different threads); or nested pumps (modal windows for example), you may have to repost the WM_QUIT message if you receive it in one of the inner loops.
Be aware though, some parts of DirectInput are NOT available otherwise: Named controller parts (Axis, buttons, etc.) and calibration data.
Unfortunately I can't find the site anymore where they (not MS) explained how to use Raw Input generally but fetch the calibration and controller part info from DirectInput's registry entries.
My current library uses Raw Input to fetch HID data plus DirectInput data (not the library itself though) to interpret data. It's nicer for the player to select a named device than "some gamepad at USB port 17".
DirectInput is officially deprecated for keyboard and mouse.
Unfortunately it has one nifty advantage: All the possible buttons/axis/etc. of a gamepad/joystick get human readable names assigned, and you get calibration info; something I haven't gotten from RawInput.
In my engine I use RawInput plus DirectInput to match up controller info.