系统消息



Window消息来源有下面4种

  • 输入消息
  • 控制消息
  • 系统消息
  • 用户消息

 

Windows消息分布

消息范围说 明
0 ~ 0x03FF(WM_USER – 1)系统消息
0x0400(WM_USER) ~ 0x7FFF(WM_APP - 1)自己定义窗体类整数消息
0x0800(WM_APP) ~ 0xBFFF应用程序自己定义消息
0xC000 ~ 0xFFFF应用程序字符串消息
> 0xFFFF为以后系统应用保留

 

通知消息-button

通知消息-列表框

消息名称说 明消息名称说 明
BN_CLICKED单击buttonLBN_DBLCLK用户双击了一项
BN_DISABLEbutton被禁止LBN_ERRSPACE列表框内存不足
BN_DOUBLECLICKED双击buttonLBN_KILLFOCUS列表框正在失去输入焦点
BN_HILITE加亮buttonLBN_SELCANCEL用户选择被取消
BN_PAINTbutton应当重画LBN_SELCHANGE用户选择将改变
BN_UNHILITE加亮应当去掉LBN_SETFOCUS列表框获得输入焦点

 

通知消息-组合框

通知消息-编辑框

消息名称说 明消息名称说 明
CBN_CLOSEUP组合框的列表框被关闭EN_CHANGE编辑框中的文本己更新
CBN_DBLCLK用户双击了一个字符串EN_ERRSPACE编辑框内存不足
CBN_DROPDOWN组合框的列表框被拉下EN_HSCROLL用户点击了水平滚动栏
CBN_EDITCHANGE用户改动了组合框中的文本EN_KILLFOCUS编辑框失去输入焦点
CBN_EDITUPDATE组合框内的文本即将更新EN_MAXTEXT插入的内容被截断
CBN_ERRSPACE组合框内存不足EN_SETFOCUS编辑框获得输入焦点
CBN_KILLFOCUS组合框失去输入焦点EN_UPDATE编辑框中的文本将要更新
CBN_SELCHANGE在组合框中选择了一项EN_VSCROLL用户点击了垂直滚动栏
CBN_SELENDCANCEL用户的选择将被忽略 
CBN_SELENDOK用户的选择将被运行
CBN_SETFOCUS组合框获得输入焦点

 

经常使用Windows消息

