事件处理程序WinProc

Posted jzdwajue

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了事件处理程序WinProc相关的知识,希望对你有一定的参考价值。

事件处理函数是一个回调函数,Windows在窗体中发生须要处理的事件时,在主时间循环中调用该函数。时间处理函数可处理不论什么想处理的事件,其它的事件传递给Windows进行处理。
在用户和Windows运行某些操作时,将生成一些针相应用程序的事件和消息,全部这些消息都将进入一个队列中,而针对一个应用程序窗体的事件和消息将从消息队列中转移到该窗体的私有队列中。

然后主事件循环将获取这些消息并将它们发送给窗体的WinProc进行处理。


消息处理函数的原型是:

LRESULT CALLBACK WindowProc(
HWND hwnd,//发送方的窗体句柄
UINT msg,//消息id,即消息的种类
WPARAM wparam,//具体信息
LPARAM lparam);//具体信息


winproc依据hwnd知道消息来自哪个窗体,msg为消息的种类。下面是Windows中的所有消息:
WM_NULL = $0000;
  WM_CREATE = $0001;
  应用程序创建一个窗体
  WM_DESTROY = $0002;
  一个窗体被销毁
  WM_MOVE = $0003;
  移动一个窗体
  WM_SIZE = $0005;
  改变一个窗体的大小
  WM_ACTIVATE = $0006;
  一个窗体被激活或失去激活状态;
  WM_SETFOCUS = $0007;
  获得焦点后
  WM_KILLFOCUS = $0008;
  失去焦点
  WM_ENABLE = $000A;
  改变enable状态
  WM_SETREDRAW = $000B;
  设置窗体能否重画 
  WM_SETTEXT = $000C;
  应用程序发送此消息来设置一个窗体的文本
  WM_GETTEXT = $000D;
  应用程序发送此消息来复制相应窗体的文本到缓冲区
  WM_GETTEXTLENGTH = $000E;
  得到与一个窗体有关的文本的长度(不包括空字符)
  WM_PAINT = $000F;
  要求一个窗体重画自己
  WM_CLOSE = $0010;
  当一个窗体或应用程序要关闭时发送一个信号
  WM_QUERYENDSESSION = $0011;
  当用户选择结束对话框或程序自己调用ExitWindows函数
  WM_QUIT = $0012;
  用来结束程序执行或当程序调用postquitmessage函数 
  WM_QUERYOPEN = $0013;
  当用户窗体恢复曾经的大小位置时。把此消息发送给某个图标
  WM_ERASEBKGND = $0014;
  当窗体背景必须被擦除时(例在窗体改变大小时)
  WM_SYSCOLORCHANGE = $0015;
  当系统颜色改变时,发送此消息给全部顶级窗体
  WM_ENDSESSION = $0016;
  当系统进程发出WM_QUERYENDSESSION消息后。此消息发送给应用程序,
  通知它对话是否结束
  WM_SYSTEMERROR = $0017;
  WM_SHOWWINDOW = $0018;
  当隐藏或显示窗体是发送此消息给这个窗体
  WM_ACTIVATEAPP = $001C;
  发此消息给应用程序哪个窗体是激活的,哪个是非激活的;
  WM_FONTCHANGE = $001D;
  当系统的字体资源库变化时发送此消息给全部顶级窗体
  WM_TIMECHANGE = $001E;
  当系统的时间变化时发送此消息给全部顶级窗体
  WM_CANCELMODE = $001F;
  发送此消息来取消某种正在进行的摸态(操作)
  WM_SETCURSOR = $0020;
  假设鼠标引起光标在某个窗体中移动且鼠标输入没有被捕获时,就发消息给某个窗体
  WM_MOUSEACTIVATE = $0021;
  当光标在某个非激活的窗体中而用户正按着鼠标的某个键发送此消息给当前窗体
  WM_CHILDACTIVATE = $0022;
  发送此消息给MDI子窗体当用户点击此窗体的标题栏。或当窗体被激活。移动,改变大小
  WM_QUEUESYNC = $0023;
  此消息由基于计算机的训练程序发送,通过WH_JOURNALPALYBACK的hook程序
  分离出用户输入消息
  WM_GETMINMAXINFO = $0024;
  此消息发送给窗体当它将要改变大小或位置;
  WM_PAINTICON = $0026;
  发送给最小化窗体当它图标将要被重画
  WM_ICONERASEBKGND = $0027;
  此消息发送给某个最小化窗体,仅当它在绘图标前它的背景必须被重画
  WM_NEXTDLGCTL = $0028;
  发送此消息给一个对话框程序去更改焦点位置
  WM_SPOOLERSTATUS = $002A;
  每当打印管理列队添加或降低一条作业时发出此消息 
  WM_DRAWITEM = $002B;
  当button。combobox,listbox,menu的可视外观改变时发送
  此消息给这些空件的全部者
  WM_MEASUREITEM = $002C;
  当button, combo box, list box, list view control, or menu item 被创建时
  发送此消息给控件的全部者
  WM_DELETEITEM = $002D;
  当the list box 或 combo box 被销毁 或 当 某些项被删除通过LB_DELETESTRING, LB_RESETCONTENT, CB_DELETESTRING, or CB_RESETCONTENT 消息
  WM_VKEYTOITEM = $002E;
  此消息有一个LBS_WANTKEYBOARDINPUT风格的发出给它的全部者来响应WM_KEYDOWN消息 
  WM_CHARTOITEM = $002F;
  此消息由一个LBS_WANTKEYBOARDINPUT风格的列表框发送给他的全部者来响应WM_CHAR消息 
  WM_SETFONT = $0030;
  当绘制文本时程序发送此消息得到控件要用的颜色 
  WM_GETFONT = $0031;
  应用程序发送此消息得到当前控件绘制文本的字体
  WM_SETHOTKEY = $0032;
  应用程序发送此消息让一个窗体与一个热键相关连
  WM_GETHOTKEY = $0033;
  应用程序发送此消息来推断热键与某个窗体是否有关联
  WM_QUERYDRAGICON = $0037;
  此消息发送给最小化窗体。当此窗体将要被拖放而它的类中未定义图标,应用程序能返回一个图标或光标的句柄,当用户拖放图标时系统显示这个图标或光标
  WM_COMPAREITEM = $0039;
  发送此消息来判定combobox或listbox新添加的项的相对位置
  WM_GETOBJECT = $003D;
  WM_COMPACTING = $0041;
  显示内存已经非常少了
  WM_WINDOWPOSCHANGING = $0046;
  发送此消息给那个窗体的大小和位置将要被改变时。来调用setwindowpos函数或其他窗体管理函数
  WM_WINDOWPOSCHANGED = $0047;
  发送此消息给那个窗体的大小和位置已经被改变时。来调用setwindowpos函数或其他窗体管理函数
  WM_POWER = $0048;(适用于16位的windows)
  当系统将要进入暂停状态时发送此消息
  WM_COPYDATA = $004A;
  当一个应用程序传递数据给还有一个应用程序时发送此消息
  WM_CANCELJOURNAL = $004B;
  当某个用户取消程序日志激活状态,提交此消息给程序
  WM_NOTIFY = $004E;
  当某个控件的某个事件已经发生或这个控件须要得到一些信息时。发送此消息给它的父窗体
  WM_INPUTLANGCHANGEREQUEST = $0050;
  当用户选择某种输入语言。或输入语言的热键改变
  WM_INPUTLANGCHANGE = $0051;
  当平台现场已经被改变后发送此消息给受影响的最顶级窗体
  WM_TCARD = $0052;
  当程序已经初始化windows帮助例程时发送此消息给应用程序
  WM_HELP = $0053;
  此消息显示用户按下了F1。假设某个菜单是激活的,就发送此消息个此窗体关联的菜单。否则就
  发送给有焦点的窗体,假设当前都没有焦点。就把此消息发送给当前激活的窗体
  WM_USERCHANGED = $0054;
  当用户已经登入或退出后发送此消息给全部的窗体。当用户登入或退出时系统更新用户的详细
  设置信息,在用户更新设置时系统立即发送此消息。
  WM_NOTIFYFORMAT = $0055;
  公用控件,自己定义控件和他们的父窗体通过此消息来推断控件是使用ANSI还是UNICODE结构
  在WM_NOTIFY消息,使用此控件能使某个控件与它的父控件之间进行相互通信
  WM_CONTEXTMENU = $007B;
  当用户某个窗体中点击了一下右键就发送此消息给这个窗体
  WM_STYLECHANGING = $007C;
  当调用SETWINDOWLONG函数将要改变一个或多个 窗体的风格时发送此消息给那个窗体
  WM_STYLECHANGED = $007D;
  当调用SETWINDOWLONG函数一个或多个 窗体的风格后发送此消息给那个窗体
  WM_DISPLAYCHANGE = $007E;
  当显示器的分辨率改变后发送此消息给全部的窗体
  WM_GETICON = $007F;
  此消息发送给某个窗体来返回与某个窗体有关连的大图标或小图标的句柄;
  WM_SETICON = $0080;
  程序发送此消息让一个新的大图标或小图标与某个窗体关联。
  WM_NCCREATE = $0081;
  当某个窗体第一次被创建时,此消息在WM_CREATE消息发送前发送。
  WM_NCDESTROY = $0082;
  此消息通知某个窗体,非客户区正在销毁
  WM_NCCALCSIZE = $0083;
  当某个窗体的客户区域必须被核算时发送此消息
  WM_NCHITTEST = $0084;//移动鼠标,按住或释放鼠标时发生
  WM_NCPAINT = $0085;
  程序发送此消息给某个窗体当它(窗体)的框架必须被绘制时;
  WM_NCACTIVATE = $0086;
  此消息发送给某个窗体 仅当它的非客户区须要被改变来显示是激活还是非激活状态;
  WM_GETDLGCODE = $0087;
  发送此消息给某个与对话框程序关联的控件,widdows控制方位键和TAB键使输入进入此控件
  通过响应WM_GETDLGCODE消息。应用程序能够把他当成一个特殊的输入控件并能处理它
  WM_NCMOUSEMOVE = $00A0;
  当光标在一个窗体的非客户区内移动时发送此消息给这个窗体 //非客户区为:窗体的标题栏及窗 
  的边框体
  WM_NCLBUTTONDOWN = $00A1;
  当光标在一个窗体的非客户区同一时候按下鼠标左键时提交此消息
  WM_NCLBUTTONUP = $00A2;
  当用户释放鼠标左键同一时候光标某个窗体在非客户区十发送此消息;
  WM_NCLBUTTONDBLCLK = $00A3;
  当用户双击鼠标左键同一时候光标某个窗体在非客户区十发送此消息
  WM_NCRBUTTONDOWN = $00A4;
  当用户按下鼠标右键同一时候光标又在窗体的非客户区时发送此消息
  WM_NCRBUTTONUP = $00A5;
  当用户释放鼠标右键同一时候光标又在窗体的非客户区时发送此消息
  WM_NCRBUTTONDBLCLK = $00A6;
  当用户双击鼠标右键同一时候光标某个窗体在非客户区十发送此消息
  WM_NCMBUTTONDOWN = $00A7;
  当用户按下鼠标中键同一时候光标又在窗体的非客户区时发送此消息
  WM_NCMBUTTONUP = $00A8;
  当用户释放鼠标中键同一时候光标又在窗体的非客户区时发送此消息
  WM_NCMBUTTONDBLCLK = $00A9;
  当用户双击鼠标中键同一时候光标又在窗体的非客户区时发送此消息
  WM_KEYFIRST = $0100;
  WM_KEYDOWN = $0100; 
  //按下一个键
  WM_KEYUP = $0101; 
  //释放一个键
  WM_CHAR = $0102; 
  //按下某键,并已发出WM_KEYDOWN, WM_KEYUP消息
  WM_DEADCHAR = $0103;
  当用translatemessage函数翻译WM_KEYUP消息时发送此消息给拥有焦点的窗体
  WM_SYSKEYDOWN = $0104;
  当用户按住ALT键同一时候按下其他键时提交此消息给拥有焦点的窗体;
  WM_SYSKEYUP = $0105;
  当用户释放一个键同一时候ALT 键还按着时提交此消息给拥有焦点的窗体
  WM_SYSCHAR = $0106;
  当WM_SYSKEYDOWN消息被TRANSLATEMESSAGE函数翻译后提交此消息给拥有焦点的窗体
  WM_SYSDEADCHAR = $0107;
  当WM_SYSKEYDOWN消息被TRANSLATEMESSAGE函数翻译后发送此消息给拥有焦点的窗体
  WM_KEYLAST = $0108;
  WM_INITDIALOG = $0110;
  在一个对话框程序被显示前发送此消息给它。通经常使用此消息初始化控件和运行其他任务
  WM_COMMAND = $0111;
  当用户选择一条菜单命令项或当某个控件发送一条消息给它的父窗体,一个快捷键被翻译
  WM_SYSCOMMAND = $0112;
  当用户选择窗体菜单的一条命令或当用户选择最大化或最小化时那个窗体会收到此消息
  WM_TIMER = $0113; //发生了定时器事件
  WM_HSCROLL = $0114;
  当一个窗体标准水平滚动栏产生一个滚动事件时发送此消息给那个窗体,也发送给拥有它的控件
  WM_VSCROLL = $0115;
  当一个窗体标准垂直滚动栏产生一个滚动事件时发送此消息给那个窗体也,发送给拥有它的控件 WM_INITMENU = $0116;
  当一个菜单将要被激活时发送此消息,它发生在用户菜单栏中的某项或按下某个菜单键。它同意程序在显示前更改菜单
  WM_INITMENUPOPUP = $0117;
  当一个下拉菜单或子菜单将要被激活时发送此消息,它同意程序在它显示前更改菜单,而不要改变所有 
  WM_MENUSELECT = $011F;
  当用户选择一条菜单项时发送此消息给菜单的全部者(通常是窗体)
  WM_MENUCHAR = $0120;
  当菜单已被激活用户按下了某个键(不同于加速键)。发送此消息给菜单的全部者;
  WM_ENTERIDLE = $0121;
  当一个模态对话框或菜单进入空载状态时发送此消息给它的全部者,一个模态对话框或菜单进入空载状态就是在处理完一条或几条先前的消息后没有消息它的列队中等待
  WM_MENURBUTTONUP = $0122;
  WM_MENUDRAG = $0123;
  WM_MENUGETOBJECT = $0124;
  WM_UNINITMENUPOPUP = $0125;
  WM_MENUCOMMAND = $0126;
  WM_CHANGEUISTATE = $0127;
  WM_UPDATEUISTATE = $0128;
  WM_QUERYUISTATE = $0129; 
  WM_CTLCOLORMSGBOX = $0132;
  在windows绘制消息框前发送此消息给消息框的全部者窗体,通过响应这条消息,全部者窗体能够通过使用给定的相关显示设备的句柄来设置消息框的文本和背景颜色
  WM_CTLCOLOREDIT = $0133;
  当一个编辑型控件将要被绘制时发送此消息给它的父窗体。通过响应这条消息。全部者窗体能够通过使用给定的相关显示设备的句柄来设置编辑框的文本和背景颜色
  WM_CTLCOLORLISTBOX = $0134;
  当一个列表框控件将要被绘制前发送此消息给它的父窗体;通过响应这条消息,全部者窗体能够通过使用给定的相关显示设备的句柄来设置列表框的文本和背景颜色 
  WM_CTLCOLORBTN = $0135;
  当一个button控件将要被绘制时发送此消息给它的父窗体;通过响应这条消息。全部者窗体能够通过使用给定的相关显示设备的句柄来设置按纽的文本和背景颜色
  WM_CTLCOLORDLG = $0136;
  当一个对话框控件将要被绘制前发送此消息给它的父窗体;通过响应这条消息。全部者窗体能够通过使用给定的相关显示设备的句柄来设置对话框的文本背景颜色
  WM_CTLCOLORSCROLLBAR= $0137;
  当一个滚动栏控件将要被绘制时发送此消息给它的父窗体;通过响应这条消息,全部者窗体能够通过使用给定的相关显示设备的句柄来设置滚动栏的背景颜色
  WM_CTLCOLORSTATIC = $0138; 
  当一个静态控件将要被绘制时发送此消息给它的父窗体;通过响应这条消息。全部者窗体能够通过使用给定的相关显示设备的句柄来设置静态控件的文本和背景颜色
  WM_MOUSEFIRST = $0200;
  WM_MOUSEMOVE = $0200; 
  // 移动鼠标
  WM_LBUTTONDOWN = $0201; 
  //按下鼠标左键
  WM_LBUTTONUP = $0202; 
  //释放鼠标左键
  WM_LBUTTONDBLCLK = $0203;
  //双击鼠标左键
  WM_RBUTTONDOWN = $0204;
  //按下鼠标右键
  WM_RBUTTONUP = $0205;
  //释放鼠标右键
  WM_RBUTTONDBLCLK = $0206; 
  //双击鼠标右键
  WM_MBUTTONDOWN = $0207; 
  //按下鼠标中键 
  WM_MBUTTONUP = $0208; 
  //释放鼠标中键
  WM_MBUTTONDBLCLK = $0209; 
  //双击鼠标中键
  WM_MOUSEWHEEL = $020A;
  当鼠标轮子转动时发送此消息个当前有焦点的控件
  WM_MOUSELAST = $020A;
  WM_PARENTNOTIFY = $0210;
  当MDI子窗体被创建或被销毁。或用户按了一下鼠标键而光标在子窗体上时发送此消息给它的父窗体
  WM_ENTERMENULOOP = $0211;
  发送此消息通知应用程序的主窗体that已经进入了菜单循环模式
  WM_EXITMENULOOP = $0212;
  发送此消息通知应用程序的主窗体that已退出了菜单循环模式
  WM_NEXTMENU = $0213;
  WM_SIZING = 532;
  当用户正在调整窗体大小时发送此消息给窗体;通过此消息应用程序能够监视窗体大小和位置也能够改动他们
  WM_CAPTURECHANGED = 533;
  发送此消息 给窗体当它失去捕获的鼠标时。
  WM_MOVING = 534;
  当用户在移动窗体时发送此消息,通过此消息应用程序能够监视窗体大小和位置也能够改动他们。
  WM_POWERBROADCAST = 536;
  此消息发送给应用程序来通知它有关电源管理事件。
  WM_DEVICECHANGE = 537;
  当设备的硬件配置改变时发送此消息给应用程序或设备驱动程序
  WM_IME_STARTCOMPOSITION = $010D;
  WM_IME_ENDCOMPOSITION = $010E;
  WM_IME_COMPOSITION = $010F;
  WM_IME_KEYLAST = $010F;
  WM_IME_SETCONTEXT = $0281;
  WM_IME_NOTIFY = $0282;
  WM_IME_CONTROL = $0283;
  WM_IME_COMPOSITIONFULL = $0284;
  WM_IME_SELECT = $0285;
  WM_IME_CHAR = $0286;
  WM_IME_REQUEST = $0288;
  WM_IME_KEYDOWN = $0290;
  WM_IME_KEYUP = $0291;
  WM_MDICREATE = $0220;
  应用程序发送此消息给多文档的客户窗体来创建一个MDI 子窗体
  WM_MDIDESTROY = $0221;
  应用程序发送此消息给多文档的客户窗体来关闭一个MDI 子窗体
  WM_MDIACTIVATE = $0222;
  应用程序发送此消息给多文档的客户窗体通知客户窗体激活还有一个MDI子窗体。当客户窗体收到此消息后。它发出WM_MDIACTIVE消息给MDI子窗体(未激活)激活它;
  WM_MDIRESTORE = $0223;
  程序 发送此消息给MDI客户窗体让子窗体从最大最小化恢复到原来大小
  WM_MDINEXT = $0224;
  程序 发送此消息给MDI客户窗体激活下一个或前一个窗体
  WM_MDIMAXIMIZE = $0225;
  程序发送此消息给MDI客户窗体来最大化一个MDI子窗体;
  WM_MDITILE = $0226;
  程序 发送此消息给MDI客户窗体以平铺方式又一次排列全部MDI子窗体
  WM_MDICASCADE = $0227;
  程序 发送此消息给MDI客户窗体以层叠方式又一次排列全部MDI子窗体
  WM_MDIICONARRANGE = $0228;
  程序 发送此消息给MDI客户窗体又一次排列全部最小化的MDI子窗体
  WM_MDIGETACTIVE = $0229;
  程序 发送此消息给MDI客户窗体来找到激活的子窗体的句柄
  WM_MDISETMENU = $0230;
  程序 发送此消息给MDI客户窗体用MDI菜单取代子窗体的菜单
  WM_ENTERSIZEMOVE = $0231;
  WM_EXITSIZEMOVE = $0232;
  WM_DROPFILES = $0233;
  WM_MDIREFRESHMENU = $0234;
  WM_MOUSEHOVER = $02A1;
  WM_MOUSELEAVE = $02A3;
  WM_CUT = $0300;
  程序发送此消息给一个编辑框或combobox来删除当前选择的文本
  WM_COPY = $0301;
  程序发送此消息给一个编辑框或combobox来复制当前选择的文本到剪贴板
  WM_PASTE = $0302;
  程序发送此消息给editcontrol或combobox从剪贴板中得到数据
  WM_CLEAR = $0303;
  程序发送此消息给editcontrol或combobox清除当前选择的内容;
  WM_UNDO = $0304;
  程序发送此消息给editcontrol或combobox撤消最后一次操作
  WM_RENDERFORMAT = $0305;
  WM_RENDERALLFORMATS = $0306;
  WM_DESTROYCLIPBOARD = $0307;
  当调用ENPTYCLIPBOARD函数时 发送此消息给剪贴板的全部者
  WM_DRAWCLIPBOARD = $0308;
  当剪贴板的内容变化时发送此消息给剪贴板观察链的第一个窗体;它同意用剪贴板观察窗体来
  显示剪贴板的新内容。
  WM_PAINTCLIPBOARD = $0309;
  当剪贴板包括CF_OWNERDIPLAY格式的数据而且剪贴板观察窗体的客户区须要重画;
  WM_VSCROLLCLIPBOARD = $030A;
  WM_SIZECLIPBOARD = $030B;
  当剪贴板包括CF_OWNERDIPLAY格式的数据而且剪贴板观察窗体的客户区域的大小已经改变是此消息通过剪贴板观察窗体发送给剪贴板的全部者。
  WM_ASKCBFORMATNAME = $030C;
  通过剪贴板观察窗体发送此消息给剪贴板的全部者来请求一个CF_OWNERDISPLAY格式的剪贴板的名字
  WM_CHANGECBCHAIN = $030D;
  当一个窗体从剪贴板观察链中移去时发送此消息给剪贴板观察链的第一个窗体。
  WM_HSCROLLCLIPBOARD = $030E; 
  此消息通过一个剪贴板观察窗体发送给剪贴板的全部者 ;它发生在当剪贴板包括CFOWNERDISPALY格式的数据而且有个事件在剪贴板观察窗的水平滚动栏上;全部者应滚动剪贴板图象并更新滚动栏的值;
  WM_QUERYNEWPALETTE = $030F;
  此消息发送给将要收到焦点的窗体。此消息能使窗体在收到焦点时同一时候有机会实现他的逻辑调色板
  WM_PALETTEISCHANGING= $0310;
  当一个应用程序正要实现它的逻辑调色板时发此消息通知全部的应用程序
  WM_PALETTECHANGED = $0311;
  此消息在一个拥有焦点的窗体实现它的逻辑调色板后发送此消息给全部顶级并重叠的窗体,以此来改变系统调色板 
  WM_HOTKEY = $0312;
  当用户按下由REGISTERHOTKEY函数注冊的热键时提交此消息
  WM_PRINT = 791;
  应用程序发送此消息仅当WINDOWS或其他应用程序发出一个请求要求绘制一个应用程序的一部分;
  WM_PRINTCLIENT = 792;
  WM_HANDHELDFIRST = 856;
  WM_HANDHELDLAST = 863;
  WM_PENWINFIRST = $0380;
  WM_PENWINLAST = $038F;
  WM_COALESCE_FIRST = $0390;
  WM_COALESCE_LAST = $039F;
  WM_DDE_FIRST = $03E0;
  WM_DDE_INITIATE = WM_DDE_FIRST + 0;
  一个DDE客户程序提交此消息開始一个与server程序的会话来响应那个指定的程序和主题名。
  WM_DDE_TERMINATE = WM_DDE_FIRST + 1;
  一个DDE应用程序(不管是客户还是server)提交此消息来终止一个会话。
  WM_DDE_ADVISE = WM_DDE_FIRST + 2;
  一个DDE客户程序提交此消息给一个DDE服务程序来请求server每当数据项改变时更新它
  WM_DDE_UNADVISE = WM_DDE_FIRST + 3;
  一个DDE客户程序通过此消息通知一个DDE服务程序不更新指定的项或一个特殊的剪贴板格式的项
  WM_DDE_ACK = WM_DDE_FIRST + 4;
  此消息通知一个DDE(动态数据交换)程序已收到并正在处理WM_DDE_POKE, WM_DDE_EXECUTE, WM_DDE_DATA, WM_DDE_ADVISE, WM_DDE_UNADVISE, or WM_DDE_INITIAT消息
  WM_DDE_DATA = WM_DDE_FIRST + 5;
  一个DDE服务程序提交此消息给DDE客户程序来传递个一数据项给客户或通知客户的一条可用数据项
  WM_DDE_REQUEST = WM_DDE_FIRST + 6;
  一个DDE客户程序提交此消息给一个DDE服务程序来请求一个数据项的值;
  WM_DDE_POKE = WM_DDE_FIRST + 7;
  一个DDE客户程序提交此消息给一个DDE服务程序,客户使用此消息来请求server接收一个未经允许的数据项;server通过答复WM_DDE_ACK消息提示是否它接收这个数据项。
  WM_DDE_EXECUTE = WM_DDE_FIRST + 8;
  一个DDE客户程序提交此消息给一个DDE服务程序来发送一个字符串给server让它象串行命令一样被处理,server通过提交WM_DDE_ACK消息来作回应;
  WM_DDE_LAST = WM_DDE_FIRST + 8;
  WM_APP = $8000;
  WM_USER = $0400;


