惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Threat Research - Cisco Blogs
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
V
Vulnerabilities – Threatpost
GbyAI
GbyAI
P
Proofpoint News Feed
L
LINUX DO - 热门话题
P
Palo Alto Networks Blog
A
About on SuperTechFans
T
Tenable Blog
M
MIT News - Artificial intelligence
IT之家
IT之家
I
Intezer
D
DataBreaches.Net
爱范儿
爱范儿
T
Threatpost
C
CERT Recently Published Vulnerability Notes
云风的 BLOG
云风的 BLOG
博客园 - 三生石上(FineUI控件)
WordPress大学
WordPress大学
K
Kaspersky official blog
大猫的无限游戏
大猫的无限游戏
A
Arctic Wolf
Y
Y Combinator Blog
Cyberwarzone
Cyberwarzone
酷 壳 – CoolShell
酷 壳 – CoolShell
D
Darknet – Hacking Tools, Hacker News & Cyber Security
H
Help Net Security
Microsoft Security Blog
Microsoft Security Blog
Spread Privacy
Spread Privacy
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
AWS News Blog
AWS News Blog
博客园 - 聂微东
C
Check Point Blog
S
Securelist
有赞技术团队
有赞技术团队
雷峰网
雷峰网
aimingoo的专栏
aimingoo的专栏
Last Week in AI
Last Week in AI
Stack Overflow Blog
Stack Overflow Blog
MongoDB | Blog
MongoDB | Blog
D
Docker
G
GRAHAM CLULEY
T
The Exploit Database - CXSecurity.com
C
Cybersecurity and Infrastructure Security Agency CISA
T
Tailwind CSS Blog
L
Lohrmann on Cybersecurity
G
Google Developers Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
L
LangChain Blog

博客园 - 高原

[转] 定义、注册和实现 GObject 类的子类 [转] GType 类型系统的功能 [转] Android FrameWork——Touch事件派发过程详解 [转] GObject对象系统 [转] GTYPE类型系统分析 VC里嵌汇编,获取寄存器的值 [转] 使用dbghelp获取调用堆栈--release下的调试方法学 [转] 探索Win32系统之窗口类(Window Classes in Win32) [转] 编译器开关参数集 [转] Nano-X的详细介绍 [转] 为MicroWindows添加透明绘图函数 [转] microwindows位图解析 [转] Microwindows及其中文化方法 [转] Nano-X显示系统的代码分析 [转] Nano-X图形引擎分析及其优化 [转] 使用 pq magic 分区出现 Error 983 报错信息的处理办法 [转] IncrediBuild 试用时间推迟的算法 [原创] MicroWindows学习笔记之对底层设备的管理 [转载] Makefile详解
[原创] MicroWindows学习笔记之底层消息的读取
高原 · 2010-04-11 · via 博客园 - 高原

在“消息管理”一节里,已经讲过消息是通过消息循环的PeekMessage方法来读取,而对于底层硬件消息的读取,则是通过MwSelect方法来完成,而且它的优先级也是最低的。

MwSelect

1) 方法原型

void MwSelect(void)

所在文件:mwin\Winmain.c

2) 说明

读取键盘、鼠标、定时器消息。

这个方法是整个系统的消息源动力,所以是非常重要的一个方法。它会去读取底层发上来的消息,并上传给MicroWindows的引擎,引擎根据不同的消息类型做一些事情,并决定发给哪个窗口。如果移植的话,需要把这个方法重新实现。

现在看看它的基本实现:

调用mousedev.Poll()方法查询是否有鼠标消息,如果有,则调用MwCheckMouseEvent()方法处理;调用kbddev.Poll()方法查询是否有键盘消息,如果有,则调用MwCheckKeyboardEvent()方法处理;最后调用MwHandleTimers()方法处理定时器消息。

可以看到,对于硬件消息,是通过MwCheckMouseEventMwCheckKeyboardEventMwHandleTimers这三个方法来处理的。

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只能开启一个定时器?]