消息名称说 明
WM_NULL0×0000空消息,此消息将被接收窗体忽略
WM_CREATE0×0001应用程序创建一个窗体
WM_DESTROY0×0002一个窗体被销毁
WM_MOVE0×0003移动一个窗体
WM_SIZE0×0005改变一个窗体的大小
WM_ACTIVATE0×0006一个窗体被激活或失去激活状态
WM_SETFOCUS0×0007获得焦点后
WM_KILLFOCUS0×0008失去焦点
WM_ENABLE0x000A应用程序Enable状态改变时产生
WM_SETREDRAW0x000B设置窗体能否重画
WM_SETTEXT0x000C应用程序发送此消息来设置一个窗体的文本
WM_GETTEXT0x000D应用程序发送此消息来复制相应窗体的文本到缓冲区
WM_GETTEXTLENGTH0x000E得到与一个窗体有关的文本的长度(不包括空字符)
WM_PAINT0x000F要求一个窗体重绘自己
InvalidateRect 无效窗体,然后会向窗体发送一个 WM_PAINT 消息
普通情况下,最新的消息总是放到队列的末尾,可是WM_PAINT消息是唯一例外的,为了优化屏幕的绘制,系统对WM_PAINT消息採取了特殊的处理,搜寻仅仅有当消息队列中没有其它消息时,该消息才会被传递给窗体过程进行处理,其次,同一个窗体的多个WM_PAINT消息会被合并为一个WM_PAINT消息,组合全部的带绘制的无效区域合并为一个区域.
WM_CLOSE0×0010当一个窗体或应用程序要关闭时发送一个信号
当请求关闭一个窗体时,向该窗体发送WM_CLOSE消息,应用程序能够弹出对话框,要求用户确认时候要真的关闭窗体
(与WM_DESTROY差别,WM_DERTROY消息用来通知窗体正在被销毁,处理该消息以释放窗体分配的资源,在窗体被销毁时,WM_DESTROY消息会被调用,而WM_CLOSE则是用来询问是否关闭窗体;但关闭窗体并不总会导致WM_CLOSE发生)
WM_QUERYENDSESSION0×0011用户选择结束对话框或应用程序自己调用ExitWindows()函数
WM_QUIT0×0012用来结束程序执行或应用程序调用Postquitmessage()函数来产生此消息
WM_QUERYOPEN0×0013当用户窗体恢复曾经的大小位置时,把此消息发送给某个图标
WM_ERASEBKGND0×0014当窗体背景必须被擦除时(比如在窗体改变大小时)
WM_SYSCOLORCHANGE0×0015当系统颜色改变时。发送此消息给全部顶级窗体
WM_ENDSESSION0×0016当系统进程发出WM_QUERYENDSESSION消息后,此消息发送给应用程序
WM_SHOWWINDOW0×0018当隐藏或显示窗体是发送此消息给这个窗体
WM_ACTIVATEAPP0x001C当某个窗体将被激活时,将被激活窗体和当前活动(即将失去激活)窗体会收到此消息。发此消息给应用程序哪个窗体是激活的。哪个是非激活的
WM_FONTCHANGE0x001D当系统的字体资源库变化时发送此消息给全部顶级窗体
WM_TIMECHANGE0x001E当系统的时间变化时发送此消息给全部顶级窗体
WM_CANCELMODE0x001F发送此消息来取消某种正在进行的操作
WM_SETCURSOR0×0020假设鼠标引起光标在某个窗体中移动且鼠标输入没有被捕获时,发消息给该窗体
WM_MOUSEACTIVATE0×0021当光标在某个非激活的窗体中而用户正按着鼠标的某个键发送此消息给当前窗体
WM_CHILDACTIVATE0×0022发送此消息给MDI子窗体当用户点击此窗体的标题栏,或当窗体被激活、移动、改变大小
WM_QUEUESYNC0×0023此消息由基于计算机的训练程序发送。通过WH_JOURNALPALYBACK的Hook程序分离出用户输入消息
WM_GETMINMAXINFO0×0024当窗体要将要改变大小或位置时。发送此消息给该窗体
WM_PAINTICON0×0026当窗体图标将要被重绘时,发送此消息给该窗体
WM_ICONERASEBKGND0×0027在一个最小化窗体的图标在重绘前,当图标背景必须被重绘时,发送此消息给该窗体
WM_NEXTDLGCTL0×0028发送此消息给一个对话框程序以更改焦点位置
WM_SPOOLERSTATUS0x002A当打印管理列队添加或降低一条作业时发出此消息
WM_DRAWITEM0x002B当Button。ComboBox,Listbox,Menu控件的外观改变时。发送此消息给这些控件的全部者
WM_MEASUREITEM0x002C当Button,ComboBox,list box,ListView。Menu 项被创建时,发送此消息给控件的全部者
WM_DELETEITEM0x002D当ListBox 或 ComboBox 被销毁或当某些项通过发送LB_DELETESTRING、LB_RESETCONTENT、 CB_DELETESTRING、CB_RESETCONTENT 消息被删除时。发送此消息给控件的全部者
WM_VKEYTOITEM0x002E一个具有LBS_WANTKEYBOARDINPUT风格的ListBox控件发送此消息给它的全部者,以此来响应WM_KEYDOWN消息
WM_CHARTOITEM0x002F一个具有LBS_WANTKEYBOARDINPUT风格的ListBox控件发送此消息给它的全部者,以此来响应WM_CHAR消息
WM_SETFONT0×0030应用程序绘制控件时,发送此消息得到以何种字体绘制控件中的文本
WM_GETFONT0×0031应用程序发送此消息得到当前控件绘制文本的字体
WM_SETHOTKEY0×0032应用程序发送此消息让一个窗体与一个热键相关联
WM_GETHOTKEY0×0033应用程序发送此消息来推断热键与某个窗体是否有关联
WM_QUERYDRAGICON0×0037此消息发送给最小化窗体,当此窗体将要被拖放而它的类中未定义图标,应用程序就返回一个图标或光标的句柄。当用户拖放图标时系统显示这个图标或光标
WM_COMPAREITEM0×0039发送此消息来判定ComboBox或ListBox新添加的项的相对位置
WM_COMPACTING0×0041显示内存已经非常少了
WM_WINDOWPOSCHANGING0×0046当调用SetWindowPos()函数改变窗体的大小和位置后,发送此消息给该窗体
WM_POWER0×0048当系统将进入挂起状态时发送此消息给全部进程
WM_COPYDATA0x004A当一个应用程序传递数据给还有一个应用程序时发送此消息
WM_CANCELJOURNAL0x004B当某个用户取消程序日志激活状态,发送此消息给应用程序
WM_NOTIFY0x004E当某个控件的某个事件已经发生或这个控件须要得到一些信息时。发送此消息给它的父窗体
WM_INPUTLANGCHANGEREQUEST0×0050当用户选择某种输入语言。或输入语言的热键改变
WM_INPUTLANGCHANGE0×0051当应用程序输入语言改变后发送此消息给受影响的最顶级窗体
WM_TCARD0×0052当应用程序已经初始化Windows帮助例程时发送此消息给应用程序
WM_HELP0×0053当用户按下了F1,假设某个菜单是激活的,就发送此消息给此窗体关联的菜单,否则就发送给有焦点的窗体,假设当前都没有焦点,就把此消息发送给当前激活的窗体
WM_USERCHANGED0×0054当用户已经登录或退出后发送此消息给全部的窗体,当用户登录或退出时系统更新用户的详细设置信息。在用户更新设置时系统立即发送此消息
WM_NOTIFYFORMAT0×0055公用控件和它们的父窗体通过此消息来推断在WM_NOTIFY消息中是使用ANSI还是UNICODE形式的结构,使用此控件能使某个控件与它的父控件进行相互通信
WM_CONTEXTMENU0x007B当用户在某个窗体中点击右键,则发送此消息给该窗体
WM_STYLECHANGING0x007C当将要调用SetWindowLong()函数窗体的一个或多个风格时,发送此消息给该窗体
WM_STYLECHANGED0x007D当调用SetWindowLong()函数改变了窗体的一个或多个风格后,发送此消息给该窗体
WM_DISPLAYCHANGE0x007E当显示器的分辨率改变后发送此消息给全部的窗体
WM_GETICON0x007F发送此消息给某个窗体。返回与某个窗体有关联的大图标或小图标的句柄
WM_SETICON0×0080应用程序发送此消息让一个新的大图标或小图标与某个窗体关联
WM_NCCREATE0×0081当某个窗体第一次被创建时,此消息在WM_CREATE消息被发送前发送
WM_NCDESTROY0×0082此消息通知某个窗体,正在销毁非客户区
DestroyWindow函数将在发送WM_DESTROY消息自后紧接着发送该消息,该消息是窗体生存周期内的最后一个消息,
(WM_DESTROY在全部的子窗口销毁之前发出而WM_NCDESTROY在全部的子窗口被销毁后发出的消息)
WM_NCCALCSIZE0×0083当计算某个窗体的客户区大小和位置时发送此消息
WM_NCHITTEST0×0084移动鼠标。按住或释放鼠标时产生此消息
WM_NCPAINT0×0085当某个窗体的框架必须被绘制时。应用程序发送此消息给该窗体
WM_NCACTIVATE0×0086通过改变某个窗体的非客户区来表示窗体是处于激活还是非激活状态时。此消息被发送给该窗体
WM_NCMOUSEMOVE0x00A0当光标在窗体的非客户区(窗体标题栏及边框)内移动时发送此消息给该窗体
WM_NCLBUTTONDOWN0x00A1当光标在窗体的非客户区并按下鼠标左键时发送此消息
WM_NCLBUTTONUP0x00A2当光标在窗体的非客户区并释放鼠标左键时发送此消息
WM_NCLBUTTONDBLCLK0x00A3当光标在窗体的非客户区并双击鼠标左键时发送此消息
WM_NCRBUTTONDOWN0x00A4当光标在窗体的非客户区并按下鼠标右键时发送此消息
WM_NCRBUTTONUP0x00A5当光标在窗体的非客户区并释放鼠标右键时发送此消息
WM_NCRBUTTONDBLCLK0x00A6当光标在窗体的非客户区并双击鼠标右键时发送此消息
WM_NCMBUTTONDOWN0x00A7当光标在窗体的非客户区并按下鼠标中键时发送此消息
WM_NCMBUTTONUP0x00A8当光标在窗体的非客户区并释放鼠标中键时发送此消息
WM_NCMBUTTONDBLCL0x00A9当光标在窗体的非客户区并双击鼠标中键时发送此消息
WM_KEYDOWN0×0100按下一个非系统键(按下键时未按下“ALT”键)
WM_KEYUP0×0101释放一个非系统键
WM_CHAR0×0102按下某键,当TranslateMessage()转发WM_KEYDOWN后发送本消息
WM_DEADCHAR0×0103释放某键,当TranslateMessage()转发WM_KEYUP后发送本消息
WM_SYSKEYDOWN0×0104当按住ALT键同一时候按下其它键时发送此消息给拥有键盘焦点的窗体
WM_SYSKEYUP0×0105当释放一个键同一时候按住ALT键时发送此消息给拥有键盘焦点的窗体
WM_SYSCHAR0×0106当TranslateMessage()转发WM_SYSKEYDOWN后发送此消息给拥有键盘焦点的窗体
WM_SYSDEADCHAR0×0107当TranslateMessage()转发WM_SYSKEYUP后发送此消息给拥有键盘焦点的窗体
WM_INITDIALOG0×0110在被显示前发送此消息对话框,通经常使用此消息初始化控件和运行其它任务
WM_COMMAND0×0111选择窗体菜单项或某个控件发送一条消息给它的父窗体或按下一个快捷键时产生此消息
WM_SYSCOMMAND0×0112选择窗体菜单项或选择最大化或最小化时,发送此消息给该窗体
WM_TIMER0×0113发生了定时器事件
WM_HSCROLL0×0114当窗体水平滚动栏产生一个滚动事件时发送此消息给该窗体和滚动栏的全部者
WM_VSCROLL0×0115当窗体垂直滚动栏产生一个滚动事件时发送此消息给该窗体和滚动栏的全部者
WM_INITMENU0×0116当一个菜单将要被激活时发送此消息,它发生在按下菜单项或按下菜单快捷键时,它同意程序在显示前更改菜单
WM_INITMENUPOPUP0×0117当一个下拉菜单或子菜单将要被激活时发送此消息,它同意显示前在改动菜单而不必更改整个菜单
WM_MENUSELECT0x011F选择一条菜单项时发送此消息给菜单的全部者(通常是窗体)
WM_MENUCHAR0×0120当菜单已被激活且用户按下了某个键(非快捷键),发送此消息给菜单的全部者
WM_ENTERIDLE0×0121当一个有模式对话框或菜单进入空暇状态时发送此消息给它的全部者,空暇状态指在处理完一条或几条先前的消息后,消息列队为空
WM_MENURBUTTONUP0×0122当光标位于菜单项上时,释放鼠标右键产生此消息
WM_MENUDRAG0×0123当拖动菜单项时,发送此消息给拖放菜单的全部者
WM_MENUGETOBJECT0×0124当光标移入菜单项或者从菜单项中心移到菜单项顶部或底部时,发送此消息给拖放菜单的全部者
WM_UNINITMENUPOPUP0×0125当下拉菜单或者子菜单被销毁时产生此消息
WM_MENUCOMMAND0×0126当用户选择菜单项时产生此消息
WM_CHANGEUISTATE0×0127应用程序发送此消息表明用户界面(UI)状态应当被改变
WM_UPDATEUISTATE0×0128应用程序发送此消息改变指定窗体及其子窗体的用户界面(UI)状态
WM_QUERYUISTATE0×0129应用程序发送此消息得到某个窗体的用户界面(UI)状态
WM_CTLCOLORMSGBOX0×0132绘制消息框前发送此消息给它的父窗体。通过响应这条消息,父窗体能够通过使用给定的相关显示设备的句柄来设置消息框的文本和背景颜色
WM_CTLCOLOREDIT0×0133绘制编辑型控件前发送此消息给它的父窗体,可用来设置编辑框的文本和背景颜色
WM_CTLCOLORLISTBOX0×0134绘制列表框控件前发送此消息给它的父窗体。可用来设置编辑框的文本和背景颜色
WM_CTLCOLORBTN0×0135绘制button控件前发送此消息给它的父窗体,可用来设置编辑框的文本和背景颜色
WM_CTLCOLORDLG0×0136绘制对话框前发送此消息给它的父窗体,可用来设置编辑框的文本和背景颜色
WM_CTLCOLORSCROLLBAR0×0137绘制滚动栏控件前发送此消息给它的父窗体。可用来设置滚动栏控件的文本和背景颜色
WM_CTLCOLORSTATIC0×0138绘制静态控件前发送此消息给它的父窗体,可用来设置静态控件的文本和背景颜色
WM_MOUSEMOVE0×0200鼠标移动
WM_LBUTTONDOWN0×0201按下鼠标左键
WM_LBUTTONUP0×0202释放鼠标左键
WM_LBUTTONDBLCLK0×0203双击鼠标左键
WM_RBUTTONDOWN0×0204按下鼠标右键
WM_RBUTTONUP0×0205释放鼠标右键
WM_RBUTTONDBLCLK0×0206双击鼠标右键
WM_MBUTTONDOWN0×0207按下鼠标中键
WM_MBUTTONUP0×0208释放鼠标中键
WM_MBUTTONDBLCLK0×0209双击鼠标中键
WM_MOUSEWHEEL0x020A当鼠标滚轮转动时发送此消息给当前获得焦点的窗体
WM_PARENTNOTIFY0×0210当MDI子窗体被创建或被销毁。或当光标位于子窗体上且用户按了一下鼠标键时,发送此消息给它的父窗体
WM_ENTERMENULOOP0×0211发送此消息通知应用程序的主窗体进程已经进入了菜单模式循环
WM_EXITMENULOOP0×0212发送此消息通知应用程序的主窗体进程已经退出了菜单模式循环
WM_SIZING0×0214调整窗体大小时发送此消息给窗体,通过此消息应用程序能够监视或改动窗体大小和位置
WM_CAPTURECHANGED0×0215当窗体设定为不捕获鼠标事件时,发送此消息给该窗体
WM_MOVING0×0216移动窗体时发送此消息给窗体。通过此消息应用程序能够监视或改动窗体大小和位置
WM_POWERBROADCAST0×0218发送此消息给应用程序通知它有关电源管理事件
WM_DEVICECHANGE0×0219当设备的硬件配置改变时发送此消息给应用程序或设备驱动程序
WM_MDICREATE0×0220应用程序发送此消息给多文档的客户窗体来创建一个MDI 子窗体
WM_MDIDESTROY0×0221应用程序发送此消息给多文档的客户窗体来关闭一个MDI 子窗体
WM_MDIACTIVATE0×0222应用程序发送此消息给多文档的客户窗体通知客户窗体激活还有一个MDI子窗体,当客户窗体收到此消息后,它发出WM_MDIACTIVE消息给MDI子窗体(未激活)来激活它
WM_MDIRESTORE0×0223应用程序发送此消息给MDI客户窗体通知子窗体恢复到原来大小
WM_MDINEXT0×0224应用程序发送此消息给MDI客户窗体激活下一个或前一个窗体
WM_MDIMAXIMIZE0×0225应用程序发送此消息给MDI客户窗体以最大化一个MDI子窗体
WM_MDITILE0×0226应用程序发送此消息给MDI客户窗体以平铺方式又一次排列全部MDI子窗体
WM_MDICASCADE0×0227应用程序发送此消息给MDI客户窗体以层叠方式又一次排列全部MDI子窗体
WM_MDIICONARRANGE0×0228应用程序发送此消息给MDI客户窗体又一次排列全部最小化的MDI子窗体
WM_MDIGETACTIVE0×0229应用程序发送此消息给MDI客户窗体以找到激活的子窗体的句柄
WM_MDISETMENU0×0230应用程序发送此消息给MDI客户窗体用MDI菜单取代子窗体的菜单
WM_ENTERSIZEMOVE0×0231当窗体进入移动或改变大小模式循环时,发送此消息给该窗体
WM_EXITSIZEMOVE0×0232当窗体退出移动或改变大小模式循环时。发送此消息给该窗体
WM_DROPFILES0×0233当用户在应用程序窗体中拖动某个文件时,产生此消息
WM_MDIREFRESHMENU0×0234应用程序发送此消息给MDI客户窗体以刷新窗体菜单
WM_MOUSEHOVER0x02A1当光标在窗体客户区悬停超过TrackMouseEvent()指定的时间时,发送此消息给该窗体
WM_MOUSELEAVE0x02A3当光标离开窗体客户区超过TrackMouseEvent()指定的时间时,发送此消息给该窗体
WM_CUT0×0300应用程序发送此消息给一个编辑框或ComboBox以删除当前选择的文本
WM_COPY0×0301应用程序发送此消息给一个编辑框或ComboBox以复制当前选择的文本到剪贴板
WM_PASTE0×0302应用程序发送此消息给一个编辑框或ComboBox以从剪贴板中得到数据
WM_CLEAR0×0303应用程序发送此消息给一个编辑框或ComboBox以清除当前选择的内容
WM_UNDO0×0304应用程序发送此消息给一个编辑框或ComboBox以撤消最后一次操作
WM_DESTROYCLIPBOARD0×0307当调用EmptyClipboard()清空剪贴板时,发送此消息给剪贴板全部者
WM_DRAWCLIPBOARD0×0308当剪贴板的内容变化时发送此消息给剪贴板观察链中的第一个窗体,它同意用剪贴板观察窗体来显示剪贴板的新内容
WM_PAINTCLIPBOARD0×0309当剪贴板包括CF_OWNERDIPLAY格式的数据且剪贴板观察窗体的客户区须要重绘时,发送此消息给剪贴板全部者
WM_VSCROLLCLIPBOARD0x030A当剪贴板包括CF_OWNERDIPLAY格式的数据且剪贴板观察窗体发生垂直滚动栏事件时。剪贴板观察窗体发送此消息给剪贴板全部者
WM_SIZECLIPBOARD0x030B当剪贴板包括CF_OWNERDIPLAY格式的数据且剪贴板观察窗体的客户区域的大小已经改变时。剪贴板观察窗体发送此消息给剪贴板的全部者
WM_ASKCBFORMATNAME0x030C剪贴板观察窗体发送此消息给剪贴板全部者以获得CF_OWNERDISPLAY剪贴板格式的名字
WM_CHANGECBCHAIN0x030D当一个窗体从剪贴板观察链中移去时发送此消息给剪贴板观察链中的第一个窗体
WM_HSCROLLCLIPBOARD0x030E当剪贴板包括CF_OWNERDIPLAY格式的数据且剪贴板观察窗体发生水平滚动栏事件时,剪贴板观察窗体发送此消息给剪贴板全部者
WM_QUERYNEWPALETTE0x030F发送此消息给将要获得键盘焦点的窗体。此消息使窗体在获得焦点时同一时候有机会实现它的逻辑调色板
WM_PALETTEISCHANGING0×0310应用程序将要实现它的逻辑调色板时发送此消息通知全部应用程序
WM_PALETTECHANGED0×0311获得焦点的窗体实现它的逻辑调色板后发送此消息给全部顶级并重叠的窗体,以此 来改变系统调色板
WM_HOTKEY0×0312当用户按下由RegisterHotKey()注冊的热键时产生此消息
WM_PRINT0×0317应用程序发送此消息给窗体,要求窗体在指定设备环境中绘制自己。普通情况下是打印机设备环境
WM_PRINTCLIENT0×0318应用程序发送此消息给窗体,要求窗体在指定设备环境中绘制窗体客户区。普通情况下是打印机设备环境
WM_APP0×8000帮助用户自己定义消息,自己定义消息能够为WM_APP+X,X为正整数
WM_USER0×0400帮助用户自己定义消息,自己定义消息能够为WM_USER+X。X为正整数

