The idea of a program getting information about every keystroke is certainly nice, but most Windows programs ignore all but a few keystroke messages. The WM_SYSKEYDOWN and WM_SYSKEYUP messages are for Windows system functions, and you don't need to look at them. If you process WM_KEYDOWN messages, you can also ignore WM_KEYUP messages.
Windows programs generally use WM_KEYDOWN messages for keystrokes that do not generate characters. Although you may think that it's possible to use keystroke messages in combination with shift-state information to translate keystroke messages into character messages, don't do it. You'll have problems with international keyboard differences. For instance, if you get a WM_KEYDOWN message with wParam equal to 33H, you know the user pressed the 3 key. So far, so good. If you use GetKeyState and find out that the Shift key is down, you might assume that the user is typing a pound sign (#). Not necessarily so. A British user is typing a £. So the WM_KEYDOWN messages are most useful for the cursor movement keys, the function keys, and special keys such as Insert and Delete. However, Insert, Delete, and the function keys often appear as menu accelerators. Because Windows translates menu accelerators into menu command messages, you don't have to process the keystrokes themselves. Some non-Windows programs for the PC use function keys extensively in combination with the Shift, Ctrl, and Alt keys. You can do something similar in your Windows programs, but it's not recommended. If you want to use the function keys, they should duplicate menu commands. One objective in Windows is to provide a user interface that doesn't require memorizing or using complex command charts.
We've managed to eliminate everything except one final case: Most of the time, you will process WM_KEYDOWN messages only for cursor movement keys. When you use the cursor keys, you can check the Shift-key and Ctrl-key states through GetKeyState. Windows functions often use the Shift key in combination with the cursor keys to extend a selection in (for instance) a word-processing document. The Ctrl key is often used to alter the meaning of the cursor key. (For example, Ctrl in combination with the Right Arrow key might mean to move the cursor one word to the right.)
The Common User Access: Advanced Interface Design Guide contains a list of recommended keyboard definitions. (The guide, hereinafter referred to as the CUA Advanced Interface Design Guide, is included in the Windows Software Development Kit and is part of the IBM Systems Application Architecture Library.) You can also examine how the keyboard is used in existing Windows programs. If you don't like those definitions, you are free to do something different. But keep in mind that doing so may be detrimental to a user's ability to quickly learn your program.