配色: 字号:
SendMessage函数
2014-01-09 | 阅:  转:  |  分享 
  
SendMessage函数完全使用手册





SendMessage函数完全使用手册



SendMessage函数完全使用手册



首先我们了解一下Windows的消息机制。Windows是一个消息驱动式系



统,Windows消息提供应用程序与应用程序之间,应用程序与Windows系统之间进



行通信的手段。



举个例子,打开记事本程序,该程序有一个“文件“菜单。那么,在运行该程序



的时候,如果用户单击“文件菜单“里的“新建“命令,这个动作将被Windows所捕



捉,Windows经过分析得知这个动作应该由我们打开的记事本程序所来处理,然后



Windows就发送个消息譬如我们编程的时候有时用到的WM_COMMAND的消息给记



事本,然后记事本就把这个消息处理掉。这个过程就是消息处理。



接下来,我们把SendMessage的完整形式讲一下



SendMessage



DeclareFunctionSendMessageLib"user32"Alias"SendMessageA"(ByVal



hwndAsLong,ByValwMsgAsLong,ByValwParamAsLong,lParamAsAny)As



Long



别名



SendMessageA



说明



调用一个窗口的窗口函数,将一条消息发给那个窗口。除非消息处理完毕,否



则该函数不会返回



SendMessage所包含4个参数



hwnd32位的窗口句柄窗口可以是任何类型的屏幕对象,因为Win32能够维



护大多数可视对象的句柄



wMsg用于区别其他消息的常量值,这些常量可以是Windows单元中预定



义的常量,也可以是自定义的常量



wParam通常是一个与消息有关的常量值,也可能是窗口或控件的句柄



lParam通常是一个指向内存中数据的指针。由于WParm、lParam和Pointer



都是32位的,因此,它们之间可以相互转换



wMsg函数



WM_CREATE创建一个窗口



WM_DESTROY当一个窗口被破坏时发送



WM_MOVE移动一个窗口



WM_SIZE改变一个窗口的大小



WM_ACTIVATE一个窗口被激活或失去激活状态



WM_SETFOCUS一个窗口获得焦点



WM_KILLFOCUS一个窗口失去焦点



WM_ENABLE一个窗口改变成Enable状态



WM_SETREDRAW设置窗口是否能重画



WM_SETTEXT应用程序发送此消息来设置一个窗口的文本



WM_GETTEXT应用程序发送此消息来复制对应窗口的文本到缓冲区



WM_GETTEXTLENGTH得到与一个窗口有关的文本的长度(不包含空字符)



WM_PAINT要求一个窗口重画自己



WM_CLOSE当一个窗口或应用程序要关闭时发送一个信号



WM_QUERYENDSESSION当用户选择结束对话框或程序自己调用ExitWindows函数



WM_QUIT用来结束程序运行



WM_QUERYOPEN当用户窗口恢复以前的大小位置时,把此消息发送给某个图标



WM_ERASEBKGND当窗口背景必须被擦除时(例在窗口改变大小时)



WM_SYSCOLORCHANGE当系统颜色改变时,发送此消息给所有顶级窗口



WM_ENDSESSION当系统进程发出WM_QUERYENDSESSION消息后,此消息发送给应用程序,通知它对话是否结束



WM_SHOWWINDOW当隐藏或显示窗口是发送此消息给这个窗口WM_ACTIVATEAPP



发此消息给应用程序哪个窗口是激活的,哪个是非激活的



WM_FONTCHANGE当系统的字体资源库变化时发送此消息给所有顶级窗口



WM_TIMECHANGE当系统的时间变化时发送此消息给所有顶级窗口



WM_CANCELMODE发送此消息来取消某种正在进行的摸态(操作)



WM_SETCURSOR如果鼠标引起光标在某个窗口中移动且鼠标输入没有被捕获时,就发消息给某个窗口



WM_MOUSEACTIVATE当光标在某个非激活的窗口中而用户正按着鼠标的某个键发送此消息给当前窗口



WM_CHILDACTIVATE发送此消息给MDI子窗口当用户点击此窗口的标题栏,或当窗口被激活,移动,改变大小



WM_QUEUESYNC此消息由基于计算机的训练程序发送,通过WH_JOURNALPALYBACK的hook程序分离出用户输入消息



