It's a UI concept - Windows UI is based off of events (Mouse Up, Key Press, etc) that are routed to the window in focus. However, for many reasons that I won't go into here, it is a single threaded type of system - so there must be a thread whose job it is to listen for these events to arrive and then turn around and deliver them (this is known as message pumping).
Now, how to add message pumping to your C application? Well a simple little loop you can call is
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
This while loop will end when all messages have been dispatched, but more are going to be coming in, so if your main thread is doing something else, you'll need to do the loop, do a bit of work, do the loop, do a bit of work...
A common solution is to create a thread in your application and make sure it is the first one to call into LV. Then that thread just sits forever doing a loop. Of course, in that case, you should change PeekMessage to GetMessage.