定义
windows消息,就是指Windows发出的一个通知,告诉应用程序某个事情发生了。例如,单击鼠标、改变窗口尺寸、按下键盘上的一个键都会使Windows发送一个消息给应用程序。消息本身是作为一个记录传递给应用程序的,这个记录中包含了消息的类型以及其他信息。例如,对于单击鼠标所产生的消息来说,这个记录中包含了单击鼠标时的坐标。这个记录类型在C++叫做MSG,在DelPhi中为TMsg。
附:Delphi和C/C++数据类型对照表
https://blog.csdn.net/edisator/article/details/42804045
MSG
typedef struct tagMSG {
HWND hwnd; //消息所属的窗口句柄
UINT message; //消息类型标识符,Windows将消息对应的数值定义为WM_XXX宏,比如:鼠标左键按下消息是WM_LBUTTONDOWN,键盘按下消息是WM_KEYDOWN,字符消息是WM_CHAR,等等
WPARAM wParam; //消息附加内容,通常是一个与消息有关的常量值,也可能是窗口或控件的句柄
LPARAM lParam; //消息附加内容, 通常是一个指向内存中数据的指针。wParam、lParam表示的信息随消息的不同而不同。
DWORD time; //投递到消息队列的时间
POINT pt; //鼠标的当前位置
#ifdef _MAC
DWORD lPrivate;
#endif
} MSG, *PMSG, NEAR *NPMSG, FAR *LPMSG;
附:消息标识符常量具体介绍见:https://www.jianshu.com/p/4bb349b170d1
消息分类
1.系统定义消息(System-Defined Messages)
(1)标准消息
除WM_COMMAND之外,所有以WM_开头的消息都是标准消息,如窗口、鼠标移动、窗口大小改变等,程序启动或退出甚至每一段固定的时间都会产生标准Windows消息。
1) 键盘消息
对于窗口而言,来自用户的按键输入可分为两类,一类是系统键,另一类则是非系统键。
ALT和其它键一同按下的组合称为“系统键”,窗口收到系统键之后,会自动地将它解释成系统事件,或者查阅键盘加速表,将系统键翻译成加速表指定的信息。
2)鼠标消息
当鼠标在某个窗口内移动时,Windows会不断地发出鼠标移动消息WM_MOUSEMOVE,并把鼠标的最新位置传给该窗口。如果在窗口的范围内按下鼠标左键,系统就会发出“按下左键”的WM_LBUTTONDOWN消息给该窗口,等到用户放开按键后,再发出“放开左键”的WM_LBUTTONUP消息给该窗口。
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
其中,nFlags为此事件发生时,鼠标按键、键盘控制键的状态,可以是以下值的任意组合:
当用户按下CTRL键时,nFlags设置为MK_CONTROL。
当用户按下鼠标左键时,nFlags设置为MK_LBUTTON。
当用户按下鼠标中键时,nFlags设置为MK_MBUTTON。
point为鼠标的位置
(2)命令消息
来自菜单,加速键或工具栏按钮的消息。这类消息都以WM——COMMAND形式呈现。WM_COMMAND, LOWORD(wParam)表示菜单项,工具栏按钮或一般控件的ID如编辑框,按钮等。如果是控件, HIWORD(wParam)表示控件消息类型
(3)通告消息
由复杂控件产生的消息。这类消息也是以WM——COMMAND形式呈现。 这是最灵活的消息格式, 其Message, wParam, lParam分别为:WM_NOTIFY, 控件ID,指向NMHDR的指针。NMHDR包含控件通知的内容, 可以任意扩展
2.程序定义消息(Application-Defined Messages)
用户自定义的消息, 对于其范围有如下规定:
WM_USER: 0x0400-0x7FFF (ex. WM_USER+10)