WM_GETMINMAXINFO此消息发送给窗口当它将要改变大小或位置



WM_PAINTICON发送给最小化窗口当它图标将要被重画



WM_ICONERASEBKGND此消息发送给某个最小化窗口,仅当它在画图标前它的背景必须被重画



WM_NEXTDLGCTL发送此消息给一个对话框程序去更改焦点位置



WM_SPOOLERSTATUS每当打印管理列队增加或减少一条作业时发出此消息



WM_DRAWITEM当button,combobox,listbox,menu的可视外观改变时发送



WM_MEASUREITEM当button,combobox,listbox,list,viewcontrol,ormenuitem被创建时



WM_VKEYTOITEM此消息有一个LBS_WANTKEYBOARDINPUT风格的发出给它的所有者来响应WM_KEYDOWN消息



WM_CHARTOITEM此消息由一个LBS_WANTKEYBOARDINPUT风格的列表框发送给他的所有者来响应WM_CHAR消息



WM_SETFONT当绘制文本时程序发送此消息得到控件要用的颜色



WM_GETFONT应用程序发送此消息得到当前控件绘制文本的字体



WM_SETHOTKEY应用程序发送此消息让一个窗口与一个热键相关连



WM_GETHOTKEY应用程序发送此消息来判断热键与某个窗口是否有关联



WM_QUERYDRAGICON此消息发送给最小化窗口,当此窗口将要被拖放而它的类中没有定义图标,



应用程序能返回一个图标或光标的句柄,当用户拖放图标时系统显示这个图标或光标



WM_COMPAREITEM发送此消息来判定combobox或listbox新增加的项的相对位置



WM_COMPACTING显示内存已经很少了



WM_WINDOWPOSCHANGING发送此消息给那个窗口的大小和位置将要被改变时,来调用setwindowpos函数或其它窗口管理函数



WM_WINDOWPOSCHANGED发送此消息给那个窗口的大小和位置已经被改变时,来调用setwindowpos函数或其它窗口管理函数



WM_POWER当系统将要进入暂停状态时发送此消息



WM_COPYDATA当一个应用程序传递数据给另一个应用程序时发送此消息



WM_CANCELJOURNA当某个用户取消程序日志激活状态,提交此消息给程序



WM_NOTIFY当某个控件的某个事件已经发生或这个控件需要得到一些信息时,发送此消息给它的父窗口



WM_INPUTLANGCHANGEREQUEST当用户选择某种输入语言,或输入语言的热键改变



WM_INPUTLANGCHANGE当平台现场已经被改变后发送此消息给受影响的最顶级窗口



WM_TCARD当程序已经初始化windows帮助例程时发送此消息给应用程序



WM_HELP此消息显示用户按下了F1,如果某个菜单是激活的,就发送此消息个此窗口关联的菜单,



否则就发送给有焦点的窗口,如果当前都没有焦点,就把此消息发送给当前激活的窗口



WM_USERCHANGED当用户已经登入或退出后发送此消息给所有的窗口,当用户登入或退出时系统更新用户的具体设置信息,



在用户更新设置时系统马上发送此消息



WM_NOTIFYformAT公用控件,自定义控件和他们的父窗口通过此消息来判断控件是使用ANSI还是UNICODE结构



WM_CONTEXTMENU当用户某个窗口中点击了一下右键就发送此消息给这个窗口



WM_styleCHANGING当调用SETWINDOWLONG函数将要改变一个或多个窗口的风格时发送此消息给那个窗口



WM_styleCHANGED当调用SETWINDOWLONG函数一个或多个窗口的风格后发送此消息给那个窗口



WM_DISPLAYCHANGE当显示器的分辨率改变后发送此消息给所有的窗口



WM_GETICON此消息发送给某个窗口来返回与某个窗口有关连的大图标或小图标的句柄



WM_SETICON程序发送此消息让一个新的大图标或小图标与某个窗口关联



WM_NCCREATE当某个窗口第一次被创建时,此消息在WM_CREATE消息发送前发送



WM_NCDESTROY此消息通知某个窗口,非客户区正在销毁



WM_NCCALCSIZE当某个窗口的客户区域必须被核算时发送此消息



