博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
草稿--Windows消息机制
阅读量:6251 次
发布时间:2019-06-22

本文共 3014 字,大约阅读时间需要 10 分钟。

消息本身是作为一个记录传递给应用程序的,这个记录中包含了消息的类型以及其他信息。MSG含有来自windows应用程序消息队列的消息信息,它在Windows中声明如下:    typedef struct tagMsg    {        HWND    hwnd;       // 接受该消息的窗口句柄        UINT    message;    // 消息常量标识符,也就是我们通常所说的消息号        // 通常是一个与消息有关的常量值,也可能是窗口或控件的句柄。        WPARAM  wParam;     // 32位消息的特定附加信息,确切含义依赖于消息值        // 通常是一个指向内存中数据的指针。        LPARAM  lParam;     // 32位消息的特定附加信息,确切含义依赖于消息值        DWORD   time;       // 消息创建时的时间        POINT   pt;         // 消息创建时的鼠标/光标在屏幕坐标系中的位置    }MSG;    // 注意:由于WParam、lParam和Pointer都是32位的,因此,它们之间可以相互转换。消息可以由系统或者应用程序产生。系统在发生输入事件时产生消息。消息的种类:    窗口消息: 是系统中最为常见的消息,它是指由操作系统和控制其他窗口的窗口所使用的消息。    命令消息: 这是一种特殊的窗口消息,他用来处理从一个窗口发送到另一个窗口的用户请求。    控件通知消息: 只适用于标准的窗口控件如按钮、列表框、组合框、编辑框,以及Windows公共控件如树状视图、列表视图等。    窗口消息及控件通知消息主要由窗口类即直接或间接由CWND类派生类处理。    命令消息的处理对象范围就广得多,它不仅可以由窗口类处理,还可以由文档类,文档模板类及应用类所处理。附:控件通知消息:按扭控件 BN_CLICKED        用户单击了按钮 BN_DISABLE 按钮被禁止 BN_DOUBLECLICKED  用户双击了按钮 BN_HILITE  用/户加亮了按钮 BN_PAINT  按钮应当重画 BN_UNHILITE 加亮应当去掉组合框控件 CBN_CLOSEUP 组合框的列表框被关闭 CBN_DBLCLK 用户双击了一个字符串 CBN_DROPDOWN 组合框的列表框被拉出 CBN_EDITCHANGE 用户修改了编辑框中的文本 CBN_EDITUPDATE 编辑框内的文本即将更新 CBN_ERRSPACE 组合框内存不足 CBN_KILLFOCUS 组合框失去输入焦点 CBN_SELCHANGE 在组合框中选择了一项 CBN_SELENDCANCEL 用户的选择应当被取消 CBN_SELENDOK 用户的选择是合法的 CBN_SETFOCUS 组合框获得输入焦点编辑框控件 EN_CHANGE 编辑框中的文本己更新 EN_ERRSPACE 编辑框内存不足 EN_HSCROLL 用户点击了水平滚动条 EN_KILLFOCUS 编辑框正在失去输入焦点 EN_MAXTEXT 插入的内容被截断 EN_SETFOCUS 编辑框获得输入焦点 EN_UPDATE 编辑框中的文本将要更新 EN_VSCROLL 用户点击了垂直滚动条消息含义列表框控件 LBN_DBLCLK 用户双击了一项 LBN_ERRSPACE 列表框内存不够 LBN_KILLFOCUS 列表框正在失去输入焦点 LBN_SELCANCEL 选择被取消 LBN_SELCHANGE 选择了另一项 LBN_SETFOCUS 列表框获得输入焦点消息的发送:把一个消息发送到窗口有3种方式:发送、寄送和广播。    发送消息的函数有SendMessage、SendMessageCallback、SendNotifyMessage、 SendMessageTimeout;    寄送消息的函数主要有PostMessage、PostThreadMessage、 PostQuitMessage;    广播消息的函数我知道的只有BroadcastSystemMessage、 BroadcastSystemMessageEx。函数示例:// 发送消息,会被立即处理,处理完毕后函数才会返回;LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);解析:这个函数主要是向一个或多个窗口发送一条消息,消息被处理后才返回。    注意: 如果接收消息的窗口是同一个应用程序的一部分,那么这个窗口的窗口函数就被作为一个子程序马上被调用;          如果接收消息的窗口是被另外的线程所创建的,那么窗口系统就切换到相应的线程并且调用相应的窗口函数,这条消息不会被放进目标应用程序队列中。    函数的返回值是由接收消息的窗口的窗口函数返回,返回的值取决于被发送的消息。// 寄送消息,不会被立即处理,他被放到一个先进先出的队列中,一直等到应用程序空线的时候才会被处理,不过函数放置消息后立即返回。BOOL PostMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);解析:该函数把一条消息放置到创建hWnd窗口的线程的消息队列中,该函数不等消息被处理就马上将控制返回。    注意: 如果hWnd参数为HWND_BROADCAST,消息将被寄送给系统中的所有的重叠窗口和弹出窗口,但是子窗口不会收到该消息;          如果hWnd参数为NULL,则该函数类似于将dwThreadID参数设置成当前线程的标志来调用PostThreadMEssage函数。// 广播消息,long BroadcastSystemMessage(DWORD dwFlags,LPDWORD lpdwRecipients,UINT uiMessage,WPARAM wParam,LPARAM lParam);解析:该函数可以向指定的接收者发送一条消息,这些接收者可以是应用程序、可安装的驱动程序、网络驱动程序、系统级别的设备驱动消息和他们的任意组合。    注意:如果dwFlags参数是BSF_QUERY并且至少一个接收者返回了BROADCAST_QUERY_DENY,则返回值为0;          如果没有指定BSF_QUERY,则函数将消息发送给所有接收者,并且忽略其返回值。消息的处理:VC中的消息泵:    while(GetMessage(&msg, NULL, 0, 0))    {        if(!TranslateAccelerator(msg.hWnd, hAccelTable, &msg))        {             TranslateMessage(&msg);            DispatchMessage(&msg);        }    }

转载于:https://www.cnblogs.com/xuejianhui/archive/2012/11/14/2770146.html

你可能感兴趣的文章
生成不重复随机数
查看>>
Kinect for Windows SDK 1.5 的改进及新特性
查看>>
jQuery-倒计时
查看>>
expect语法基础: while、for 循环、if 语句的用法示例
查看>>
ubuntu 9.04 的 NTFS 分区自动加载
查看>>
现代软件工程讲义 7 设计阶段 Spec
查看>>
精确控制MFC控件窗口的位置和大小(top|left|width|height)
查看>>
ASP.NET MVC中Areas的namespaces和UseNamespaceFallback
查看>>
队列希望IOS开发(66)之构建自己的分派队列
查看>>
谈谈Android中的SurfaceTexture
查看>>
Nginx+Varnish又开始新的征程了
查看>>
NUnit-Console 命令行选项详解
查看>>
[问题2014S10] 解答
查看>>
微信游戏《全民炫舞》公司的引擎开发和布料系统技术介绍
查看>>
同步与互斥的区别和联系
查看>>
eclipse中tomcat能正常启动,在浏览器中不能打开问题
查看>>
基于Linux根据僵尸网络病毒平台《比尔盖茨》
查看>>
JNI编程(二) —— 让C++和Java相互调用(2)
查看>>
Android搜索框效果
查看>>
ReportMachine OCX
查看>>