[原创] MicroWindows学习笔记之底层消息的读取
在“消息管理”一节里,已经讲过消息是通过消息循环的PeekMessage方法来读取,而对于底层硬件消息的读取,则是通过MwSelect方法来完成,而且它的优先级也是最低的。
MwSelect
1) 方法原型
void MwSelect(void)
所在文件:mwin\Winmain.c
2) 说明
读取键盘、鼠标、定时器消息。
这个方法是整个系统的消息源动力,所以是非常重要的一个方法。它会去读取底层发上来的消息,并上传给MicroWindows的引擎,引擎根据不同的消息类型做一些事情,并决定发给哪个窗口。如果移植的话,需要把这个方法重新实现。
现在看看它的基本实现:

调用mousedev.Poll()方法查询是否有鼠标消息,如果有,则调用MwCheckMouseEvent()方法处理;调用kbddev.Poll()方法查询是否有键盘消息,如果有,则调用MwCheckKeyboardEvent()方法处理;最后调用MwHandleTimers()方法处理定时器消息。
可以看到,对于硬件消息,是通过MwCheckMouseEvent、MwCheckKeyboardEvent、MwHandleTimers这三个方法来处理的。
MwCheckMouseEvent
1) 方法原型
BOOL MwCheckMouseEvent(void)
所在文件:mwin\Winevent.c
2) 说明
在该方法前有一段注释

也就是说,该方法是非堵塞的,调用该方法时,肯定是有鼠标消息要读取。
这个方法用于读取鼠标消息(GdReadMouse),如果有,那么处理之(MwHandleMouseStatus)。
MwCheckKeyboardEvent
1) 方法原型
BOOL MwCheckKeyboardEvent(void)
所在文件:mwin\Winevent.c
2) 说明
该方法也是非堵塞,必须要有键盘消息可以读取。
这个方法用于读取键盘消息(GdReadKeyboard)、看按键状态值来做相应的处理,可能是关闭系统(MwTerminate)、打印屏幕(GdCaptureScreen)、或分发键盘消息(MwDeliverKeyboardEvent)。
MwHandleTimers
1) 方法原型
void MwHandleTimers(void)
所在文件:mwin\Winuser.c
2) 说明
查看应用开的定时器是否已经到时,如果到,则发消息给应用,还分两种情况,如果应用注册了定时器回调的,那是直接调过去,否则是调用PostMessage方法发消息。
定时器的结构为

其中lpTimerFunc是用户注册的回调函数。
有一个全局变量定义了定时器static struct timer timer;
[疑问:现在MicroWindows只能开启一个定时器?]
浙公网安备 33010602011771号