I advocate learning the concepts behind low level windows programming if all of the following are true.
- You are going to do any windows programming.
- You want to be the "go to" guy when the unexplainable happens.
- You love to learn.
Abstraction layers like .NET work create and allow developers to do incredible things without having to know a lot. However, when .NET is used in a way unanticipated by its authors which reveals one of its subtle bugs, then that is the time where some win32 API knowledge goes a long way.
Will you ever have to write a message pump? I doubt it. Can it help diagnose problems? You betcha!