MFC中消息循环处理的几个函数之间的区别

Windows编程中一个比较原始的问题就是消息循环,现在很少有人关心这些了;

  我个人对消息循环比较感兴趣,对底层的很多细节想深入了解!

  以下说明几个消息循环中的常用函数进行对比

  1 PostMessage 与 SendMessage 函数对比

  SendMessage把消息直接发送到窗口,并调用此窗口的相应消息处理函数,等消息处理函数结束后SendMessage才返回!SendMessage发送的消息不进入系统的消息队列;SendMessage函数有返回值

  PostMessage将消息发送到与创建窗口的线程相关联的消息队列后立即返回;PostMessage函数没有返回值;

  2 GetMessage 与 PeekMessage函数的对比

  GetMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax)

  PeekMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax,UINT wRemoveMsg)

  根据参数可以看出以上2个函数的区别,参数wRemoveMsg的作用是指定消息获取的方式,如果设为PM_NOREMOVE,那么消息将不会从消息队列中被移出,如果设为PM_REMOVE,那么消息将会从消息队列中被移出;

  还有区别:

  他们如果没有捕获到消息,程序的主线程会被操作系统挂起。当操作系统再次回来照顾此线程时,发现消息队列中仍然没有消息可取,此时两个函数的行为就不同了:

  GetMessage : 过门不入,操作系统再次挂起此线程,去照顾别的线程;

  PeekMessage: 取回控制权,使程序执行一段时间,等待可能的消息进入消息队列并将其捕获;这时程序进入空闲时间阶段;

时间: 2024-09-20 16:16:21

MFC中消息循环处理的几个函数之间的区别的相关文章

java中的引用传递-Integer 对象在函数之间的引用传递起不到全局的作用

问题描述 Integer 对象在函数之间的引用传递起不到全局的作用 //实现排序二叉树的第k个节点的查找 TreeNode target = KthNode(p2); public static TreeNode KthNode(TreeNode pRoot int k) { if(pRoot == null || k < 1 ){ return null; } //ArrayList<Integer> list = new ArrayList<Integer>(); //l

MFC语言中的消息和函数之间的关系

问题描述 MFC语言中的消息和函数之间的关系 MFC中的消息和函数之间的关系是什么,比如OnSize这个是一个函数吧,怎么变成消息的? 解决方案 每个窗口有一个消息循环,mfc对消息循环做了包装,通过消息映射宏将收到指定的消息调用对应的虚函数处理,你写的onsize就是这样一个函数. 解决方案二: Onsize 是窗口大小发生了改变时调用的 3个消息分别是:WM_SIZE.WM_SIZING.WM_GETMINMAXINFO:分别对应相应的处理函数:OnSize.OnSizing.OnGetMi

深入探讨MFC消息循环和消息泵

首先,应该清楚MFC的消息循环(::GetMessage,::PeekMessage),消息泵(CWinThread::PumpMessage)和MFC的消息在窗口之间的路由是两件不同的事情.在MFC的应用程序中(应用程序类基于CWinThread继承),必须要有一个消息循环,他的作用是从应用程序的消息队列中读取消息,并把它派送出去(::DispatchMessage).而消息路由是指消息派送出去之后,系统(USER32.DLL)把消息投递到哪个窗口,以及以后消息在窗口之间的传递是怎样的.  消

mfc-MFC 中加入循环的问题

问题描述 MFC 中加入循环的问题 小弟需要做个无线控制的上位机 现在的思路是在MFC的主函数中加入循环发送的串口,通过按钮获得控制信息,不知道这样可行么?在网上查的资料说MFC 的主函数是封装的? 解决方案 你可以利用MFC封装好的消息循环,不需要你自己实现,你只用处理对应的事件响应. http://blog.csdn.net/a_runing_man/article/details/9947343 解决方案二: 我用的是VS2008,没有哪个Microsoft Communications

WinMain函数 注册窗口类 消息循环

#include <windows.h>#pragma comment(lib,"winmm.lib")//为了要播放声音,必须导入这个库 LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)/* HINSTANCE 类型的含义为实

MFC中常用类、宏、函数的简单介绍

闲来无事,整理了一下MFC中常用的类.宏.函数. 常用类 CRect:用来表示矩形的类,拥有四个成员变量:top left bottom right.分别表是左上角和右下角的坐标.可以通过以下的方法构造: CRect( int l, int t, int r, int b ); 指明四个坐标 CRect( const RECT& srcRect ); 由RECT结构构造 CRect( LPCRECT lpSrcRect ); 由RECT结构构造 CRect( POINT point, SIZE

MFC中改变对话框背景的几个消息函数OnEraseBkgnd、 OnPaint、 OnCtlColor的调用顺序

设置对话框背景颜色及背景图片可在OnCtlColor(),OnEraseBkgnd(),OnPaint()里设置,对话框初始化完毕,显示时调用OnSize()->OnEraseBkgnd(),->OnPaint()->OnCtlColor(), 若想改变对话框大小,比如全屏显示ShowWindow(SW_SHOWMAXIMIZED);UpdateWindow(); 其中 ShowWindow会调用OnSize()->OnEraseBkgnd(),         UpdateWin

c++-MFC中静态文本框获取鼠标移动到按钮上的消息

问题描述 MFC中静态文本框获取鼠标移动到按钮上的消息 MFC对话框运用程序,对话框上有多个按钮和静态文本框,鼠标移动到不同按钮上时静态文本框输出不同字符串,这个功能怎么实现?我刚学MFC,是个小白,希望各位大神不嫌麻烦,讲详细一点.谢谢! 解决方案 1.重载PreTranslateMessage函数2.实现如下代码BOOL CMouseDlg::PreTranslateMessage(MSG* pMsg) { // TODO: Add your specialized code here an

关于MFC中ccmdtarget这个类在多线程中传递消息参数的用法

问题描述 关于MFC中ccmdtarget这个类在多线程中传递消息参数的用法 关于MFC中ccmdtarget这个类在多线程中传递消息参数的用法?看了一些资料,但是没有提到如何用它来调用多线程,具体怎么做呢? 解决方案 http://blog.csdn.net/hyhnoproblem/article/details/6117631