Windows消息分类
Windows消息分类
Windows应用程序都是基于消息驱动的,消息一般分为标准Windows消息、控件通知消息和命令消息三大类。
1. 标准Windows消息
标准Windows消息,除WM_COMMAND消息外,所有以WM为前缀的消息都是标准Windows消息。
标准Windows消息只能由窗口类和视图类进行处理。
标准Windows消息都有黙认的处理函数,这些函数在CWnd类中过行了预定义,处理函数均以前缀On开头。
标准Windows消息主要分为三类:
(1)键盘消息
当用户按下键盘上的某一个键时,会产生WM_CHAR消息。
该消息的处理函数为OnChar.
(2) 鼠标消息
WM_MOUSEMOVE WM_LBUTTONDOWN WM_RBUTTONDOWN
(3)窗口消息
所有窗口的变化,包括内容重绘、窗口最大化、窗口重新定义大小、窗口滚动条滚动等产生的消息均属于窗口消息。
当调用成员函数UpdateWindow 或RedrawWindow要求重新绘制窗口内容时,将会发送WM_PAINT消息,当窗口最小化后再还原或被其它窗口遮盖后又移开时,也会发送WM_PAINT消息。
WM_PAINT消息的处理函数为OnPaint.
2. 控件消息(WM_COMMAND)
由控件产生的消息,例如按钮,列表框的选择等都会产生通告消息。
控件消息是从控件传送给父窗口的消息。
发送控件消息的控件在Visual C++中使用唯一ID号来进行标识,使用控件类来操纵相应的控件。
与标准Windows消息一样,控件消息也在视图类、窗口类进行处理。
但是,如果用户单击按钮控件,所发出的控件通知消息BN_CLICKED将作为命令消息来处理。
3. 命令消息(WM_COMMAND)
命令消息是菜单项、工具栏按钮、加速键等用户界面对象发送的WM_COMMAND消息。
命令消息可以被文档、视图、窗口、应用程序等对象处理。
发送命令消息的用户界面对象在Visual C++中也使用唯一的ID号来标识。
通过给界面和命令消息分配相同的ID号,可以把用户界面对象与命令联系起来。
Windows把非命令消息直接发送给窗口类对象,该窗口类中用于处理该消息的处理函数将被调用。
但是,对于命令消息,将把命令消息发送给多个候选对象(称为命令目标),目标中总有一个将调用该命令的处理函数。
注意:由于CWnd类派生于CCmdTarget类,所以凡是从CWnd派生的类,他们既可以接收标准消息,也可以接收命令消息和通告消息。
而对于从CCmdTarget类派生的类只能接收命令消息和通告消息,不能接受标准消息。
********************************************************************************************** MFC是Windows下程序设计的最流行的一个类库,但是该类库比较庞杂,尤其是它的消息映射机制,更是涉及到很多低层的东西,首先我在这里描述一下,Windows 的消息种类:
一般分的话有三种:
1. 标准消息:除了WM_COMMAND,所有的以WM 开头的消息都是标准消息,从CWnd 派生的类,都可以接受此消息。
2.命令消息
来自于菜单、加速键、或者工具栏按钮的消息,这类消息都以WM_COMMAND形式呈现,在MFC 中通过菜单项的标识(ID)来区分不同的命令消息(消息映射机制),在SDK中,通过消息的wParam 参数来区别不同的消息,从CCmdTarget派生的类,都可以接受这类消息。
3. 通告消息
由控件产生的消息,比如:按钮的单击、列表框的选择都会产生这类消息,目的是通告事件的发生,这类消息目的是为了向父窗口(通常是对话框)通知事件的发生,这类消息也是以WM_COMMAND形式呈现的,从CCmdTarget派生的类,都可以收到该消息。
消息类别
首先让我们来回顾一下Windows的消息分类。
l WM_XXX(除WM_COMMAND和WM_NOTIFY外)WINDOWS消息
硬件的输入消息或USER模块的窗口管理消息,任何派生自CWnd的类均可接收此消息。
l WM_COMMAND命令消息
l WH_KEYBOARD 监视键盘消息
l WH_MOUSE 监视鼠标消息
要想对某个窗口的消息进行挂钩,可以使用SPY++找到该窗口,设置要捕获消息的类型,开始捕捉后,可以看到列出的许多消息。每条消息的第三项有“S”、“R”、“P”字符,他们分别代表的意思:
//将存储起来的字符串写入文件
fzWriteFile(lpString);
//清除一些全局变量
g_hwndEdit = NULL;
ZeroMemory(g_lpszEditDump, 32);
HHOOK g_hhook1 = NULL; // Hook handle for thread-specific hook
HHOOK g_hhook2 = NULL;
const char g_classname1[] = "ComboBox";
nIndex, lpszComboBox);
//写入文件
fzWriteFile(lpszDump);
}
break;
HWND g_hwndEdit = NULL;
TCHAR g_lpszEditDump[32] = {0}; //键盘输入Edit控件的内容
BOOL g_fSingleEnter = true; //一次键盘输入POST两次WM_CHAR
Windows编程技术09-常用消息.pdf
系统消息
取消计时器
可以通过KillTimer函数用于取消一个计时器: BOOL KillTimer(int nIDEvent) nIDEvent是计时器在本窗口内的唯一标识,用于指示取 消哪个计数器。 下面的代码取消一个编号为1的计时器: KillTimer(1);
6
系统消息
WM_PAINT
WM_NCDESTROY
Windows向窗口发送的最后一个消息就是WM_NCDESTROY,该消息 由OnNcDestroy函数处理。基类的OnNcDestroy执行一些默认的清除工作, 如释放基类内部为窗口分配的内存等,然后调用虚成员函数PostNcDestroy 。如果用户需要执行自己的清除操作,则应重载PostNcDestroy。
PostMessage把消息放入消息队列后立即返回
LRESULT PostMessage( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam );
//目标窗口的句柄 // 消息标识 // 参数1 //参数2
9
自定义消息
消息接收
定义消息 #ifndef WM_MYMESSAGE #define WM_MYMESSAGE WM_USER +1 #endif 建立消息映射 BEGIN_MESSAGE_MAP(TheClass,CBaseClass) ON_MESSAGE(WM_MYMESSAGE,OnMymessage) END_MESSAGE_MAP() 声明消息处理函数 afx_msg void OnMymessage(WPARAM wParam,LPARAM lParam); DECLARE_MESSAGE_MAP() 定义消息处理函数 void TheClass::OnMymessage(WPARAM wParam,LPARAM lParam) {
windows消息机制
windows消息机制分类:windows类windows timerwindows的所谓事件驱动核心是消息!消息分为进队消息消息和非进队消息。
所谓进队消息就是windows将消息发送到每个线程所专有的队列中,然后由程序自主处理,这种消息基本上是由用户输入产生(wm_keydown,wm_keyup,wm_char,wm_mouse**,以及wm_paint,wm_timer,wm_quit)或者是调用postmessage,postthreadmessage产生的消息;所谓的非进队消息就是直接发送给窗口过程的消息,就是直接调用窗口过程,上述消息以外的一般都是这种类型!一个线程一旦建立了至少一个窗口,则系统就为其分配一个消息队列。
主要表现形式为系统为其分配一个THREADINFO结构,该结构有四个指针分别指向登记消息队列,发送消息队列,应答消息队列和虚拟输入队列。
如果想将消息放入登记消息队列,可以调用postmessage,或者postthreadmessage。
其余的消息队列主要用于处理如下的事务。
当某线程调用sendmessage给别的线程创建的窗口时,发送的消息首先追加到接收线程的发送消息队列,发送线程处于空闲状态,等待接收线程处理完他的消息返回给发送线程的应答队列,等到后发送线程被唤醒取得应答队列的消息(就是处理完消息的返回值),继续执行。
而虚拟输入队列则是由windows的系统线程RIT(原始输入线程)负责将硬件事件转换成消息添加到对应线程的虚拟消息队列中。
处理消息队列的顺序。
首先windows绝对不是按队列先进先出的次序来处理的,而是有一定优先级的。
优先级通过消息队列的状态标志来实现的。
首先最高优先级的是别的线程发过来的消息(通过sendmessage),其次是处理登记消息队列消息,再次处理QS_QUIT标志,再处理虚拟输入队列,再处理wm_paint最后是wm_timer!。
windows消息大全
Windows消息大全什么是Windows消息?Windows消息是在Windows操作系统中用于应用程序之间进行通信的一种机制。
通过发送和接收消息,应用程序可以向其他应用程序发送命令、请求数据或通知一些事件的发生。
Windows操作系统提供了一系列的系统消息,同时也允许应用程序自定义和发送消息。
系统消息Windows操作系统中的系统消息由操作系统负责发送和处理,这些消息通常涉及到操作系统的各个方面。
下面是一些常见的系统消息:1.WM_CREATE:当窗口被创建时发送。
2.WM_DESTROY:当窗口被销毁时发送。
3.WM_PAINT:当窗口需要绘制时发送。
4.WM_CLOSE:当用户关闭窗口时发送。
5.WM_QUIT:当应用程序需要退出时发送。
6.WM_SIZE:当窗口大小改变时发送。
7.WM_MOUSEMOVE:当鼠标移动时发送。
8.WM_KEYDOWN:当按下键盘上的一个键时发送。
这只是一小部分系统消息的例子,Windows操作系统中还有很多其他的系统消息可供使用。
自定义消息除了系统消息,应用程序还可以自定义消息以实现应用程序之间的通信。
自定义消息通常基于用户定义的消息号。
下面是一些自定义消息的例子:1.WM_MY_MESSAGE1:用户自定义的消息1。
2.WM_MY_MESSAGE2:用户自定义的消息2。
3.WM_MY_MESSAGE3:用户自定义的消息3。
自定义消息的消息号必须在WM_USER之后,以避免与系统消息冲突。
消息参数除了发送消息本身外,应用程序还可以使用参数来传递额外的信息。
参数通常包含在消息的wParam和lParam字段中。
•wParam表示一个无符号的整数,用于传递一些简单的数值信息。
•lParam通常表示一个指针,指向一些复杂的数据结构。
应用程序可以根据消息的含义和需要来使用这些参数。
如何发送和接收消息在Windows操作系统中,应用程序可以使用函数来发送和接收消息。
Windows消息大全
Windows消息大全消息映射宏的种类:为了简化程序员的工作,MFC定义了一系列的消息映射宏和像AfxSig_vv这样的枚举变量,以及标准消息处理函数,并且具体地实现这些函数。
这里主要讨论消息映射宏,常用的分为以下几类。
1. 用于Windows消息的宏,前缀为“ON_WM_”。
这样的宏不带参数,因为它对应的消息和消息处理函数的函数原型是确定的。
MFC提供了这类消息处理函数的定义和缺省实现。
每个这样的宏处理不同的Windows消息。
例如:宏ON_WM_CREATE()把消息WM_CREATE映射到OnCreate函数,消息映射条目的第一个成员nMessage指定为要处理的Windows消息的ID,第二个成员nCode 指定为0。
2. 用于命令消息的宏ON_COMMAND这类宏带有参数,需要通过参数指定命令ID和消息处理函数。
这些消息都映射到WM_COMMAND上,也就是将消息映射条目的第一个成员nMessage指定为WM_COMMAND,第二个成员nCode指定为CN_COMMAND(即0)。
消息处理函数的原型是void (void),不带参数,不返回值。
除了单条命令消息的映射,还有把一定范围的命令消息映射到一个消息处理函数的映射宏ON_COMMAND_RANGE。
这类宏带有参数,需要指定命令ID的范围和消息处理函数。
这些消息都映射到WM_COMMAND上,也就是将消息映射条目的第一个成员nMessage指定为WM_COMMAND,第二个成员nCode指定为CN_COMMAND(即0),第三个成员nID和第四个成员nLastID指定了映射消息的起止范围。
消息处理函数的原型是void (UINT),有一个UINT类型的参数,表示要处理的命令消息ID,不返回值。
3. 用于控制通知消息的宏这类宏可能带有三个参数,如ON_CONTROL,就需要指定控制窗口ID,通知码和消息处理函数;也可能带有两个参数,如具体处理特定通知消息的宏ON_BN_CLICKED、ON_LBN_DBLCLK、ON_CBN_EDITCHANGE等,需要指定控制窗口ID和消息处理函数。
windows消息机制
windows消息机制消息本身是作为一个记录传递给应用程序的,这个记录中包含了消息的类型以及其他信息。
例如,对于单击鼠标所产生的消息来说,这个记录中包含了单击鼠标时的坐标。
基于windows的应用程序是基于事件驱动的。
他们不会显式地调用函数获得输入,而是等待操作系统把输入传给应用程序。
一个消息从产生到被一个窗口响应,其中有5个步骤:1) 系统中发生了某个事件。
2) Windows把这个事件翻译为消息,然后把它放到消息队列中。
3) 应用程序从消息队列中接收到这个消息,把它存放在TMsg记录中。
4) 应用程序把消息传递给一个适当的窗口的窗口过程。
5) 窗口过程响应这个消息并进行处理。
一、消息类型消息主要分为两种:一是系统定义消息;二是自定义消息。
(1)系统定义消息每一个系统定义消息都有一个唯一的消息标识符和相对应的符号常量(在系统SDK的头文件中定义的),这些标识符和常量代表着消息意图。
常量的前缀代表着可以解释处理消息的窗口的类型,一般情况下,第一个字母为控件的头一个字母,第二个字母是M的是消息(Message)常量,S是风格(Style)常量,N是通知、事件(Notify)。
下面列出系统定义消息的前缀所代表的消息类别的清单。
Prefix Message categoryABM Application desktop toolbarBM Button controlCB Combo box controlCBEM Extended combo box controlCDM Common dialog boxDBT DeviceDL Drag list boxDM Default push button controlDTM Date and time picker controlEM Edit controlHDM Header controlHKM Hot key controlIPM IP address controlLB List box controlLVM List view controlMCM Month calendar controlPBM Progress barPGM Pager controlPSM Property sheetRB Rebar controlSB Status bar windowSBM Scroll bar controlSTM Static controlTB ToolbarTBM TrackbarTCM Tab controlTTM Tooltip controlTVM Tree-view controlUDM Up-down controlWM General window在SDK中事先定义好的消息,非用户定义的,其范围在[0x0000, 0x03ff]之间,还可以分为以下三类:1>窗口消息(Windows Message)与窗口的内部运作有关,如创建窗口,绘制窗口,销毁窗口等。
Windows系统定义的消息类别
WM_CHARTOITEM = 0x002F,
WM_SETFONT = 0x0030,
WM_GETFONT = 0x0031,
WM_SETHOTKEY = 0x0032,
WM_GETHOTKEY = 0x0033,
WM_QUERYDRAGICON = 0x0037,
TB 工具栏消息
TBM 跟踪条控件消息
TCM Tab 控件消息
TTM Tooltip控件消息
TVM 树形控件消息
UDM Up-down 控件消息
WM 普通窗口消息
******************************************
Windows消息类
WM_NULL = 0x0000,
WM_MENUDRAG = 0x0123,
WM_MENUGETOBJECT = 0x0124,
WM_UNINITMENUPOPUP = 0x0125,
WM_MENUCOMMAND = 0x0126,
WM_CHANGEUISTATE = 0x0127,
WM_UPDATEUISTATE = 0x0128,
Windows系统定义的消息类别
消息标识符前缀 消息分类
ABM 应用桌面工具栏消息
BM 按钮控件消息
CB 组合框控件消息
CBEM 扩展组合框控件消息
CDM 通用对话框消息
DBT 设备消息
DL 拖曳列表框控件消息
DM 默认按钮控件消息
DTM 日期时间选取控件消息
EM 编辑控件消息
WM_SETCURSOR = 0x0020,
Windows窗口消息大全
Window s窗口消息大全#消息,就是指Win dows发出的一个通知,告诉应用程序某个事情发生了。
例如,单击鼠标、改变窗口尺寸、按下键盘上的一个键都会使Wind ows发送一个消息给应用程序。
消息本身是作为一个记录传递给应用程序的,这个记录中包含了消息的类型以及其他信息。
例如,对于单击鼠标所产生的消息来说,这个记录中包含了单击鼠标时的坐标。
这个记录类型叫做TMs g,#它在Wind ows单元中是这样声明的:#type#TMsg = packed record#hwnd: HWND; / /窗口句柄#messag e: UINT; / /消息常量标识符#wParam: WPARAM ; // 32位消息的特定附加信息#lParam: LPARAM ; // 32位消息的特定附加信息#time: DWORD; / /消息创建时的时间#pt: TPoint; / /消息创建时的鼠标位置#end;#消息中有什么?#是否觉得一个消息记录中的信息像希腊语一样?如果是这样,那么看一看下面的解释:#hwnd 32位的窗口句柄。
窗口可以是任何类型的屏幕对象,因为Win32能够维护大多数可视对象的句柄(窗口、对话框、按钮、编辑框等)。
#messag e 用于区别其他消息的常量值,这些常量可以是Wind ows单元中预定义的常量,也可以是自定义的常量。
#wParam通常是一个与消息有关的常量值,也可能是窗口或控件的句柄。
#lParam通常是一个指向内存中数据的指针。
由于W P a r a m、l P a r a m和P o i n t e r都是3 2位的,#因此,它们之间可以相互转换。
WM_NUL L = 0x0000;WM_CRE ATE = 0x0001;#应用程序创建一个窗口WM_DES TROY= 0x0002;#一个窗口被销毁WM_MOV E = 0x0003;#移动一个窗口WM_SIZ E = 0x0005;#改变一个窗口的大小WM_ACT IVATE = 0x0006;#一个窗口被激活或失去激活状态;WM_SET FOCUS = 0x0007;#获得焦点后WM_KIL LFOCU S = 0x0008;#失去焦点WM_ENA BLE = 0x000A;#改变enab le状态WM_SET REDRA W = 0x000B;#设置窗口是否能重画WM_SET TEXT= 0x000C;#应用程序发送此消息来设置一个窗口的文本WM_GET TEXT= 0x000D;#应用程序发送此消息来复制对应窗口的文本到缓冲区WM_GET TEXTL ENGTH = 0x000E;#得到与一个窗口有关的文本的长度(不包含空字符)WM_PAI NT = 0x000F;#要求一个窗口重画自己WM_CLO SE = 0x0010;#当一个窗口或应用程序要关闭时发送一个信号WM_QUE RYEND SESSI ON = 0x0011;#当用户选择结束对话框或程序自己调用Exit Windo ws函数WM_QUI T = 0x0012;#用来结束程序运行或当程序调用po stqui tmess age函数WM_QUE RYOPE N = 0x0013;#当用户窗口恢复以前的大小位置时,把此消息发送给某个图标WM_ERA SEBKG ND = 0x0014;#当窗口背景必须被擦除时(例在窗口改变大小时)WM_SYS COLOR CHANG E = 0x0015;#当系统颜色改变时,发送此消息给所有顶级窗口WM_END SESSI ON = 0x0016;#当系统进程发出WM_Q UERYE NDSES SION消息后,此消息发送给应用程序,#通知它对话是否结束WM_SYS TEMER ROR = 0x0017;WM_SHO WWIND OW = 0x0018;#当隐藏或显示窗口是发送此消息给这个窗口WM_ACT IVATE APP = 0x001C;#发此消息给应用程序哪个窗口是激活的,哪个是非激活的;WM_FON TCHAN GE = 0x001D;#当系统的字体资源库变化时发送此消息给所有顶级窗口WM_TIM ECHAN GE = 0x001E;#当系统的时间变化时发送此消息给所有顶级窗口WM_CAN CELMO DE = 0x001F;#发送此消息来取消某种正在进行的摸态(操作)WM_SET CURSO R = 0x0020;#如果鼠标引起光标在某个窗口中移动且鼠标输入没有被捕获时,就发消息给某个窗口WM_MOU SEACT IVATE = 0x0021;#当光标在某个非激活的窗口中而用户正按着鼠标的某个键发送此消息给当前窗口WM_CHI LDACT IVATE = 0x0022;#发送此消息给MDI子窗口当用户点击此窗口的标题栏,或当窗口被激活,移动,改变大小WM_QUE UESYN C = 0x0023;#此消息由基于计算机的训练程序发送,通过WH_J OURNA LPALY BACK的hook程序#分离出用户输入消息WM_GET MINMA XINFO = 0x0024;#此消息发送给窗口当它将要改变大小或位置;WM_PAI NTICO N = 0x0026;#发送给最小化窗口当它图标将要被重画WM_ICO NERAS EBKGN D = 0x0027;#此消息发送给某个最小化窗口,仅当它在画图标前它的背景必须被重画WM_NEX TDLGC TL = 0x0028;#发送此消息给一个对话框程序去更改焦点位置WM_SPO OLERS TATUS = 0x002A;#每当打印管理列队增加或减少一条作业时发出此消息WM_DRA WITEM = 0x002B;#当butto n,combob ox,listbo x,menu的可视外观改变时发送#此消息给这些空件的所有者WM_MEA SUREI TEM = 0x002C;#当butto n, combobox, list box, list view contro l, or menu item 被创建时#发送此消息给控件的所有者WM_DEL ETEIT EM = 0x002D;#当the list box 或combobox 被销毁或当某些项被删除通过LB_DELET ESTRI NG, LB_RES ETCON TENT, CB_DEL ETEST RING, or CB_RES ETCON TENT消息WM_VKE YTOIT EM = 0x002E;#此消息有一个LBS_W ANTKE YBOAR DINPU T风格的发出给它的所有者来响应WM_KE YDOWN 消息WM_CHA RTOIT EM = 0x002F;#此消息由一个LBS_W ANTKE YBOAR DINPU T风格的列表框发送给他的所有者来响应WM_CHAR 消息WM_SET FONT= 0x0030;#当绘制文本时程序发送此消息得到控件要用的颜色WM_GET FONT= 0x0031;#应用程序发送此消息得到当前控件绘制文本的字体WM_SET HOTKE Y = 0x0032;#应用程序发送此消息让一个窗口与一个热键相关连WM_GET HOTKE Y = 0x0033;#应用程序发送此消息来判断热键与某个窗口是否有关联WM_QUE RYDRA GICON = 0x0037;#此消息发送给最小化窗口,当此窗口将要被拖放而它的类中没有定义图标,应用程序能返回一个图标或光标的句柄,当用户拖放图标时系统显示这个图标或光标WM_COM PAREI TEM = 0x0039;#发送此消息来判定com bobox或list box新增加的项的相对位置WM_GET OBJEC T = 0x003D;WM_COM PACTI NG = 0x0041;#显示内存已经很少了WM_WIN DOWPO SCHAN GING= 0x0046;#发送此消息给那个窗口的大小和位置将要被改变时,来调用set windo wpos函数或其它窗口管理函数WM_WIN DOWPO SCHAN GED = 0x0047;#发送此消息给那个窗口的大小和位置已经被改变时,来调用set windo wpos函数或其它窗口管理函数WM_POW ER = 0x0048;(适用于16位的wind ows)#当系统将要进入暂停状态时发送此消息WM_COP YDATA = 0x004A;#当一个应用程序传递数据给另一个应用程序时发送此消息WM_CAN CELJO URNAL = 0x004B;#当某个用户取消程序日志激活状态,提交此消息给程序WM_NOT IFY = 0x004E;#当某个控件的某个事件已经发生或这个控件需要得到一些信息时,发送此消息给它的父窗口WM_INP UTLAN GCHAN GEREQ UEST= 0x0050;#当用户选择某种输入语言,或输入语言的热键改变WM_INP UTLAN GCHAN GE = 0x0051;#当平台现场已经被改变后发送此消息给受影响的最顶级窗口WM_TCA RD = 0x0052;#当程序已经初始化win dows帮助例程时发送此消息给应用程序WM_HEL P = 0x0053;#此消息显示用户按下了F1,如果某个菜单是激活的,就发送此消息个此窗口关联的菜单,否则就#发送给有焦点的窗口,如果当前都没有焦点,就把此消息发送给当前激活的窗口WM_USE RCHAN GED = 0x0054;#当用户已经登入或退出后发送此消息给所有的窗口,当用户登入或退出时系统更新用户的具体#设置信息,在用户更新设置时系统马上发送此消息;WM_NOT IFYFO RMAT= 0x0055;#公用控件,自定义控件和他们的父窗口通过此消息来判断控件是使用A NSI还是UNICO DE结构#在WM_NO TIFY消息,使用此控件能使某个控件与它的父控件之间进行相互通信WM_CON TEXTM ENU = 0x007B;#当用户某个窗口中点击了一下右键就发送此消息给这个窗口WM_STY LECHA NGING = 0x007C;#当调用SET WINDO WLONG函数将要改变一个或多个窗口的风格时发送此消息给那个窗口WM_STY LECHA NGED= 0x007D;#当调用SET WINDO WLONG函数一个或多个窗口的风格后发送此消息给那个窗口WM_DIS PLAYC HANGE = 0x007E;#当显示器的分辨率改变后发送此消息给所有的窗口WM_GET ICON= 0x007F;#此消息发送给某个窗口来返回与某个窗口有关连的大图标或小图标的句柄;WM_SET ICON= 0x0080;#程序发送此消息让一个新的大图标或小图标与某个窗口关联;WM_NCC REATE = 0x0081;#当某个窗口第一次被创建时,此消息在WM_CREA TE消息发送前发送;WM_NCD ESTRO Y = 0x0082;#此消息通知某个窗口,非客户区正在销毁WM_NCC ALCSI ZE = 0x0083;#当某个窗口的客户区域必须被核算时发送此消息WM_NCH ITTES T = 0x0084;//移动鼠标,按住或释放鼠标时发生WM_NCP AINT= 0x0085;#程序发送此消息给某个窗口当它(窗口)的框架必须被绘制时;WM_NCA CTIVA TE = 0x0086;#此消息发送给某个窗口仅当它的非客户区需要被改变来显示是激活还是非激活状态;WM_GET DLGCO DE = 0x0087;#发送此消息给某个与对话框程序关联的控件,widdow s控制方位键和TAB键使输入进入此控件#通过响应WM_GETD LGCOD E消息,应用程序可以把他当成一个特殊的输入控件并能处理它WM_NCM OUSEM OVE = 0x00A0;#当光标在一个窗口的非客户区内移动时发送此消息给这个窗口//非客户区为:窗体的标题栏及窗的边框体WM_NCL BUTTO NDOWN = 0x00A1;#当光标在一个窗口的非客户区同时按下鼠标左键时提交此消息WM_NCL BUTTO NUP = 0x00A2;#当用户释放鼠标左键同时光标某个窗口在非客户区十发送此消息;WM_NCL BUTTO NDBLC LK = 0x00A3;#当用户双击鼠标左键同时光标某个窗口在非客户区十发送此消息WM_NCR BUTTO NDOWN = 0x00A4;#当用户按下鼠标右键同时光标又在窗口的非客户区时发送此消息WM_NCR BUTTO NUP = 0x00A5;#当用户释放鼠标右键同时光标又在窗口的非客户区时发送此消息WM_NCR BUTTO NDBLC LK = 0x00A6;#当用户双击鼠标右键同时光标某个窗口在非客户区十发送此消息WM_NCM BUTTO NDOWN = 0x00A7;#当用户按下鼠标中键同时光标又在窗口的非客户区时发送此消息WM_NCM BUTTO NUP = 0x00A8;#当用户释放鼠标中键同时光标又在窗口的非客户区时发送此消息WM_NCM BUTTO NDBLC LK = 0x00A9;#当用户双击鼠标中键同时光标又在窗口的非客户区时发送此消息WM_KEY FIRST = 0x0100;WM_KEY DOWN= 0x0100;#//按下一个键WM_KEY UP = 0x0101;#//释放一个键WM_CHA R = 0x0102;#//按下某键,并已发出WM_KEYD OWN, WM_KEY UP消息WM_DEA DCHAR = 0x0103;#当用tran slate messa ge函数翻译WM_K EYUP消息时发送此消息给拥有焦点的窗口WM_SYS KEYDO WN = 0x0104;#当用户按住A LT键同时按下其它键时提交此消息给拥有焦点的窗口;WM_SYS KEYUP = 0x0105;#当用户释放一个键同时A LT 键还按着时提交此消息给拥有焦点的窗口WM_SYS CHAR= 0x0106;#当WM_SY SKEYD OWN消息被TRAN SLATE MESSA GE函数翻译后提交此消息给拥有焦点的窗口WM_SYS DEADC HA R = 0x0107;#当WM_SY SKEYD OWN消息被TRAN SLATE MESSA GE函数翻译后发送此消息给拥有焦点的窗口WM_KEY LAST= 0x0108;WM_INI TDIAL OG = 0x0110;#在一个对话框程序被显示前发送此消息给它,通常用此消息初始化控件和执行其它任务WM_COM MAND= 0x0111;#当用户选择一条菜单命令项或当某个控件发送一条消息给它的父窗口,一个快捷键被翻译WM_SYS COMMA ND = 0x0112;#当用户选择窗口菜单的一条命令或当用户选择最大化或最小化时那个窗口会收到此消息WM_TIM ER = 0x0113; //发生了定时器事件WM_HSC ROLL= 0x0114;#当一个窗口标准水平滚动条产生一个滚动事件时发送此消息给那个窗口,也发送给拥有它的控件WM_VSC ROLL= 0x0115;#当一个窗口标准垂直滚动条产生一个滚动事件时发送此消息给那个窗口也,发送给拥有它的控件 WM_INI TMENU = 0x0116;#当一个菜单将要被激活时发送此消息,它发生在用户菜单条中的某项或按下某个菜单键,它允许程序在显示前更改菜单WM_INI TMENU POPUP = 0x0117;#当一个下拉菜单或子菜单将要被激活时发送此消息,它允许程序在它显示前更改菜单,而不要改变全部WM_MEN USELE CT = 0x011F;#当用户选择一条菜单项时发送此消息给菜单的所有者(一般是窗口)WM_MEN UCHAR = 0x0120;#当菜单已被激活用户按下了某个键(不同于加速键),发送此消息给菜单的所有者;WM_ENT ERIDL E = 0x0121;#当一个模态对话框或菜单进入空载状态时发送此消息给它的所有者,一个模态对话框或菜单进入空载状态就是在处理完一条或几条先前的消息后没有消息它的列队中等待WM_MEN URBUT TONUP = 0x0122;WM_MEN UDRAG = 0x0123;WM_MEN UGETO BJECT = 0x0124;WM_UNI NITME NUPOP UP = 0x0125;WM_MEN UCOMM AND = 0x0126;WM_CHA NGEUI STATE = 0x0127;WM_UPD ATEUI STATE = 0x0128;WM_QUE RYUIS TATE= 0x0129;WM_CTL COLOR MSGBO X = 0x0132;#在windo ws绘制消息框前发送此消息给消息框的所有者窗口,通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置消息框的文本和背景颜色WM_CTL COLOR EDIT= 0x0133;#当一个编辑型控件将要被绘制时发送此消息给它的父窗口;通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置编辑框的文本和背景颜色WM_CTL COLOR LISTB OX = 0x0134;#当一个列表框控件将要被绘制前发送此消息给它的父窗口;通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置列表框的文本和背景颜色WM_CTL COLOR BTN = 0x0135;#当一个按钮控件将要被绘制时发送此消息给它的父窗口;通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置按纽的文本和背景颜色WM_CTL COLOR DLG = 0x0136;#当一个对话框控件将要被绘制前发送此消息给它的父窗口;通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置对话框的文本背景颜色WM_CTL COLOR SCROL LBAR=0x0137;#当一个滚动条控件将要被绘制时发送此消息给它的父窗口;通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置滚动条的背景颜色WM_CTL COLOR STATI C = 0x0138;#当一个静态控件将要被绘制时发送此消息给它的父窗口;通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置静态控件的文本和背景颜色WM_MOU SEFIR ST = 0x0200;WM_MOU SEMOV E = 0x0200;#// 移动鼠标WM_LBU TTOND OWN = 0x0201;#//按下鼠标左键WM_LBU TTONU P = 0x0202;#//释放鼠标左键WM_LBU TTOND BLCLK = 0x0203;#//双击鼠标左键WM_RBU TTOND OW N = 0x0204;#//按下鼠标右键WM_RBU TTONU P = 0x0205;#//释放鼠标右键WM_RBU TTOND BLCLK = 0x0206;#//双击鼠标右键WM_MBU TTOND OW N = 0x0207;#//按下鼠标中键WM_MBU TTONU P = 0x0208;#//释放鼠标中键WM_MBU TTOND BLCLK = 0x0209;#//双击鼠标中键WM_MOU SEWHE EL = 0x020A;#当鼠标轮子转动时发送此消息个当前有焦点的控件WM_MOU SELAS T = 0x020A;WM_PAR ENTNO TIFY= 0x0210;#当MDI子窗口被创建或被销毁,或用户按了一下鼠标键而光标在子窗口上时发送此消息给它的父窗口WM_ENT ERMEN ULOOP = 0x0211;#发送此消息通知应用程序的主窗口t hat已经进入了菜单循环模式WM_EXI TMENU LOOP= 0x0212;#发送此消息通知应用程序的主窗口t hat已退出了菜单循环模式WM_NEX TMENU = 0x0213;WM_SIZ ING = 532;#当用户正在调整窗口大小时发送此消息给窗口;通过此消息应用程序可以监视窗口大小和位置也可以修改他们WM_CAP TUREC HANGE D = 533;#发送此消息给窗口当它失去捕获的鼠标时;WM_MOV ING = 534;#当用户在移动窗口时发送此消息,通过此消息应用程序可以监视窗口大小和位置也可以修改他们;WM_POW ERBRO ADCAS T = 536;#此消息发送给应用程序来通知它有关电源管理事件;WM_DEV ICECH ANGE= 537;#当设备的硬件配置改变时发送此消息给应用程序或设备驱动程序WM_IME_STAR TCOMP OSITI ON = 0x010D;WM_IME_ENDC OMPOS ITION = 0x010E;WM_IME_COMP OSITI ON = 0x010F;WM_IME_KEYL AST = 0x010F;WM_IME_SETC ONTEX T = 0x0281;WM_IME_NOTI FY = 0x0282;WM_IME_CONT ROL = 0x0283;WM_IME_COMP OSITI ONFUL L = 0x0284;WM_IME_SELE CT = 0x0285;WM_IME_CHAR = 0x0286;WM_IME_REQU EST = 0x0288;WM_IME_KEYD OWN = 0x0290;WM_IME_KEYU P = 0x0291;WM_MDI CREAT E = 0x0220;#应用程序发送此消息给多文档的客户窗口来创建一个MDI子窗口WM_MDI DESTR OY = 0x0221;#应用程序发送此消息给多文档的客户窗口来关闭一个MDI子窗口WM_MDI ACTIV ATE = 0x0222;#应用程序发送此消息给多文档的客户窗口通知客户窗口激活另一个MD I子窗口,当客户窗口收到此消息后,它发出WM_MDIAC TIVE消息给MDI子窗口(未激活)激活它;WM_MDI RESTO RE = 0x0223;#程序发送此消息给MDI客户窗口让子窗口从最大最小化恢复到原来大小WM_MDI NEXT= 0x0224;#程序发送此消息给MDI客户窗口激活下一个或前一个窗口WM_MDI MAXIM IZE = 0x0225;#程序发送此消息给MDI客户窗口来最大化一个MDI子窗口;WM_MDI TILE= 0x0226;#程序发送此消息给MDI客户窗口以平铺方式重新排列所有MD I子窗口WM_MDI CASCA DE = 0x0227;#程序发送此消息给MDI客户窗口以层叠方式重新排列所有MD I子窗口WM_MDI ICONA RRANG E = 0x0228;#程序发送此消息给MDI客户窗口重新排列所有最小化的MDI子窗口WM_MDI GETAC TIVE= 0x0229;#程序发送此消息给MDI客户窗口来找到激活的子窗口的句柄WM_MDI SETME NU = 0x0230;#程序发送此消息给MDI客户窗口用MD I菜单代替子窗口的菜单WM_ENT ERSIZ EMOVE = 0x0231;WM_EXI TSIZE MOVE= 0x0232;WM_DRO PFILE S = 0x0233;WM_MDI REFRE SHMEN U = 0x0234;WM_MOU SEHOV ER = 0x02A1;WM_MOU SELEA VE = 0x02A3;WM_CUT = 0x0300;#程序发送此消息给一个编辑框或co mbobo x来删除当前选择的文本WM_COP Y = 0x0301;#程序发送此消息给一个编辑框或co mbobo x来复制当前选择的文本到剪贴板WM_PAS TE = 0x0302;#程序发送此消息给edi tcont rol或c ombob ox从剪贴板中得到数据WM_CLE A R = 0x0303;#程序发送此消息给edi tcont rol或c ombob ox清除当前选择的内容;WM_UND O = 0x0304;#程序发送此消息给edi tcont rol或c ombob ox撤消最后一次操作WM_REN DERFO RMAT= 0x0305;WM_REN DERAL LFORM ATS = 0x0306;WM_DES TROYC LIPBO A RD = 0x0307;#当调用ENP TYCLI PBOAR D函数时发送此消息给剪贴板的所有者WM_DRA WCLIP BOARD = 0x0308;#当剪贴板的内容变化时发送此消息给剪贴板观察链的第一个窗口;它允许用剪贴板观察窗口来显示剪贴板的新内容;WM_PAI NTCLI PBOAR D = 0x0309;#当剪贴板包含CF_OW NERDI PLAY格式的数据并且剪贴板观察窗口的客户区需要重画;WM_VSC ROLLC LIPBO ARD = 0x030A;WM_SIZ ECLIP BOARD = 0x030B;#当剪贴板包含CF_OW NERDI PLAY格式的数据并且剪贴板观察窗口的客户区域的大小已经改变是此消息通过剪贴板观察窗口发送给剪贴板的所有者;WM_ASK CBFOR MATNA ME = 0x030C;#通过剪贴板观察窗口发送此消息给剪贴板的所有者来请求一个CF_O WNERD ISPLA Y格式的剪贴板的名字WM_CHA NGECB CHAIN = 0x030D;#当一个窗口从剪贴板观察链中移去时发送此消息给剪贴板观察链的第一个窗口;WM_HSC ROLLC LIPBO ARD = 0x030E;#此消息通过一个剪贴板观察窗口发送给剪贴板的所有者;它发生在当剪贴板包含C FOWNE RDISP ALY格式的数据并且有个事件在剪贴板观察窗的水平滚动条上;所有者应滚动剪贴板图象并更新滚动条的值;WM_QUE RYNEW PALET TE = 0x030F;#此消息发送给将要收到焦点的窗口,此消息能使窗口在收到焦点时同时有机会实现他的逻辑调色板WM_PAL ETTEI SCHAN GING=0x0310;#当一个应用程序正要实现它的逻辑调色板时发此消息通知所有的应用程序WM_PAL ETTEC HANGE D = 0x0311;#此消息在一个拥有焦点的窗口实现它的逻辑调色板后发送此消息给所有顶级并重叠的窗口,以此来改变系统调色板WM_HOT KEY = 0x0312;#当用户按下由REGIS TERHO TKEY函数注册的热键时提交此消息WM_PRI NT = 791;#应用程序发送此消息仅当WINDO WS或其它应用程序发出一个请求要求绘制一个应用程序的一部分;WM_PRI NTCLI ENT = 792;WM_HAN DHELD FIRST = 856;WM_HAN DHELD LAST= 863;WM_PEN WINFI RST = 0x0380;WM_PEN WINLA ST = 0x038F;WM_COA LESCE_FIRS T = 0x0390;WM_COA LESCE_LAST = 0x039F;WM_DDE_FIRS T = 0x03E0;WM_DDE_INIT IATE= WM_DDE_FIRS T + 0;#一个DDE客户程序提交此消息开始一个与服务器程序的会话来响应那个指定的程序和主题名;WM_DDE_TERM INATE = WM_DDE_FIRS T + 1;#一个DDE应用程序(无论是客户还是服务器)提交此消息来终止一个会话;WM_DDE_ADVI SE = WM_DDE_FIRS T + 2;#一个DDE客户程序提交此消息给一个DDE服务程序来请求服务器每当数据项改变时更新它WM_DDE_UNAD VISE= WM_DDE_FIRS T + 3;#一个DDE客户程序通过此消息通知一个DDE服务程序不更新指定的项或一个特殊的剪贴板格式的项WM_DDE_ACK= WM_DDE_FIRS T + 4;#此消息通知一个DDE(动态数据交换)程序已收到并正在处理W M_DDE_POKE, WM_DDE_EXEC UTE, WM_DDE_DATA, WM_DDE_ADVI SE, WM_DDE_UNAD VISE,or WM_DDE_INIT IAT消息WM_DDE_DATA = WM_DDE_FIRS T + 5;#一个DDE服务程序提交此消息给D DE客户程序来传递个一数据项给客户或通知客户的一条可用数据项WM_DDE_REQU EST = WM_DDE_FIRS T + 6;#一个DDE客户程序提交此消息给一个DDE服务程序来请求一个数据项的值;WM_DDE_POKE = WM_DDE_FIRS T + 7;#一个DDE客户程序提交此消息给一个DDE服务程序,客户使用此消息来请求服务器接收一个未经同意的数据项;服务器通过答复WM_D DE_AC K消息提示是否它接收这个数据项;WM_DDE_EXEC UTE = WM_DDE_FIRS T + 8;#一个DDE客户程序提交此消息给一个DDE服务程序来发送一个字符串给服务器让它象串行命令一样被处理,服务器通过提交WM_D DE_AC K消息来作回应;WM_DDE_LAST = WM_DDE_FIRS T + 8;WM_APP = 0x8000;WM_USE R = 0x0400;#此消息能帮助应用程序自定义私有消息;。
windows消息
除了键盘、鼠标消息以外,队列消息还有WM_PAINT、WM_TIMER和WM_QUIT。这些队列消息以外的绝大多数消息是非队列消息。
<2>.系统消息和应用程序消息
从消息的来源来看,可以分为:系统定义的消息和应用程序定义的消息。
系统消息ID的范围是从0到WM_USER-1,或0X80000到0XBFFFF;应用程序消息从WM_USER(0X0400)到0X7FFF,或0XC000到0XFFFF;WM_USER到0X7FFF范围的消息
LPARAM lParam
);
窗口类型:
可重叠窗口(Overlapped Window),
弹出窗口(Pop-up Window),
子窗口(Child Window)
窗口之间的关系: 父子关系,拥有关系,前后关系。
2.线程
一个进程至少拥有一个线程,称为主线程,如果一个线程创建了窗口,拥有GUI资源,那么也称该线程为GUI线程,否则就为工作线程。窗口是由线程创建的,
创建窗口的线程就拥有该窗口。这种线程拥有关系的概念对窗口有重要的意义:建立窗口的线程必须是为窗口处理所有消息的线程。为了使这个概念更加明
1.窗口
Windows程序是由一系列的窗口构成的,每个窗口都有自己的窗口过程,窗口过程就是一个拥有有固定 Signature 的 C函数,具体格式如下:
LRESULT CALLBACK WindowProc(HWND hwnd,
UINT uMsg,
WPARAM wParam,
(3).控件通知消息
WM_NOTIFY消息,当用户与控件交互(Edit, Button...)时,通知消息会从控件窗口发送到父窗口,这种消息的目的不是为了处理用户命令,而是为了让父窗
第1章 Windows系统的消息机制
第1章Windows系统的消息机制对诸如PowerBuilder(后文简写为PB)、Visual Basic和Dephi等大多数可视化程序设计语言来讲,程序设计的核心是对象的事件、属性和方法,但对Windows系统本身而言,却是以消息处理为其控制机制。
Windows把系统中的对象都作为窗口来对待,每个窗口都有一个用来标识其身份的句柄。
Windows通过向窗口发送消息,在开发语言中转化为对象的事件,然后驱动对象,响应用户的动作。
在许多面向对象的可视化程序设计语言中,Windows的众多消息已经演变成了对象的属性或方法。
本章内容包括Windows系统的消息机制、消息的发送、消息的应用实例等。
1.1 Windows的工作机制1.1.1 Windows 的工作方式——窗口、事件和消息全面地讨论Windows的内部工作机制需要很大的篇幅,对于一般的PB用户当然没有必要深入了解所有的技术细节。
Windows系统的工作机制,简单地说就是3个关键的概念:窗口、事件和消息。
不妨简单地将窗口看做带有边界的矩形区域。
读者也许已经了解多种不同类型的窗口,如Windows系统的“资源管理器”窗口、文字处理程序中的文档窗口或者弹出提示有约会信息的消息对话框窗口等。
除了这些最普通的窗口外,实际上还有许多其他类型的窗口。
命令按钮是一个窗口,图标、文本框、选项按钮和菜单条也都是窗口。
Windows 操作系统通过给每一个窗口指定一个惟一的标识号(窗口句柄,常用hWnd表示)来管理所有的窗口。
操作系统连续地监视每一个窗口的活动或事件的信号。
事件可以通过诸如单击鼠标或按下按键的操作而产生,也可以通过程序的控制而产生,甚至可以由另一个窗口的操作而产生。
每发生一次事件,将引发一条消息发送至操作系统。
操作系统处理该消息并广播给其他窗口。
然后,每一个窗口才能根据自身处理该条消息的指令而采取适当的操作(例如,当窗口解除了其他窗口的覆盖时,重新绘制自身窗口)。
