- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第四章 第一个窗口程序 1 (windows的消息机制)
标 题: 【原创】windows下32位汇编语言学习笔记 第四章 第一个窗口程序 (windows的消息机制)作 者: jasonnbfan时 间: 2009-05-05,22:59:57链 接: /showthread.php?t=88027windows下32位汇编语言学习笔记?第四章??第一个窗口程序?1?(windows的消息机制)FirstWindow程序代码很简单,只有一个地方要说下_WinMain?函数里的下面2行代码,?把当前进程句柄赋值给WNDCLASSEX的hInstance,这里不能使用mov?@stWndClass.hInstance,hInstance,因为mov指令不支持2块内从间的直接赋值。所以先把hInstance压栈再弹出到@stWndClass.hInstancepush??hInstancepop??@stWndClass.hInstance当然也可以这样做mov?ecx,hInstancemov?@stWndClass.hInstance,ecxWIN32的消息机制windows系统是一个消息驱动的OS,操作通过处理各种消息来响应用户的操作。从第一个windows程序就可以看出来,大部分的代码都是处理消息的。要开发windows程序,不管你用什么开发工具什么语言,掌握消息机制的原理都是非常必要的。对于每一个带有窗口的线程,系统都会给他非配一个自己的消息队列,用于处理消息派送(Dispatch)。每个线程都用自己的消息循环来接受消息。每个线程列队默认管理最大10000个消息,修改注册表下面的键值可以修改列队中的消息数。建议的最小值是4000HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows?NT\CurrentVersion\Windows\USERPostMessageLimit.线程列队不是一个公开的数据结构(THREADINFO),其中包括登记消息队列(Posted-message?queue),消息发送队列(Send-message?queue),消息应答队列(reply-message?queue),虚拟输入队列(virtualized-input?queue),唤醒标志(wake?flag),以及用来扫描线程局部输入状态的若干变量。(Windows核心编程)消息列队提取优先级1.检查QS_SENDMESSAGE?标志?GetMessage?不处理Send消息,如果队列中没有其他send消息,关闭QS_SENDMESSAGE标志,GetMessage()不返回检查其他消息。2.检查QS_POSTMESSAGE?标志?GetMessage?从此列队取出消息处理并由DisPatch分发到指定窗口回调函数处理。GetMessage返回True,没有其他post消息关闭标志。3.检查QS_QUIT?标志??如果被PostQuitMessage()打开,则GetMessage返回False退出消息循环,并且关闭QS_QUIT标志4.检查QS_INPUT?标志?GetMessage?从此列队取出消息处理由TranslateMessage()处理键盘鼠标消息,然后由DisPatch分发到指定窗口回调函数处理没有其他消息关闭标志.5.检查QS_PAINT?标志?处理同26.检查QS_TIME??标志?首先复位计时器,GetMessage返回True,如果没有计数器,关闭QS_TIME标志。优先级很清楚,send优先级最高,最低的是time。Windows定义了很多消息都以WM_开头,都是用#DEFINE?定义的常量,用户可以定义自己的消息,windows规定用户的消息从WM_USER?0x0400开始。BOOL?PostMessage(HWND?hwnd,UINT?uMsg,WPARAM?wParam,LPARAM?lParam);往进程的消息列队发送消息PostMessage,这个函数往指定进程的消息列队发送一个消息,发送完毕立即返回。调用函数无法知道发送的消息是否能被处理。如果这个指定窗口未处理完自己消息列队的所有消息前就推出了,就会处理不到post的消息。PostMessage发送的消息参数不能包含指针参数,MSDN的说明是:“如果发送一个低于WM_USER范围的消息给异步消息函数(PostMessage.SendNotifyMessage,SendMesssgeCallback),消息参数不能包含指针。否则,操作将会失败。函数将再接收线程处理消息之前返回,发送者将在内存被使用之前释放。”我的理解是,就算目标进程知道你发来的是个指针地址,但是2个进程之
文档评论(0)