您的位置:首页 > 其它

[原创] MicroWindows学习笔记之底层消息的读取

2010-04-11 19:48 344 查看
在“消息管理”一节里,已经讲过消息是通过消息循环的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只能开启一个定时器?]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