鼠标消息

在窗体显示区域鼠标消息

WM_MOUSEMOVE当鼠标在窗体的显示区域移动时
WM_LBUTTONDOWN按下鼠标左键
WM_LBUTTONUP释放鼠标左键
WM_LBUTTONDBLCLK双击鼠标左键
WM_MBUTTONDOWN按下鼠标中键
WM_MBUTTONUP释放鼠标中键
WM_MBUTTONDBLCLK双击鼠标中键
WM_RBUTTONDOWN按下鼠标右键
WM_RBUTTONUP释放鼠标右键
WM_RBUTTONDBLCLK双击鼠标右键
wParam为鼠标按键以及Shift和Ctrl键的状态
lParam为鼠标的显示区域x坐标y坐标(高字节为x,低字节为y)
WM_NCHITTEST鼠标命中測试
Windows依据它来产生与鼠标位置相关的全部其他鼠标消息
wParam unused
lParam 屏幕坐标x。y
WM_MOUSEWHEEL鼠标滚轮转动
wParam的低字组包括一系列的旗标。用于表示鼠标按键、Shift与Ctrl键的状态。


wParam的高字组保存一个「delta」值,该值眼下能够是120或-120,向前转动或向后转动。值120或-120表示文件将分别向上或向下卷动三行。