WM_NCHITTEST移动鼠标,按住或释放鼠标时发生



WM_NCPAINT程序发送此消息给某个窗口当它(窗口)的框架必须被绘制时



WM_NCACTIVATE此消息发送给某个窗口仅当它的非客户区需要被改变来显示是激活还是非激活状态



WM_GETDLGCODE发送此消息给某个与对话框程序关联的控件,widdows控制方位键和TAB键使输入进入此控件通过应



WM_NCMOUSEMOVE当光标在一个窗口的非客户区内移动时发送此消息给这个窗口非客户区为:窗体的标题栏及窗的边框体



WM_NCLBUTTONDOWN当光标在一个窗口的非客户区同时按下鼠标左键时提交此消息



WM_NCLBUTTONUP当用户释放鼠标左键同时光标某个窗口在非客户区十发送此消息



WM_NCLBUTTONDBLCLK当用户双击鼠标左键同时光标某个窗口在非客户区十发送此消息



WM_NCRBUTTONDOWN当用户按下鼠标右键同时光标又在窗口的非客户区时发送此消息



WM_NCRBUTTONUP当用户释放鼠标右键同时光标又在窗口的非客户区时发送此消息



WM_NCRBUTTONDBLCLK当用户双击鼠标右键同时光标某个窗口在非客户区十发送此消息



WM_NCMBUTTONDOWN当用户按下鼠标中键同时光标又在窗口的非客户区时发送此消息



WM_NCMBUTTONUP当用户释放鼠标中键同时光标又在窗口的非客户区时发送此消息



WM_NCMBUTTONDBLCLK当用户双击鼠标中键同时光标又在窗口的非客户区时发送此消息



WM_KEYFIRSTWM_KEYDOWN按下一个键



WM_KEYUP释放一个键



WM_CHAR按下某键,并已发出WM_KEYDOWN,WM_KEYUP消息



WM_DEADCHAR当用translatemessage函数翻译



WM_KEYUP消息时发送此消息给拥有焦点的窗口



WM_SYSKEYDOWN当用户按住ALT键同时按下其它,键时提交此消息给拥有焦点的窗口



WM_SYSKEYUP当用户释放一个键同时ALT键还按着时提交此消息给拥有焦点的窗口



WM_SYSCHAR当WM_SYSKEYDOWN消息被TRANSLATEMESSAGE函数翻译后提交此消息给拥有焦点的窗口



WM_SYSDEADCHAR当WM_SYSKEYDOWN消息被TRANSLATEMESSAGE函数翻译后发送此消息给拥有焦点的窗口



WM_INITDIALOG在一个对话框程序被显示前发送此消息给它,通常用此消息初始化控件和执行其它任务



WM_COMMAND当用户选择一条菜单命令项或当某个控件发送一条消息给它的父窗口,一个快捷键被翻译



WM_SYSCOMMAND当用户选择窗口菜单的一条命令或当用户选择最大化或最小化时那个窗口会收到此消息



WM_TIMER发生了定时器事件



WM_HSCROLL当一个窗口标准水平滚动条产生一个滚动事件时发送此消息给那个窗口,也发送给拥有它的控件



WM_VSCROLL当一个窗口标准垂直滚动条产生一个滚动事件时发送此消息给那个窗口也,发送给拥有它的控件



WM_INITMENU当一个菜单将要被激活时发送此消息,它发生在用户菜单条中的某项或按下某个菜单键,



它允许程序在显示前更改菜单



WM_INITMENUPOPUP当一个下拉菜单或子菜单将要被激活时发送此消息,它允许程序在它显示前更改菜单,而不要改变全部



WM_MENUSELECT当用户选择一条菜单项时发送此消息给菜单的所有者(一般是窗口)



WM_MENUCHAR当菜单已被激活用户按下了某个键(不同于加速键),发送此消息给菜单的所有者



WM_ENTERIDLE当一个模态对话框或菜单进入空载状态时发送此消息给它的所有者,



一个模态对话框或菜单进入空载状态就是在处理完一条或几条先前的消息后没有消息它的列队中等待



WM_CTLCOLORMSGBOX在windows绘制消息框前发送此消息给消息框的所有者窗口,通过响应这条消息,