wparam和lparam是进一步的具体信息,一般包括菜单项内容或鼠标点击位置等具体信息。


一般必须处理的三个消息:
WM_CREATE 最初创建窗体时发送的消息。一般处理这个消息时,进行一些设置,初始化和资源分配。
WM_PAINT 窗体内容须要重绘时发送该消息。

当用户移动窗体或调整窗体大小或被还有一个应用程序弹出窗体遮住等时产生这个消息。WM_PAINT非常重要,对于DirectX游戏。这无关紧要,由于我们以30-60fps(帧每秒)的速度重绘屏幕。而对普通Windows应用程序就非常重要了,要进行重绘,否则就会一直被其它窗体遮住。

而对DirectX应用程序,我们不希望Windows觉得屏幕没有被重绘,所以要让Windows系统知道我们已经对这个消息进行处理了。
因此,要 验证窗体的客户矩形,最简单的方法是调用 BeginPaint()和EndPaint().这两个函数验证窗体,。并用储存在Windows类变量hbrBackground中的背景画刷来又一次填充背景。通常是这样写的:

	hdc = BeginPaint(hWnd, &ps);
		// TODO: 在此加入随意画图代码...
		EndPaint(hWnd, &ps);


hWnd为窗体句柄。两个函数在相应的窗体进行画图。ps为 PAINTSTRUCT结构的地址,这个结构包括了要重绘的区域。

