emulator对键盘的处理没有像鼠标一样用WM_KEY消息,而是用SetWindowsHookEx()来设置一个low-level的keyboard hook。
    当IOWinController(主窗口)收到WM_SETFOUCS消息的时候就会设置这样一个keyboard hook来在窗体接收键盘消息之前进行对键盘消息进行处理。
    可以通过Configuration来配置键盘消息是发送给win32窗口的还是发送给wince系统的。如果是发送给wince的,hook就会与键盘控制器进行通信。
    IOSPI1就是起到keyboard controller的作用,在IOLCDController.onWMKEY中,调用SPI1的EnqueueKey来设置成员变量keyboardqueue这个队列,它用key值入队(该队列为SPRDAT寄存器使用,也就是说对SPRDAT寄存器的读取就是读取了该队列中的key值)。然后就是RaiseInterrupt(EINT1)通知cpu有中断,进而通知keyboard driver来取值,并交由系统处理该值。
    在IOSPI1中,对key up和key down的处理分别是由两个分离的queue来负责的。