Om te beginnen is dit geen "net"
event-driven Windows programma. Gebruikelijk in een windows programma is een zogenaamde message loop waarin jouw programma de controle aan windows geeft totdat de gebuiker (of een device) iets te melden heeft.
Wat jij doet is voortdurend "pollen" wat de status van toetsen is. Dat werkte prima op een Commodore 64 (als je weet wat dat is) alhoewel het daarop ook veel CPU tijd zou kosten. De meeste computers zijn zo opgebouwd dat als er een knop op een toetsenbord wordt ingedrukt (of een muis wordt bewogen), de chip die de gegevens ontvangt (bijv. via USB) een
hardware interrupt genereert. Daarmee wordt de CPU tijdelijk afgeleid van waar hij mee bezig was en verwerkt de binnenkomende data. Meestal wordt de data vervolgens in een queue (wachtrij) gezet. Later zal Windows kijken welke applicatie de zogenaamde "input focus" heeft en het de karakters (Virtual keystrokes) in 1 of meer
messages naar de betreffende applicatie sturen.
Dat zijn geen echte messages, maar op het moment dat Windows jouw app wat te melden heeft,
returnt hij naar jouw messageloop met als parameters de message. Die verwerk je in je app, waarna je ASAP weer naar Windows teruggaat:
User Windows Jouw app
| |
|--commando start app -->+
. |
. +---------------->+
T . . |
I . . Initialisatie
J . . |
D . . |
. . Main Message Loop <--.
| . . | |
v . +<--GetMessage----+ |
. | |
. Windows wacht op event/interrupt |
. (Of geeft andere apps CPU tijd) |
| | |
+- Toets gedrukt ------->+ |
. | |
. verwerking |
. | |
. | Return van |
. +-->GetMessage--->+ |
. . | |
. . Verwerking |
. . | |
. . `----------'
. .
Een keyboard afluisteren doe je het beste met een zogenaamde hook functie.
Hook overview:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms644959(v=vs.85).aspxSet Windows Hook:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms644990(v=vs.85).aspxLowLevelkeyboardProc callback:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms644985(v=vs.85).aspxTypo gefixed 23:06 (ik was wat gehaast vanmiddag):
terurnt ->
returnt en paramaters -> parameters