- GetMessage()函数的消息循环的汇编代码
解读:.while TRUE invoke GetMessage,addr @stMsg,NULL,0,0 .break .if eax == 0 invoke TranslateMessage,addr @stMsg invoke DispatchMessage,addr @stMsg .endw ret
- 调用 GetMessage 函数,函数中都要用到一个MSG结构体,那是用来存储 消息信息 的。
- Windows结构体的定义都放在 windows.inc 这个文件中,我们可以从中查到 MSG的定义
参数介绍:MSG STRUCT hwnd DWORD ? message DWORD ? wParam DWORD ? lParam DWORD ? time DWORD ? pt POINT <> MSG ENDS
- hwnd - 消息发送的窗口句柄。
- message - 消息标识符,表示何种消息。
- wParam - 消息参数之一。
- lParam - 消息参数之二。
- time - 消息放入消息队列的时间。
- pt - POINT数据结构,表示消息放入消息队列时的鼠标坐标。
- 理解:
- GetMessage()函数相当于开始拿着一个空的MSG,然后去消息队列中获取。
- 当发现MSG中的消息是WM_QUIT时,则GetMessage()返回值为0,返回值保存在寄存器eax中,所以,此时,程序就会结束消息循环,也就是退出窗口过程。
- Windows窗口程序的本质就是 消息循环,对于 所有函数信息的处理,都遵循这一套模板,哪怕windows内置的函数也是这样的。
- GetMessage()函数相当于开始拿着一个空的MSG,然后去消息队列中获取。
- PeekMessage()的消息循环:
- Windows是一个抢占式的操作系统,任务每20ms切换一次。
- 对于GetMessage()来讲,轮到自己的20ms时,它会读取并处理消息,但消息队列里没有属于它一份的消息,它就会停留在GetMessage函数内部,当Windows发现它这样时,Windows认为该窗口没有要处理的,此时就会剥夺它的时间,所以,GetMessage函数是程序空闲的时候主动将控制权交给Windows的一种方式。
- PeekMessage()与GetMessage()类似,区别时在没有消息时,它不会像GetMessage()那样在内部停留,而是直接返回,并且设置eax为0,所以,在0时,程序会检查是否是WM_QUIT。
- 所以,PeekMessage在没有收到消息的时候会一直循环检测,从而Windows不会剥夺该任务的时间片,也就是说,20ns的时间片内,就算没有消息,它也会一直在循环检测不会吧控制权交还给Windows程序。
Windows 消息循环 GetMessage() PeekMessage()
最新推荐文章于 2022-10-21 21:24:30 发布