所有者窗口可以通过使用给定的相关显示设备的句柄来设置消息框的文本和背景颜色



WM_CTLCOLOREDIT当一个编辑型控件将要被绘制时发送此消息给它的父窗口通过响应这条消息,



所有者窗口可以通过使用给定的相关显示设备的句柄来设置编辑框的文本和背景颜色



WM_CTLCOLORLISTBOX当一个列表框控件将要被绘制前发送此消息给它的父窗口通过响应这条消息,



所有者窗口可以通过使用给定的相关显示设备的句柄来设置列表框的文本和背景颜色



WM_CTLCOLORBTN当一个按钮控件将要被绘制时发送此消息给它的父窗口通过响应这条消息,



所有者窗口可以通过使用给定的相关显示设备的句柄来设置按纽的文本和背景颜色



WM_CTLCOLORDLG当一个对话框控件将要被绘制前发送此消息给它的父窗口通过响应这条消息,



所有者窗口可以通过使用给定的相关显示设备的句柄来设置对话框的文本背景颜色



WM_CTLCOLORSCROLLBAR当一个滚动条控件将要被绘制时发送此消息给它的父窗口通过响应这条消息,



所有者窗口可以通过使用给定的相关显示设备的句柄来设置滚动条的背景颜色



WM_CTLCOLORSTATIC当一个静态控件将要被绘制时发送此消息给它的父窗口通过响应这条消息,



所有者窗口可以通过使用给定的相关显示设备的句柄来设置静态控件的文本和背景颜色



WM_MOUSEFIRSTWM_MOUSEMOVE移动鼠标



WM_LBUTTONDOWN按下鼠标左键



WM_LBUTTONUP释放鼠标左键



WM_LBUTTONDBLCLK双击鼠标左键



WM_RBUTTONDOWN按下鼠标右键



WM_RBUTTONUP释放鼠标右键



WM_RBUTTONDBLCLK双击鼠标右键



WM_MBUTTONDOWN按下鼠标中键



WM_MBUTTONUP释放鼠标中键



WM_MBUTTONDBLCLK双击鼠标中键



WM_MOUSEWHEEL当鼠标轮子转动时发送此消息个当前有焦点的控件



WM_PARENTNOTIFY当MDI子窗口被创建或被销毁,或用户按了一下鼠标键而光标在子窗口上时发送此消息给它的父窗口



WM_ENTERMENULOOP发送此消息通知应用程序的主窗口that已经进入了菜单循环模式



WM_EXITMENULOOP发送此消息通知应用程序的主窗口that已退出了菜单循环模式



WM_SIZING当用户正在调整窗口大小时发送此消息给窗口通过此消息应用程序可以监视窗口大小和位置也可以修改他们



WM_CAPTURECHANGED发送此消息给窗口当它失去捕获的鼠标时



WM_MOVING当用户在移动窗口时发送此消息,通过此消息应用程序可以监视窗口大小和位置也可以修改他们



WM_POWERBROADCAST此消息发送给应用程序来通知它有关电源管理事件









WM_DEVICECHANGE当设备的硬件配置改变时发送此消息给应用程序或设备驱动程序



WM_MDIDESTROY应用程序发送此消息给多文档的客户窗口来关闭一个MDI子窗口



WM_MDIACTIVATE应用程序发送此消息给多文档的客户窗口通知客户窗口激活另一个MDI子窗口,



当客户窗口收到此消息后,它发出WM_MDIACTIVE消息给MDI子窗口(未激活)激活它



WM_MDIRESTORE程序发送此消息给MDI客户窗口让子窗口从最大最小化恢复到原来大小



WM_MDINEXT程序发送此消息给MDI客户窗口激活下一个或前一个窗口



WM_MDIMAXIMIZE程序发送此消息给MDI客户窗口来最大化一个MDI子窗口



WM_MDITILE程序发送此消息给MDI客户窗口以平铺方式重新排列所有MDI子窗口



WM_MDICASCADE程序发送此消息给MDI客户窗口以层叠方式重新排列所有MDI子窗口



WM_MDIICONARRANGE程序发送此消息给MDI客户窗口重新排列所有最小化的MDI子窗口



