Can we see your main loop? For most programs, it's something like:
This will not use 99% CPU, as the call to GetMessage will block execution until a message is ready to be processed. What you'll need to do is call a function that blocks execution somewhere in your main loop; or call Sleep[Ex] for a short amount of time. An example of such a function i've used in the past is MsgWaitForMultipleObjects[Ex].
while (GetMessage(...) != 0)
if (msg.message == WM_QUIT) break;