本节内容 消息的接收 视频提供:昆山爱达人信息技术有限公司 官网地址:www.bcdaren.com 联系QQ:1250121864 QQ交流群 :49759272 联系电话:0512-57882866
一个线程可以有多个窗口,所有窗口共享一个消息队列 _WINDOW_OBJECT PTHREADINFO pti //所属线程 要点回顾: 一个GUI线程有一个消息队列 普通线程 GUI线程 THREAD.W32THREAD THREADINFO 消息队列 一个线程可以有多个窗口,所有窗口共享一个消息队列 _WINDOW_OBJECT PTHREADINFO pti //所属线程 WNDPROC lpfnWndProc //窗口过程(窗口回调函数)
1、代码解析 //创建窗口类的对象 WNDCLASS wndclass = {0}; //窗口的背景色 wndclass.hbrBackground = (HBRUSH)COLOR_MENU; wndclass.hCursor = LoadCursor(NULL,IDC_APPSTARTING); //窗口过程函数 wndclass.lpfnWndProc = WindowProc; ... _WINDOW_OBJECT结构 PTHREADINFO pti; PWND Wnd; .. DWORD ExStyle; //扩展样式 DWORD style; //标准样式 //窗口过程 WNDPROC lpfnWndProc; // 创建窗口 CreateWindow( className, //类名 "我的第一个窗口", //窗口标题 WS_OVERLAPPEDWINDOW, //窗口外观样式 10, //相对于父窗口的X坐标 10, //相对于父窗口的Y坐标 600, //窗口的宽度 300, //窗口的高度 NULL, //父窗口句柄,为NULL NULL, //菜单句柄,为NULL hInstance, //当前应用程序的句柄 NULL); //附加数据一般为NULL
2、消息队列的结构 <1> SentMessagesListHead //接到SendMessage发来的消息 <2> PostedMessagesListHead //接到PostMessage发来的消息 <3> HardwareMessagesListHead //接到鼠标、键盘的消息 ...略
3、GetMessage的功能: GetMessage( LPMSG lpMsg, //返回从队列中摘下来的消息 HWND hWnd, //过滤条件一:发个这个窗口的消息 UNIT wMsgFilterMin, //过滤条件 UNIT wMsgFilterMax //过滤条件 ); GetMessage的主要功能: 循环判断是否有该窗口的消息,如果有,将消息存储到MSG指定的结构,并将消息从列表中删除。
4、NtUserGetMessage的执行流程: User32!GetMessage 调用 w32k!NtUserGetMessage do { //先判断SentMessagesListHead是否有消息 如果有处理掉 .... KeUserModeCallback(USER32_CALLBACK_WINDOWPROC, Arguments, ArgumentLength, &ResultPointer, &ResultLength); }while(SentMessagesListHead != NULL) //以此判断其他的6个队列,里面如果有消息 返回 没有继续 }while(其他队列!=NULL) 分析到KeUserModeCallback : 重点强调2个参数:窗口回调函数的地址、以及USER32_CALLBACK_WINDOWPROC
5、SendMessage与PostMessage的区别(同步和异步): 实验: SendMessage与PostMessage的区别(同步和异步)
昆山爱达人信息技术有限公司 www.bcdaren.com QQ:1250121864 课后练习: <线上班>学员可见