系统消息



Window消息来源有以下4种

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

 

Windows消息分布

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

 

通知消息-按钮

通知消息-列表框

消息名称说 明消息名称说 明
BN_CLICKED单击按钮LBN_DBLCLK用户双击了一项
BN_DISABLE按钮被禁止LBN_ERRSPACE列表框内存不足
BN_DOUBLECLICKED双击按钮LBN_KILLFOCUS列表框正在失去输入焦点
BN_HILITE加亮按钮LBN_SELCANCEL用户选择被取消
BN_PAINT按钮应当重画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绘制按钮控件前发送此消息给它的父窗口,可用来设置编辑框的文本和背景颜色
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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值