Your suggested method of using the timeout event sounds like the best one to me, although you might have a problem there if you have multiple events and if you need to keep the loop rate constant.
If you want to make sure you catch all keyboard clicks, you can run a seperate loop with an event structure. Whenever a key down event occurs, push the result into a queue.
In your other loop, flush the same queue in each iteration - if there are no elements in the queue, no key was pressed. If there are elements, you can use whatever algorithm you want to decide which of them interests you.
___________________
Try to take over the world!