WM_MDIGETACTIVE程序发送此消息给MDI客户窗口来找到激活的子窗口的句柄



WM_MDISETMENU程序发送此消息给MDI客户窗口用MDI菜单代替子窗口的菜单



WM_CUT程序发送此消息给一个编辑框或combobox来删除当前选择的文本



WM_COPY程序发送此消息给一个编辑框或combobox来复制当前选择的文本到剪贴板



WM_PASTE程序发送此消息给editcontrol或combobox从剪贴板中得到数据



WM_CLEAR程序发送此消息给editcontrol或combobox清除当前选择的内容



WM_UNDO程序发送此消息给editcontrol或combobox撤消最后一次操作



WM_DESTROYCLIPBOARD当调用ENPTYCLIPBOARD函数时发送此消息给剪贴板的所有者



WM_DRAWCLIPBOARD当剪贴板的内容变化时发送此消息给剪贴板观察链的第一个窗口



它允许用剪贴板观察窗口来显示剪贴板的新内容



WM_PAINTCLIPBOARD当剪贴板包含CF_OWNERDIPLAY格式的数据并且剪贴板观察窗口的客户区需要重画



WM_SIZECLIPBOARD当剪贴板包含CF_OWNERDIPLAY格式的数据并且剪贴板观察窗口的客户区域的大小已经改变是



此消息通过剪贴板观察窗口发送给剪贴板的所有者



WM_ASKCBformATNAME通过剪贴板观察窗口发送此消息给剪贴板的所有者来请求一个CF_OWNERDISPLAY格式的剪贴板的名字



WM_CHANGECBCHAIN当一个窗口从剪贴板观察链中移去时发送此消息给剪贴板观察链的第一个窗口



WM_HSCROLLCLIPBOARD此消息通过一个剪贴板观察窗口发送给剪贴板的所有者它发生在当剪贴板包含CFOWNERDISPALY格式的数



据并且有个事件在剪贴板观察窗的水平滚动条上所有者应滚动剪贴板图象并更新滚动条的值



WM_QUERYNEWPALETTE此消息发送给将要收到焦点的窗口,此消息能使窗口在收到焦点时同时有机会实现他的逻辑调色板



WM_PALETTEISCHANGING当一个应用程序正要实现它的逻辑调色板时发此消息通知所有的应用程序



WM_PALETTECHANGED此消息在一个拥有焦点的窗口实现它的逻辑调色板后发送此消息给所有顶级并重叠的窗口,以此来改变系统



调色板



WM_HOTKEY当用户按下由REGISTERHOTKEY函数注册的热键时提交此消息



WM_PRINT应用程序发送此消息仅当WINDOWS或其它应用程序发出一个请求要求绘制一个应用程序的一部分











什么是消息?



消息系统对于一个win32程序来说十分重要,它是一个程序运行的动力源泉。一个消息,是系统定义的一个32位的值,他唯一的定义了一个事件,向Windows发出一个通知,告诉应用程序某个事情发生了。例如,单击鼠标、改变窗口尺寸、按下键盘上的一个键都会使Windows发送一个消息给应用程序。



消息本身是作为一个记录传递给应用程序的,这个记录中包含了消息的类型以及其他信息。例如,对于单击鼠标所产生的消息来说,这个记录中包含了单击鼠标时的坐标。这个记录类型叫做MSG,MSG含有来自windows应用程序消息队列的消息信息,它在Windows中声明如下:



typedefstructtagMsg



{



HWNDhwnd;接受该消息的窗口句柄



UINTmessage;消息常量标识符,也就是我们通常所说的消息号



WPARAMwParam;32位消息的特定附加信息,确切含义依赖于消息值



LPARAMlParam;32位消息的特定附加信息,确切含义依赖于消息值



DWORDtime;消息创建时的时间



POINTpt;消息创建时的鼠标/光标在屏幕坐标系中的位置



}MSG;



消息可以由系统或者应用程序产生。系统在发生输入事件时产生消息。举个例子,当用户敲键,移动鼠标或者单击控件。系统也产生消息以响应由应用程序带来的变化,比如应用程序改变系统字体改变窗体大小。应用程序可以产生消息使窗体执行任务,或者与其他应用程序中的窗口通讯。



消息中有什么?



