Windows消息机制要点概要.doc_第1页
Windows消息机制要点概要.doc_第2页
Windows消息机制要点概要.doc_第3页
Windows消息机制要点概要.doc_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Windows 消息机制要点1. 窗口过程每个窗口会有一个称为窗口过程的回调函数 (WndProc,它带有四个参数,分别为:窗口句柄 (Window Handle, 消息 ID(Message ID, 和两个消息参数 (wParam, lPar am, 当窗口收到消息时系统就会调用此窗口过程来处理消息。 (所以叫回调函数2 消息类型1 系统定义消息 (System-Defined Messages在 SDK 中事先定义好的消息,非用户定义的,其范围在 0x0000, 0x03ff之间, 可以分为以下三类:1窗口消息 (Windows Message与窗口的内部运作有关,如创建窗口,绘制窗口,销毁窗口等。可以是一般的窗口,也可以是 Dialog, 控件等。如:WM_CREATE, WM_PAINT, WM_MOUSEMOVE, WM_CTLCOLOR, WM_HSCROLL.2命令消息 (Command Message与处理用户请求有关, 如单击菜单项或工具栏或控件时, 就会产生命令消息。WM_COMMAND, LOWORD(wParam表示菜单项,工具栏按钮或控件的 ID 。如果是控件 , HIWORD(wParam表示控件消息类型3 控件通知 (Notify Message控件通知消息, 这是最灵活的消息格式, 其 Message, wParam, lParam 分别为:WM_NOTIFY, 控件 ID ,指向 NMHDR 的指针。 NMHDR 包含控件通知的内容, 可 以任意扩展。2 程序定义消息 (Application-Defined Messages用户自定义的消息, 对于其范围有如下规定:WM_USER: 0x0400-0x7FFF (ex. WM_USER+10WM_APP(winver4.0: 0x8000-0xBFFF (ex.WM_APP+4RegisterWindowMessage: 0xC000-0xFFFF3 消息队列 (Message QueuesWindows 中有两种类型的消息队列1 系统消息队列 (System Message Queue这是一个系统唯一的 Queue ,设备驱动 (mouse, keyboard 会把操作输入转化成消息存在系统队列中,然后系统会把此消息放到目标窗口所在的线程的消息队列 (thread-specific message queue 中等待处理2 线程消息队列 (Thread-specific Message Queue每一个 GUI 线程都会维护这样一个线程消息队列。 (这个队列只有在线程调用 GDI 函数时才会创建, 默认不创建 。 然后线程消息队列中的消息会被送到相应的窗口过程 (Wn dProc 处理 .注意:线程消息队列中 WM_PAINT, WM_TIMER只有在 Queue 中没有其他消息的时候才会被处理, WM_PAINT消息还会被合并以提高效率。其他所有消息以先进先出 (FIFO 的方式被处理。4 队列消息 (Queued Messages 和非队列消息 (Non-Queued Messages1 队列消息 (Queued Messages消息会先保存在消息队列中,消息循环会从此队列中取消息并分发到各窗口处理如鼠标,键盘消息。2 非队列消息 (NonQueued Messages消息会绕过系统消息队列和线程消息队列直接发送到窗口过程被处理如:WM_ACTIVATE, WM_SETFOCUS, WM_SETCURSOR, WM_WINDOWPOSCHANGED注意 : postMessage 发送的消息是队列消息,它会把消息 Post 到消息队列中; SendMessage 发送的消息是非队列消息, 被直接送到窗口过程处理5 PostMessage(PostThreadMessage, SendMessagePostMessage:把消息放到指定窗口所在的线程消息队列中后立即返回。 PostThreadMessage :把消息放到指定线程的消息队列中后立即返回。SendMessage :直接把消息送到窗口过程处理, 处理完了才返回。6 GetMessage, PeekMessagePeekMessage 会立即返回 可以保留消息GetMessage 在有消息时返回 会删除消息7 TranslateMessage, TranslateAcceleratorTranslateMessage: 把一个 virtual-key 消息转化成字符消息 (character message ,并放到当前线程的消息队列中,消息循环下一次取出处理。TranslateAccelerator: 将快捷键对应到相应的菜单命令。 它会把 WM_KEYDOWN 或 WM_SYSKEYDOWN转化成快捷键表中相应的 WM_COMMAND 或 WM_SYSCO MMAND 消息, 然后把转化后的 WM_COMMAND或 WM_SYSCOMMAND直接发送到窗口过程处理, 处理完后才会返回。8(消息死锁 ( Message Deadlocks假设有线程 A 和 B , 现在有以下下步骤1 线程 A SendMessage 给线程 B, A 等待消息在线程 B 中处理后返回2 线程 B 收到了线程 A 发来的消息,并进行处理, 在处理过程中, B 也向线程 A SendMessgae ,然后等待从 A 返回。因为此时, 线程 A 正等待从线程 B 返回, 无法处理 B 发来的消息, 从而导致了线程 A,B 相互等待, 形成死锁。多个线程也可以形成环形死锁。可以使用 SendNotifyMessage 或 SendMessageTimeout 来避免出现死锁。9 BroadcastSystemMessage我们一般所接触到的消息都是发送给窗口的, 其实, 消息的接收者可以是多种多样的,它可以是应用程序 (applications, 可安装驱动

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论