Two things.

First, I'm not doing input on the same thread as video rendering. That's a really bad idea, since they can get in each other's way. (Especially because, in my program, certain input-handling routines contain calls to the Sleep() routine.)

Second:
SDL_PollEvent will return 0 if there are no events, so in this case it will enter the while loop and stay there until an event is recieved.

This is correct behaviour for the FE_WaitEvent was what you are asking is for the app to wait for an event before continuing.
I suppose I should have mentioned this, but I guess it seemed too obvious to me. The procedure never returns, no matter how many keys I hit. For some reason, it's not catching the events.