其结构例如以下:

typedef struct tagPAINTSTRUCT {
    HDC         hdc;
    BOOL        fErase;
    RECT        rcPaint;
    BOOL        fRestore;
    BOOL        fIncUpdate;
    BYTE        rgbReserved[32];
} PAINTSTRUCT



这里最重要的字段是 rcPaint ,为一个RECT结构。包括须要重绘的最小矩形。Windows试图做尽可能少的工作。当窗体被破坏时。Windows会告诉您须要又一次画图以恢复窗体内容的最小矩形区域。

BeginPaint()返回的是一个图形场景句柄或称为设备上下文句柄。


WM_DESTROY 窗体被销毁时发送该消息。

一般是用户单击了窗体的关闭图标或从窗体的系统菜单中选择关闭后的直接结果。这里须要释放全部资源。并通过发送WM_QUIT消息,来告诉Windows全然终止该进程。


这里这个消息仅仅关闭窗体,但并不会关闭应用程序。应用程序将继续执行仅仅是没有窗体。所以这里发送终止程序的消息为 WM_QUIT。是用专门的函数 PostQuitMessage()函数来发送它。调用PostQuitMessage(0)来将WM_QUIT消息增加消息队列中,而这个消息将导致主循环事件结束。


在WM_DESTROY中。处理全部清理工作,然后调用PostQuitMessage(0),结束主循环。




处理完消息后使用 return(0),退出WinProc,并告诉Windows已经对消息进行处理。

对于其它为处理的消息,调用默认消息处理程序 DefaultWindowProc(),这个函数是一个传递函数,将为处理的消息传递给Windows进行默认处理。
return DefWindowProc(hWnd, message, wParam, lParam);

以上是关于事件处理程序WinProc的主要内容,如果未能解决你的问题,请参考以下文章

C# 中 XBOX 控制器的事件处理程序?

Android YouTube Player API Fragment无法手动处理触摸事件

将数据从片段发送到活动,无需任何事件处理或侦听器

将通知设置为在某个用户事件时触发

Delphi 自定义窗口过程WinProc

原生js禁止页面滚动