我们给出了上面的注释,是不是会对消息结构有了一个比较清楚的认识?如果还没有,那么我们再试着给出下面的解释:



hwnd32位的窗口句柄。窗口可以是任何类型的屏幕对象,因为Win32能够维护大多数可视对象的句柄(窗口、对话框、按钮、编辑框等)。



message用于区别其他消息的常量值,这些常量可以是Windows单元中预定义的常量,也可以是自定义的常量。消息标识符以常量命名的方式指出消息的含义。当窗口过程接收到消息之后,他就会使用消息标识符来决定如何处理消息。例如、WM_PAINT告诉窗口过程窗体客户区被改变了需要重绘。符号常量指定系统消息属于的类别,其前缀指明了处理解释消息的窗体的类型。



wParam通常是一个与消息有关的常量值,也可能是窗口或控件的句柄。



lParam通常是一个指向内存中数据的指针。由于WParam、lParam和Pointer都是32位的,因此,它们之间可以相互转换。



消息标识符的值



系统保留消息标识符的值在0x0000在0x03ff(WM_USER-1)范围。这些值被系统定义消息使用。应用程序不能使用这些值给自己的消息。应用程序消息从WM_USER(0X0400)到0X7FFF,或0XC000到0XFFFF;WM_USER到0X7FFF范围的消息由应用程序自己使用;0XC000到0XFFFF范围的消息用来和其他应用程序通信,我们顺便说一下具有标志性的消息值:



WM_NULL---0x0000空消息。



0x0001----0x0087主要是窗口消息。



0x00A0----0x00A9非客户区消息



0x0100----0x0108键盘消息



0x0111----0x0126菜单消息



0x0132----0x0138颜色控制消息



0x0200----0x020A鼠标消息



0x0211----0x0213菜单循环消息



0x0220----0x0230多文档消息



0x03E0----0x03E8DDE消息



0x0400WM_USER



0x8000WM_APP



0x0400----0x7FFF应用程序自定义私有消息



消息有的分类?



其实,windows中的消息虽然很多,但是种类并不繁杂,大体上有3种:窗口消息、命令消息和控件通知消息。



窗口消息大概是系统中最为常见的消息,它是指由操作系统和控制其他窗口的窗口所使用的消息。例如CreateWindow、DestroyWindow和MoveWindow等都会激发窗口消息,还有我们在上面谈到的单击鼠标所产生的消息也是一种窗口消息。



命令消息,这是一种特殊的窗口消息,他用来处理从一个窗口发送到另一个窗口的用户请求,例如按下一个按钮,他就会向主窗口发送一个命令消息。



控件通知消息,是指这样一种消息,一个窗口内的子控件发生了一些事情,需要通知父窗口。通知消息只适用于标准的窗口控件如按钮、列表框、组合框、编辑框,以及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列表框获得输入焦点



队列消息和非队列消息



从消息的发送途径来看,消息可以分成2种:队列消息和非队列消息。消息队列由可以分成系统消息队列和线程消息队列。系统消息队列由Windows维护,线程消息队列则由每个GUI线程自己进行维护,为避免给non-GUI现成创建消息队列,所有线程产生时并没有消息队列,仅当线程第一次调用GDI函数数系统给线程创建一个消息队列。队列消息送到系统消息队列,然后到线程消息队列;非队列消息直接送给目的窗口过程。



对于队列消息,最常见的是鼠标和键盘触发的消息,例如WM_MOUSERMOVE,WM_CHAR等消息,还有一些其它的消息,例如:WM_PAINT、WM_TIMER和WM_QUIT。当鼠标、键盘事件被触发后,相应的鼠标或键盘驱动程序就会把这些事件转换成相应的消息,然后输送到系统消息队列,由Windows系统去进行处理。Windows系统则在适当的时机,从系统消息队列中取出一个消息,根据前面我们所说的MSG消息结构确定消息是要被送往那个窗口,然后把取出的消息送往创建窗口的线程的相应队列,下面的事情就该由线程消息队列操心了,Windows开始忙自己的事情去了。线程看到自己的消息队列中有消息,就从队列中取出来,通过操作系统发送到合适的窗口过程去处理。//有关Windows中消息的走向的说明



