1) is probably not a good idea. I'd go for the method where you're looking after time-keeping, not the OS. Imagine if the even occurs before you've finished processing - you'll get a back-log of WM_TIMER events to deal with (I
think - don't quote me on that)
To help performance:
If you use double/triple-buffering, you can start working on the next frame while you're waiting to display the last - that way "expensive" frames don't cause as much stutter as they would if you were waiting until the next (artificial) vsync. The added latency of one frame normally isn't noticable.
When the draw queue is full, you are going to have to "wait"... but if you find you're waiting lots per frame, then do more cool stuff!
Cheers,
Ref.