lParam为鼠标的屏幕坐标
显示区域鼠标消息和显示区域鼠标消息wParam 的位屏蔽有
MK_LBUTTON按下左键
MK_MBUTTON按下中键
MK_RBUTTON按下右键
MK_SHIFT按下Shift键
MK_CONTROL按下Ctrl键

 

在窗体非显示区域鼠标消息

WM_NCMOUSEMOVE当鼠标在窗体的显示区域移动时
WM_NCLBUTTONDOWN按下鼠标左键
WM_NCLBUTTONUP释放鼠标左键
WM_NCLBUTTONDBLCLK双击鼠标左键
WM_NCMBUTTONDOWN按下鼠标中键
WM_NCMBUTTONUP释放鼠标中键
WM_NCMBUTTONDBLCLK双击鼠标中键
WM_NCRBUTTONDOWN按下鼠标右键
WM_NCRBUTTONUP释放鼠标右键
WM_NCRBUTTONDBLCLK双击鼠标右键
wParam命中的区域 
lParam为鼠标的显示区域x坐标+y坐标

键盘消息 

虚拟码

虚拟键码相应键
VK_LBUTTON1Left mouse button
VK_RBUTTON2Right mouse button
VK_CANCEL3Control-break processing
VK_MBUTTON4Middle mouse button (three-button mouse)
VK_XBUTTON15Windows 2000/XP: X1 mouse button
VK_XBUTTON26Windows 2000/XP: X2 mouse button
VK_BACK8Backspace
VK_TAB9Tab
VK_CLEAR12Clear
VK_RETURN13Enter
VK_SHIFT16Shift
VK_CONTROL17Ctrl
VK_MENU18Alt
VK_PAUSE19Pause
VK_CAPITAL20Caps Lock
VK_KANA21IME Hanguel mode (maintained for compatibility; use VK_HANGUL)
VK_HANGUL21IME Hangul mode
VK_JUNJA23IME Junja mode
VK_FINAL24IME final mode
VK_HANJA25IME Hanja mode
VK_KANJI25*IME Kanji mode
VK_ESCAPE27Esc
VK_CONVERT28IME convert
VK_NONCONVERT29IME nonconvert
VK_ACCEPT30IME accept
VK_MODECHANGE31IME mode change request
VK_SPACE32Space
VK_PRIOR33Page Up
VK_NEXT34Page Down
VK_END35End
VK_HOME36Home
VK_LEFT37Left Arrow
VK_UP38Up Arrow
VK_RIGHT39Right Arrow
VK_DOWN40Down Arrow
VK_SELECT41Select
VK_PRINT42Print
VK_EXECUTE43Execute
VK_SNAPSHOT44Snapshot
VK_INSERT45Insert
VK_DELETE46Delete
VK_HELP47Help
 480
 491
 502
 513
 524
 535
 546
 557
 568
 579
 65A
 66B
 67C
 68D
 69E
 70F
 71G
 72H
 73I
 74J
 75K
 76L
 77M
 78N
 79O
 80P
 81Q
 82R
 83S
 84T
 85U
 86V
 87W
 88X
 89Y
 90Z