一般来讲,系统总是将消息Post在消息队列的末尾。这样保证窗口以先进先出的顺序接受消息。然而,WM_PAINT是一个例外,同一个窗口的多个WM_PAINT被合并成一个WM_PAINT消息,合并所有的无效区域到一个无效区域。合并WM_PAIN的目的是为了减少刷新窗口的次数。



非队列消息将会绕过系统队列和消息队列,直接将消息发送到窗口过程,。系统发送非队列消息通知窗口,系统发送消息通知窗口。例如,当用户激活一个窗口系统发送WM_ACTIVATE,WM_SETFOCUS,andWM_SETCURSOR。这些消息通知窗口它被激活了。非队列消息也可以由当应用程序调用系统函数产生。例如,当程序调用SetWindowPos系统发送WM_WINDOWPOSCHANGED消息。一些函数也发送非队列消息,例如下面我们要谈到的函数。



消息的发送



了解了上面的这些基础理论之后,我们就可以进行一下简单的消息发送与接收。



把一个消息发送到窗口有3种方式:发送、寄送和广播。



发送消息的函数有SendMessage、SendMessageCallback、SendNotifyMessage、SendMessageTimeout;寄送消息的函数主要有PostMessage、PostThreadMessage、PostQuitMessage;广播消息的函数我知道的只有BroadcastSystemMessage、BroadcastSystemMessageEx。



SendMessage的原型如下:LRESULTSendMessage(HWNDhWnd,UINTMsg,WPARAMwParam,LPARAMlParam),这个函数主要是向一个或多个窗口发送一条消息,一直等到消息被处理之后才会返回。不过需要注意的是,如果接收消息的窗口是同一个应用程序的一部分,那么这个窗口的窗口函数就被作为一个子程序马上被调用;如果接收消息的窗口是被另外的线程所创建的,那么窗口系统就切换到相应的线程并且调用相应的窗口函数,这条消息不会被放进目标应用程序队列中。函数的返回值是由接收消息的窗口的窗口函数返回,返回的值取决于被发送的消息。



PostMessage的原型如下:BOOLPostMessage(HWNDhWnd,UINTMsg,WPARAMwParam,LPARAMlParam),该函数把一条消息放置到创建hWnd窗口的线程的消息队列中,该函数不等消息被处理就马上将控制返回。需要注意的是,如果hWnd参数为HWND_BROADCAST,那么,消息将被寄送给系统中的所有的重叠窗口和弹出窗口,但是子窗口不会收到该消息;如果hWnd参数为NULL,则该函数类似于将dwThreadID参数设置成当前线程的标志来调用PostThreadMEssage函数。



从上面的这2个具有代表性的函数,我们可以看出消息的发送方式和寄送方式的区别所在:被发送的消息是否会被立即处理,函数是否立即返回。被发送的消息会被立即处理,处理完毕后函数才会返回;被寄送的消息不会被立即处理,他被放到一个先进先出的队列中,一直等到应用程序空线的时候才会被处理,不过函数放置消息后立即返回。



实际上,发送消息到一个窗口处理过程和直接调用窗口处理过程之间并没有太大的区别,他们直接的唯一区别就在于你可以要求操作系统截获所有被发送的消息,但是不能够截获对窗口处理过程的直接调用。



以寄送方式发送的消息通常是与用户输入事件相对应的,因为这些事件不是十分紧迫,可以进行缓慢的缓冲处理,例如鼠标、键盘消息会被寄送,而按钮等消息则会被发送。



广播消息用得比较少,BroadcastSystemMessage函数原型如下:



longBroadcastSystemMessage(DWORDdwFlags,LPDWORDlpdwRecipients,UINTuiMessage,WPARAMwParam,LPARAMlParam);



该函数可以向指定的接收者发送一条消息,这些接收者可以是应用程序、可安装的驱动程序、网络驱动程序、系统级别的设备驱动消息和他们的任意组合。需要注意的是,如果dwFlags参数是BSF_QUERY并且至少一个接收者返回了BROADCAST_QUERY_DENY,则返回值为0,如果没有指定BSF_QUERY,则函数将消息发送给所有接收者,并且忽略其返回值。

献花(0)
+1
(本文系邢孟哲图书...首藏)