OpenGL arbeitet ja (wie
DirectX auch, schätze ich) so, dass ständig Bilder gerendert werden - die Frames eben. In einer SingleThreaded-Umgebung sieht das dann so aus, dass entweder per Timer oder in der freien Zeit (Application.OnIdle etc.) die Bilder gerendert werden. Dort kann man Tastatureingaben, die durch Windows Messages reingekommen sind, berücksichtigen und das Bild entsprechend rendern.