VK_LWIN91leftWindows key
VK_RWIN92rightWindows key
VK_APPS93Applications key
VK_SLEEP95Computer Sleep key
VK_NUMPAD096Numeric keypad 0
VK_NUMPAD197Numeric keypad 1
VK_NUMPAD298Numeric keypad 2
VK_NUMPAD399Numeric keypad 3
VK_NUMPAD4100Numeric keypad 4
VK_NUMPAD5101Numeric keypad 5
VK_NUMPAD6102Numeric keypad 6
VK_NUMPAD7103Numeric keypad 7
VK_NUMPAD8104Numeric keypad 8
VK_NUMPAD9105Numeric keypad 9
VK_MULTIPLY106Numeric keypad *
VK_ADD107Numeric keypad +
VK_SEPARATOR108Numeric keypad Enter
VK_SUBTRACT109Numeric keypad -
VK_DECIMAL110Numeric keypad .
VK_DIVIDE111Numeric keypad /
VK_F1112F1
VK_F2113F2
VK_F3114F3
VK_F4115F4
VK_F5116F5
VK_F6117F6
VK_F7118F7
VK_F8119F8
VK_F9120F9
VK_F10121F10
VK_F11122F11
VK_F12123F12
VK_F13124F13
VK_F14125F14
VK_F15126F15
VK_F16127F16
VK_F17128F17
VK_F18129F18
VK_F19130F19
VK_F20131F20
VK_F21132F21
VK_F22133F22
VK_F23134F23
VK_F24135F24
VK_NUMLOCK144Num Lock
VK_SCROLL145Scroll
VK_LSHIFT160left shift key
VK_RSHIFT161right shift key
VK_LCONTROL162left ctrl key
VK_RCONTROL163right ctrl key
VK_LMENU164left alt key
VK_RMENU165right alt key
VK_BROWSER_BACK166Windows 2000/XP: Browser Back key
VK_BROWSER_FORWARD167Windows 2000/XP: Browser Forward key
VK_BROWSER_REFRESH168Windows 2000/XP: Browser Refresh key
VK_BROWSER_STOP169Windows 2000/XP: Browser Stop key
VK_BROWSER_SEARCH170Windows 2000/XP: Browser Search key
VK_BROWSER_FAVORITES171Windows 2000/XP: Browser Favorites key
VK_BROWSER_HOME172Windows 2000/XP: Browser Start and Home key
VK_VOLUME_MUTE173Windows 2000/XP: Volume Mute key
VK_VOLUME_DOWN174Windows 2000/XP: Volume Down key
VK_VOLUME_UP175Windows 2000/XP: Volume Up key
VK_MEDIA_NEXT_TRACK176Windows 2000/XP: Next Track key
VK_MEDIA_PREV_TRACK177Windows 2000/XP: Previous Track key
VK_MEDIA_STOP178Windows 2000/XP: Stop Media key
VK_MEDIA_PLAY_PAUSE179Windows 2000/XP: Play/Pause Media key
VK_LAUNCH_MAIL180Windows 2000/XP: Start Mail key
VK_LAUNCH_MEDIA_SELECT181Windows 2000/XP: Select Media key
VK_LAUNCH_APP1182Windows 2000/XP: Start Application 1 key
VK_LAUNCH_APP2183Windows 2000/XP: Start Application 2 key
VK_OEM_1186; :
VK_OEM_PLUS187= +
VK_OEM_COMMA188
VK_OEM_MINUS189- _
VK_OEM_PERIOD190
VK_OEM_2191/ ?
VK_OEM_3192` ~
VK_OEM_4219[ {
VK_OEM_5220\ |
VK_OEM_6221] }
VK_OEM_7222' "
VK_OEM_8223Used for miscellaneous characters; it can vary by keyboard.
VK_OEM_102226Windows 2000/XP: Either the angle bracket key or the backslash key on the RT 102-key keyboard
VK_PACKET231Windows 2000/XP: Used to pass Unicode characters as if they were keystrokes. The 
VK_PACKET key is the low word of a 32-bit Virtual Key value used for non-keyboard input methods. 
For more information, see Remark in KEYBDINPUT, SendInput, WM_KEYDOWN, and
 WM_KEYUP
VK_PROCESSKEY229Windows 95/98/Me, Windows NT 4.0, Windows 2000/XP: IME PROCESS key
VK_ATTN246Attn key
VK_CRSEL247CrSel key
VK_EXSEL248ExSel key
VK_EREOF249Erase EOF key
VK_PLAY250Play key
VK_ZOOM251Zoom key
VK_NONAME252Reserved
VK_PA1253PA1 key
VK_OEM_CLEAR254Clear key

关于键盘消息的一些相关概念 

扫描码和虚拟码

  • 扫描码相应着键盘上的不同键,每个键被按下或释放时,都会产生一个唯一的扫描码作为本身的标识
  • 扫描码依赖于详细的硬件设备,即当同样的键被按下或释放时,在不同的机器上可能产生不同的扫描码
  • 在程序中通常使用由Windows系统定义的与详细设备无关的虚拟码.在击键产生扫描码的同一时候,键盘驱动程序KEYBOARD.DRV截取键的扫描码。然后将其翻译成相应的虚拟码,再将扫描码和虚拟码一齐编码形成键盘消息
  • ASCII值相应着字符,而虚拟键代码是相应着键.比如字符A和a的ASCII值不同,但因为位于同一个键上,因此虚拟键代码同样
  • 最后发送到消息队列的键盘消息中,既包括了扫描码又包括了虚拟码

输入焦点

  • 同一时刻,Windows中可能有多个不同程序在执行.这时,键盘由多个窗体共享,但仅仅有一个窗体能够接收到键盘消息,这个能够接收键盘消息的窗体被称为拥有输入焦点的窗体
  • 拥有输入焦点的窗体应该是当前的活动窗体,或者是活动窗体的子窗体,其标题和边框会以高亮度显示,以差别于其它窗体.拥有输入焦点的也能够是图标而不是窗体,此时,Windows也将消息发送给图标,仅仅是消息的格式略有不同
  • 窗体过程能够通过发送WM_SETFOCUS和 WM_KILLFOCUS消息使窗体获得或失去输入焦点.程序也能够通过捕获WM_SETFOCUS和WM_KILLFOCUS消息来推断窗体何时获得或失去输入焦点.当中WM_SETFOCUS消息表示窗体正获得输入焦点,WM_ KILLFOCUS消息表示窗体正失去输入焦点

  注意:每当用户按下或释放某一个键时,会产生一个中断,该中断激活键盘驱动程序KEYBOARD.DRV来对键盘中断进行处理.KEYBOARD.DRV程序会依据用户的不同操作进行编码,然后调用Windows用户模块USER.EXE生成键盘消息,并将该消息发送到消息队列中等候处理  

系统键消息系统键消息指由Aft键和其它键组合而产生的按键消息.当系统键被按下时产生WM_ SYSKEYDOWN消息,当系统键被释放时产生WM_SYSKEYUP消息
Aft键与其它键形成的组合键通经常使用于对程序菜单和系统菜单进行选择。或用于在不同的程序之间进行切换.因此,系统键消息应该交由Windows进行处理,用户所编制的程序一般不处理系统键消息,而是将这些消息交由DefWindowProc函数进行处理.假设用户想对系统键消息进行处理,应该在处理完这些消息后,再将其发送给DefWindowProc函数,使得Windows系统可以正常工作
非系统键消息l那些不使用Alt键组合的按键消息

 

Windows用8种不同的消息来传递不同的键盘事件

按键消息

消息类型含义
WM_SYSKEYDOWN系统按下系统按键/组合按键
WM_SYSKEYUP系统松开系统按键/组合按键
WM_KEYDOWN非系统按下按键
WM_KEYUP非系统松开按键

字符消息

消息类型含义
WM_SYSCHAR系统系统字符
WM_SYSDEADCHAR系统系统死字符
WM_CHAR非系统字符
WM_DEADCHAR非系统死字符

注意

  • 当中死字符是由某些特殊键盘上的按键所造成的,Windows一般忽略死字符所产生的消息
  • 某些击键消息能够被转换成字符消息,比如字母键,数字键等.而有些键仅仅能产生按键消息而没有字符消息,比如 Shift键、Insert键等
  • WM_SYSKEYDOWN与WM_SYSKEYUP产生的是WM_SYSCHAR或WM_SYSDEADCHAR
  • WM_KEYDOWN与WM_KEYUP产生的是WM_CHAR或WM_DEADCHAR
  • 消息循环中的 TranslateMessage函数能够实现从击键消息向字符消息的转化.当GetMessage函数捕获一个WM_SYSKEYDOWN消息或WM_KEYDOWN消息后,TranslateMessage函数推断产生该消息的键能否够被转换成字符消息,假设能,就将该消息转换成字符消息,再通过DispatchMessape函数将转换后的字符消息发送到消息队列中去

 

键盘消息MSG结构体变量

wParam域用于保存按键的虚拟键代码或字符的ASCII码.对于非字符消息,wParam域保存按键的虚拟健代码;对于字符消息,wParam域不保存字符的ASCII码
lParam域则用于保存击键时产生的附加信息,实际上一个32位的lParam变量被分为六部分,记录了下面相关信息:反复次数、OEM扫描码、扩展键标志、关联键标志、前一击键状态和转换状态
位数含义
反复记数位(0-15)击键反复次数累加
OEM扫描码(16-23)OEM扫描码
扩展键标志位(24)扩展键标志在有Alt键(或Ctrl)按下时为1,否则为0
保留位(25-28)没有定义
关联码(29)右按键时,假如同一时候压下ALT键,那么内容代码为1。对WM_SYSKEYUP与WM_SYSKEYDOWN而言。此位总视为1;而对WM_SYSKEYUP与WM_KEYDOW消息而言。此位为0。除了两个之外:
  • 假设活动窗体最小化了,则它没有输入焦点.这时候全部的按键都会产生WM_SYSKEYUP和WM_SYSKEYDOWN消息.假设Alt键未被按下,则内容代码字段被设定为0.Windows使用WM_SYSKEYUP和WM_SYSKEYDOWN消息,从而使最小化了的活动窗体不处理这些按键
  • 对于一些外国语文(非英文)键盘,有些字符是通过Shift、Ctrl或者Alt键与其他键相组合而产生的.这时内容代码为1,可是此消息并不是系统按键消息
键的先前状态(30)假设在此之前键是释放的。则键的先前状态为0,否则为1。对WM_KEYUP或者WM_SYSKEYUP消息,它总是设定为1;可是对WM_KEYDOWN或者WM_SYSKEYDOWN消息,此位能够为0。也能够为1。假设为1,则表示该键是自己主动反复功能所产生的第二个或者兴许消息 
转换状态(31)假设键正被按下,则转换状态为0。假设键正被释放,则转换状态为1。对WM_KEYDOWN或者WM_SYSKEYDOWN消息,此字段为0。对WM_KEYUP或者WM_SYSKEYUP消息,此字段为1 
 

 

按键消息的顺序

WM_KEYDOWN/WM_SYSKEYDOWN

WM_CHAR/WM_SYSCHAR

WM_KEYUP/WM_SYSKEYUP

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
比如,按下并释放1键.按下1键所产生的消息和wParam的取值 消息 wParam变量取值 WM_KEYDOWN 虚拟码1 WM_CHAR ASCII码“1” WM_KEYUP 虚拟码1
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
比如,按下Shift键后再按下1键并释放,则依次产生如表所看到的的消息.按下Shift键后按健所产生的消息和wParam的取值 消息 wParam变量取值 WM_KEYDOWN 虚拟码 VK_SHIFT WM_KEYDOWN 虚拟码 VK_1 WM_CHAR ASCII码 “1” WM_KEYUP 虚拟码 VK_1 WM_KEYUP 虚拟码 VK_SHIFT
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< <

转自:http://www.cnblogs.com/kzang/archive/2012/10/01/2709565.html



转载于:https://www.cnblogs.com/lxjshuju/p/7091293.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值