Windows消息机制太阳集团所有网址16877

1. 问题

一. 窗口进程 
各类窗口会有2个叫做窗口进程的回调函数(WndProc),它富含两个参数,分别为:窗口句柄(Window Handle),音讯ID(Message ID),和多个音信参数(wParam, lParam),当窗口收到音信时系统就会调用此窗口进程来处理音讯。(所以叫回调函数)

音信是指什么?
     音讯系统对于八个win32主次来讲格外第二,它是贰个程序运转的重力来源。叁个消息,是系统定义的叁个三10个人的值,他唯1的概念了3个风浪,向 Windows发出1个文告,告诉应用程序某些事情时有发生了。例如,单击鼠标、改动窗口尺寸、按下键盘上的1个键都会使Windows发送1个信息给应用程序。
    音讯我是当做三个记录传递给应用程序的,这一个记录中包涵了新闻的品类以及其它消息。举例,对于单击鼠标所产生的信息的话,那几个记录中涵盖了单击鼠标时的坐标。这些记录类型叫做MSG,MSG含有来自windows应用程序新闻队列的音讯音讯,它在Windows中声称如下:

当在console中调用API ShellExecuteEx展开"test.iqy"文件时,发掘excel会hang住,console退出后excel才会响应,但直接双击"test.iqy"是没十分的,有趣的是以此场合唯有在xp发生,在win七上从不那个主题素材。

贰 新闻类型 
一) 系统定义音讯(System-Defined Messages)
 
在SDK中先行定义好的新闻,非用户定义的,其范围在[0x0000, 0x03ff]以内, 能够分成以下三类:
1>窗口消息(Windows Message) 
与窗口的里边运维有关,如创设窗口,绘制窗口,销毁窗口等。能够是一般的窗口,也能够是Dialog,控件等。
如:WM_CREATE, WM_PAINT, WM_MOUSEMOVE, WM_CTLCOLOR, WM_HSCROLL...
2>命令新闻(Command Message):注意那类新闻通称为WM_COMMAND
与拍卖用户请求有关, 如单击菜单项或工具栏或控件时, 就会发出命令音讯。
WM_COMMAND, LOWOLANDD(wParam)表示菜单项,工具栏按键或控件的ID。尽管是控件, HIWO悍马H2D(wParam)表示控件音讯类型
叁> 控件通告(Notify Message) 
控件通知音讯, 那是最灵敏的音信格式, 其Message, wParam, lParam分别为:WM_NOTIFY, 控件ID,指向NMHD路虎极光的指针。NMHD福特Explorer包蕴控件文告的内容, 能够自便扩充。
二) 程序定义音信(Application-Defined Messages) 
用户自定义的新闻, 对于其范围有如下规定:
WM_USER: 0x0400-0x7FFF    (ex. WM_USER 10)
WM_APP(winver>4.0): 0x8000-0xBFFF (ex.WM_APP 4)
RegisterWindowMessage: 0xC000-0xFFFF

太阳集团所有网址16877 1typedef struct tagMsg
太阳集团所有网址16877 2{
太阳集团所有网址16877 3       HWND    hwnd;       //接受该音讯的窗口句柄
太阳集团所有网址16877 4       UINT    message;    //新闻常量标志符,也便是大家普通所说的音讯号
太阳集团所有网址16877 5       WPARAM  wParam;     //三十一个人音讯的一定附加音讯,确切含义依赖于音讯值
太阳集团所有网址16877 6       LPARAM  lParam;     //三十三个人音信的一定附加消息,确切含义正视于音讯值
太阳集团所有网址16877 7       DWOEvoqueD   time;       //音讯创立时的时辰
太阳集团所有网址16877 8       POINT   pt;         //音信创设时的鼠标/光标在显示器坐标系中的地点
太阳集团所有网址16877 9}MSG;
太阳集团所有网址16877 10

 

3 音信队列(Message Queues) 
Windows中有两连串型的音讯队列
一) 系统消息队列(System Message Queue) 那是1个种类唯1的Queue,设备驱动(mouse, keyboard)会把操作输入转化成音讯存在系统队列中,然后系统会把此消息放到目的窗口所在的线程的音讯队列(thread-specific message queue)中等候管理
二) 线程音信队列(Thread-specific Message Queue) 每2个GUI线程都会维护这么贰个线程音信队列。(那一个行列唯有在线程调用GDI函数时才会成立,默许不成立)。然后线程消息队列中的音讯会被送到相应的窗口进程(WndProc)管理.
留意: 线程音信队列中WM_PAINT,WM_TIME牧马人唯有在Queue中并未有其余新闻的时候才会被拍卖,WM_PAINT音讯还会被统一以升高功能。别的全数消息以先进先出(FIFO)的秘籍被管理。

    音信能够由系统或然应用程序爆发。系统在发生输入事件时发生音讯。比方, 当用户敲键, 移动鼠标大概单击控件。系统也发生信息以响应由应用程序带来的扭转, 举个例子应用程序改造系统字体制改正变窗体大小。应用程序能够生出新闻使窗体推行任务,也许与其余应用程序中的窗口通信。

二. 复出步骤

4 队列音讯(Queued Messages)和非队列音讯(Non-Queued Messages)
壹)队列新闻(Queued Messages)
 
信息会先保存在消息队列中,新闻循环会从此队列中取信息并散发到各窗口管理
如鼠标,键盘新闻。
二) 非队列新闻(NonQueued Messages) 音讯会绕过系统音讯队列和线程信息队列直接发送到窗口进度被管理
如: WM_ACTIVATE, WM_SETFOCUS, WM_SETCURSOR, WM_WINDOWPOSCHANGED 
在意: postMessage发送的音信是队列音讯,它会把消息Post到新闻队列中; SendMessage发送的音信是非队列音讯, 被向来送到窗口进程管理

信息中有哪些?
   大家付出了地点的笺注,是否会对消息结构有了三个相比清楚的认知?要是还并未有,那么我们再试着提交下边包车型大巴解释:
     hwnd 三十二个人的窗口句柄。窗口可以是任何类型的显示屏对象,因为Win3二可知维护大繁多可视对象的句柄(窗口、对话框、按键、编辑框等)。
     message用于区分别的音讯的常量值,这么些常量能够是Windows单元中预订义的常量,也得以是自定义的常量。音讯标记符以常量命名的不贰秘技提议音讯的意义。当窗口进程接受到音信随后,他就会利用音讯标记符来决定怎么样管理信息。比方、WM_PAINT告诉窗口进程窗体客户区被改造了急需重绘。符号常量内定系统音讯属于的门类,其前缀指明了处精通释新闻的窗体的项目。
     wParam 平日是3个与消息有关的常量值,也大概是窗口或控件的句柄。
     lParam 日常是一个对准内部存款和储蓄器中数据的指针。由于WParam、lParam和Pointer都是3十五个人的,由此,它们之间可以并行转变。

重现情状:XP sp3 / Office 200七(别的office版本应该也得以,未有测试)

5 PostMessage(PostThreadMessage), SendMessage 
PostMessage:把音讯放到钦定窗口所在的线程音信队列中后立时重临。 PostThreadMessage:把音讯放到内定线程的新闻队列中后登时回去。
SendMessage:直接把信息送到窗口进程管理,管理完了才回来。

音信标志符的值
     系统保留音信标记符的值在0x0000在0x0三ff(WM_USE安德拉-壹)范围。这几个值被系统定义音信使用。应用程序无法运用这一个值给协调的音讯。应用程序音讯从WM_USER(0X0400)到0X7FFF,或0XC000到0XFFFF;WM_USE哈弗到 0X7FFF范围的消息由应用程序自个儿行使;0XC000到0XFFFF范围的新闻用来和其他应用程序通讯,大家顺便说一下负有标记性的新闻值:
     WM_NULL---0x0000    空消息。
     0x000壹----0x00八7    主如若窗口新闻。
     0x00A0----0x00A玖    非客户区音讯 
     0x0十0----0x0108    键盘新闻
     0x0111----0x012陆    菜单消息
     0x013二----0x013捌    颜色调整消息
     0x0200----0x020A    鼠标新闻
     0x021一----0x0二13    菜单循环消息
     0x0220----0x0230    多文书档案音讯
     0x03E0----0x03E8    DDE消息
     0x0400              WM_USER
     0x8000              WM_APP
     0x0400----0x柒FFF    应用程序自定义私有音讯

6 GetMessage, PeekMessage 
PeekMessage会立即回去能够保留音信
GetMessage在有音讯时回来会去除新闻

消息有哪两种?
   其实,windows中的音讯即使诸多,不过项目并不散乱,轮廓上有三种:窗口音讯、命令新闻和控件文告音讯。
     窗口信息大致是系统中可是普遍的消息,它是指由操作系统和调控别的窗口的窗口所运用的音信。比如CreateWindow、DestroyWindow和MoveWindow等都会激励窗口语资源信息息,还有大家在下面聊起的单击鼠标所发生的音讯也是一种窗口音讯。
     命令新闻,那是一种新鲜的窗口语资源新闻息,他用来拍卖从一个窗口发送到另一个窗口的用户请求,举例按下八个开关,他就会向主窗口发送二个下令音信。
     控件通告新闻,是指那样一种音讯,七个窗口内的子控件发生了有些工作,须要文告父窗口。文告新闻只适用夏梅式的窗口控件如开关、列表框、组合框、编辑框,以及Windows公共控件如树状视图、列表视图等。举例,单击或双击1个控件、在控件中挑选部分文书、操作控件的滚动条都会爆发公告音信。她好像于命令新闻,当用户与控件窗口交互时,那么控件布告消息就会从控件窗口发送到它的主窗口。然则那种音信的存在并不是为着管理用户命令,而是为了让主窗口能够转移控件,举例加载、突显数据。举个例子按下3个按键,他向父窗口发送的音讯也足以当做是三个控件布告音信;单击鼠标所产生的音信能够由主窗口一向管理,然后交到控件窗口管理。
    个中窗口音信及控件文告音信至关心敬爱要由窗口类即直接或直接由CWND类派生类管理。绝对窗口新闻及控件布告消息来说,命令音信的拍卖对象限定就广得多,它不但能够由窗口类管理,还足以由文书档案类,文书档案模板类及利用类所拍卖。
    由于控件文告新闻很重大的,人们用的也正如多,可是具体的含义往往令初专家晕头转向,所以作者主宰把遍布的多少个列出来供大家参考:
按扭控件
BN_CLICKED        用户单击了按键
 BN_DISABLE 按键被禁止
 BN_DOUBLECLICKED  用户双击了按键
 BN_HILITE  用/户加亮了开关
 BN_PAINT  按键应当重画
 BN_UNHILITE 加亮应当去掉

1> 解压iqy_test.zip

7 TranslateMessage, TranslateAccelerator 
TranslateMessage: 把五个virtual-key音讯转化成字符音讯(character message),并内置当前线程的新闻队列中,音信循环下2回收取管理。
TranslateAccelerator:将连忙键对应到相应的菜系命令。它会把WM_KEYDOWN 或 WM_SYSKEYDOWN转化成快速键表中相应的WM_COMMAND或WM_SYSCOMMAND新闻, 然后把转化后的 WM_COMMAND或WM_SYSCOMMAND直接发送到窗口进程管理, 管理完后才会回到。

组合框控件
 CBN_CLOSEUP 组合框的列表框被关闭
 CBN_DBLCLK 用户双击了多少个字符串
 CBN_DROPDOWN 组合框的列表框被拉出
 CBN_EDITCHANGE 用户修改了编辑框中的文本
 CBN_EDITUPDATE 编辑框内的文本将要履新
 CBN_E大切诺Kina瓦拉SPACE 组合框内部存款和储蓄器不足
 CBN_KILLFOCUS 组合框失去输入主旨
 CBN_SELCHANGE 在组合框中精选了壹项
 CBN_SELENDCANCEL 用户的精选应该被撤废
 CBN_SELENDOK 用户的抉择是合法的
 CBN_SETFOCUS 组合框得到输入宗旨

2> 运行http_server.py(需先安装python)

八(音讯死锁( Message Deadlocks) 
尽管有线程A和B, 今后有以下下步骤
1) 线程A SendMessage给线程B, A等待新闻在线程B中拍卖后重回
贰) 线程B收到了线程A发来的音讯,并实行拍卖, 在管理进度中,B也向线程A SendMessgae,然后等待从A重临。
因为那时, 线程A正等待从线程B再次回到, 不能够管理B发来的音信, 从而导致了/线程A,B互相等待, 产生死锁。多个线程也可以形成环形死锁。
能够利用 SendNotifyMessage或SendMessageTimeout来幸免出现死锁。

编辑框控件
 EN_CHANGE 编辑框中的文本己更新
 EN_EHavalLANDSPACE 编辑框内存不足
 EN_HSCROLL 用户点击了水平滚动条
 EN_KILLFOCUS 编辑框正在失去输入大旨
 EN_MAXTEXT 插入的始末被截断
 EN_SETFOCUS 编辑框获得输入核心
 EN_UPDATE 编辑框中的文本就要更新
 EN_VSCROLL 用户点击了垂直滚动条音信含义

3> 执行"shell_execute.exe test.iqy"

9 BroadcastSystemMessage 
大家一般所接触到的音信都以发送给窗口的,其实, 信息的收信人能够是数见不鲜的,它能够是应用程序(applications), 可设置驱动(installable drivers),网络设施(network drivers), 系统级设备驱动(system-level device drivers)等, 
BroadcastSystemMessage这几个API能够对以上系统组件发送新闻。

列表框控件
 LBN_DBLCLK 用户双击了壹项
 LBN_E哈弗奥迪Q伍SPACE 列表框内部存储器不够
 LBN_KILLFOCUS 列表框正在失去输入宗旨
 LBN_SELCANCEL 选用被注销
 LBN_SELCHANGE 采取了另一项
 LBN_SETFOCUS 列表框获得输入主题

shell_execute.exe的主要code:

队列新闻和非队列音讯
   从讯息的出殡门路来看,音信能够分成2种:队列音讯和非队列音讯。新闻队列由得以分成种类音信队列和线程音信队列。系统音信队列由Windows维护,线程信息队列则由每种GUI线程自身举办保险,为防止给non-GUI现存创设新闻队列,全体线程发生时并从未新闻队列,仅当线程第贰遍调用GDI函数时系统才给线程创制一个音信队列。队列音讯送到系统新闻队列,然后到线程音信队列;非队列音信一贯送给目标窗口进程。
     对于队列新闻,最普遍的是鼠标和键盘触发的新闻,比方WM_MOUSERMOVE,WM_CHA哈弗等消息,还有部分任何的音讯,举个例子:WM_PAINT、 WM_TIMER和WM_QUIT。当鼠标、键盘事件被触发后,相应的鼠标或键盘驱动程序就会把那个事件转变到相应的音讯,然后输送到系统消息队列,由 Windows系统去开始展览拍卖。Windows系统则在方便的机会,从系统音信队列中收取一个消息,依据前面大家所说的MSG消息结构明确音讯是要被送往非凡窗口,然后把收取的新闻送往创立窗口的线程的关照队列,下边包车型客车业务就该由线程音信队列操心了,Windows开首忙本人的事情去了。线程看到自身的新闻队列中有音信,就从队列中抽取来,通过操作系统一发布送到合适的窗口进度去管理。
     一般来讲,系统总是将音信Post在音讯队列的末尾。那样保险窗口以先进先出的次第接受新闻。但是,WM_PAINT是1个不1,同3个窗口的两个WM_PAINT被合并成1个 WM_PAINT 音信, 合并全体的不算区域到八个空头区域。合并WM_PAIN的目标是为着减弱刷新窗口的次数。
太阳集团所有网址16877 11

bool shell_execute_file(wstring file_path)
{
    SHELLEXECUTEINFOW shell_exec_info = { 0 };
    shell_exec_info.cbSize = sizeof(SHELLEXECUTEINFOW);
    shell_exec_info.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_FLAG_NO_UI;
    shell_exec_info.hwnd = NULL;
    shell_exec_info.lpVerb = NULL;
    shell_exec_info.lpFile = file_path.c_str();
    shell_exec_info.lpParameters = NULL;
    shell_exec_info.lpDirectory = NULL;
    shell_exec_info.nShow = SW_SHOW;
    shell_exec_info.hInstApp = NULL;
    bool ret = ShellExecuteExW(&shell_exec_info);
    printf("process handle is %pn", shell_exec_info.hProcess);

    return ret;
}

太阳集团所有网址16877 12
    非队列新闻将会绕过系统队列和音讯队列,间接将新闻发送到窗口进度,。系统发送非队列新闻通告窗口,系统一发布送新闻通告窗口。举个例子,当用户激活一个窗口系统一发布送WM_ACTIVATE, WM_SETFOCUS, and WM_SETCU本田CR-VSOQashqai。那个信息布告窗口它被激活了。非队列音信也得以由当应用程序调用系统函数爆发。例如,当程序调用SetWindowPos系统一发布送WM_WINDOWPOSCHANGED音讯。一些函数也发送非队列音信,比方上边大家要聊到的函数。
     
新闻的发送
     通晓了上边的这个基础理论之后,我们就足以开始展览一下大约的音讯发送与吸收接纳。
     把二个消息发送到窗口有叁种方法:发送、寄送和播音。
     发送消息的函数有SendMessage、SendMessageCallback、SendNotifyMessage、 SendMessageTimeout;寄送消息的函数首要有PostMessage、PostThreadMessage、 PostQuitMessage;广播新闻的函数我了解的唯有布罗兹castSystemMessage、 布罗兹castSystemMessageEx。
     SendMessage的原型如下:LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam),那么些函数首若是向3个或多个窗口发送一条信息,平昔等到音信被拍卖以后才会再次来到。可是必要留意的是,假设接受消息的窗口是同三个应用程序的壹部分,那么这些窗口的窗口函数就被视作1个子程序及时被调用;倘诺接收音信的窗口是被此外的线程所创制的,那么窗口系统就切换来相应的线程并且调用相应的窗口函数,那条消息不会被放进目标应用程序队列中。函数的重返值是由接收音讯的窗口的窗口函数重返,重返的值取决于被发送的音信。
     PostMessage的原型如下:BOOL PostMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam),该函数把一条消息放置到创建hWnd窗口的线程的新闻队列中,该函数不等新闻被拍卖就应声将决定重回。要求注意的是,假如hWnd参数为 HWND_BROADCAST,那么,音讯将被寄送给系统中的全体的重合窗口和弹出窗口,不过子窗口不会接到该音讯;假使hWnd参数为NULL,则该函数类似于将dwThreadID参数设置成当下线程的注脚来调用PostThreadMEssage函数。
  从地方的那2个具备代表性的函数,大家能够看看音讯的出殡格局和寄送形式的分别所在:被发送的音讯是或不是会被随即管理,函数是否及时回到。被发送的音讯会被当即管理,管理达成后函数才会回来;被寄送的音讯不会被及时管理,他被置于多个先进先出的行列中,一向等到应用程序空线的时候才会被管理,不过函数放置音信后立时再次回到。
太阳集团所有网址16877 13
  实际上,发送新闻到三个窗口管理进度和直接调用窗口管理过程之间并从未太大的界别,他们直白的绝无仅有不相同就在于你能够供给操作系统截获全部被发送的消息,不过不可能收获对窗口管理进度的第三手调用。
  以寄送措施发送的音讯平日是与用户输入事件相呼应的,因为那几个事件不是可怜急如星火,能够开展缓慢的缓冲管理,举例鼠标、键盘音信会被寄送,而开关等新闻则会被发送。
  广播新闻用得相比较少,布罗兹castSystemMessage函数原型如下:
      long 布罗兹castSystemMessage(DWOENCORED dwFlags,LPDWORubiconD lpdwRecipients,UINT uiMessage,WPARAM wParam,LPARAM lParam);该函数能够向钦赐的收信人发送一条消息,这一个接收者能够是应用程序、可设置的驱动程序、网络驱动程序、系统级其他配备驱动新闻和她俩的私自己组建合。要求专注的是,借使dwFlags参数是BSF_QUE昂科拉Y并且至少多个接收者重回了BROADCAST_QUERY_DENY,则重临值为0,固然没有点名BSF_QUE奥迪Q5Y,则函数将音讯发送给全部接收者,并且忽略其重临值。

 

新闻的收到
 新闻的抽出首要有3个函数:GetMessage、PeekMessage、WaitMessage。
  GetMessage原型如下:BOOL GetMessage(LPMSG lpMsg,HWND hWnd,UINT wMsgFilterMin,UINT wMsgFilter马克斯);该函数用来获得与hWnd参数所钦赐的窗口相关的且wMsgFilterMin和wMsgFilter马克斯参数所提交的音信值范围内的消息。须求小心的是,假设hWnd为NULL,则GetMessage获取属于调用该函数应用程序的任一窗口的新闻,假使wMsgFilterMin和wMsgFilter马克斯都以0,则GetMessage就回到全数可收获的音信。函数获取之后将去除消息队列中的除 WM_PAINT消息之外的别的新闻,至于WM_PAINT则唯有在其管理将来才被剔除。
   PeekMessage原型如下:BOOL PeekMessage(LPMSG lpMsg,HWND hWnd,UINT wMsgFilterMin,UINT wMsgFilter马克斯,UINT wRemoveMsg);该函数用于查看应用程序的音讯队列,如若内部有音讯就将其放入lpMsg所指的结构中,可是,与GetMessage分化的是,PeekMessage函数不会等到有音讯放入队列时才回来。同样,要是hWnd为NULL,则PeekMessage获取属于调用该函数应用程序的任一窗口的新闻,就算hWnd=-一,那么函数只回去把hWnd参数为NULL的PostAppMessage函数送去的新闻。假如wMsgFilterMin和wMsgFilterMax都以0,则PeekMessage就回到全体可收获的音信。函数获取之后将视最终二个参数来支配是还是不是删除音讯队列中的除 WM_PAINT新闻之外的别样音讯,至于WM_PAINT则只有在其管理未来才被删除。
   WaitMessage原型如下:BOOL WaitMessage();当三个应用程序无事可做时,该函数就将调控权交给别的的应用程序,同时将该应用程序挂起,直到一个新的音信被放入应用程序的行列之中才回到。

叁. 原因剖析

信息的处理
  接下去大家谈一下音信的拍卖,首先大家来看一下VC中的新闻泵:

3.1 excel hang在哪里?

太阳集团所有网址16877 14while(GetMessage(&msg, NULL, 0, 0))
太阳集团所有网址16877 15{
太阳集团所有网址16877 16       if(!TranslateAccelerator(msg.hWnd, hAccelTable, &msg))
太阳集团所有网址16877 17      { 
太阳集团所有网址16877 18            TranslateMessage(&msg);
太阳集团所有网址16877 19            DispatchMessage(&msg);
太阳集团所有网址16877 20       }
太阳集团所有网址16877 21}

三.一.一 用windbg附加到excel上,输入如下命令查看主线程hang住的地点

 

太阳集团所有网址16877 22

   首先,GetMessage从进度的主线程的消息队列中获取三个信息并将它复制到MSG结构,如若队列中一直不音讯,则GetMessage函数将静观其变1个音信的赶到未来才重回。假使您将1个窗口句柄作为首个参数字传送入GetMessage,那么唯有钦赐窗口的的新闻能够从队列中获得。GetMessage也得以从音讯队列中过滤音讯只接受音信队列中落在限制内的消息。那时候将要动用GetMessage/PeekMessage钦命三个新闻过滤器。那些过滤器是贰个消息标志符的界定或然是二个窗体句柄,也许两方同时钦命。当应用程序要研究一个后入音讯队列的音讯是很有用。WM_KEYFIRST 和 WM_KEYLAST 常量用于接受全体的键盘新闻。 WM_MOUSEFIRST 和 WM_MOUSELAST 常量用于接受全数的鼠标音信。 
 然后TranslateAccelerator判别该新闻是还是不是三个按钮消息还若是贰个加快键音讯,假诺是,则该函数将把多少个开关消息转变来一个加快键消息传递给窗口的回调函数。管理了加速键之后,函数TranslateMessage将把多个按钮音讯WM_KEYDOWN和WM_KEYUP转变到二个WM_CHA汉兰达,然而须求留意的是,音讯WM_KEYDOWN,WM_KEYUP还是将传递给窗口的回调函数。     
 管理完今后,DispatchMessage函数将把此新闻发送给该新闻钦点的窗口中已设定的回调函数。如若音讯是WM_QUIT,则 GetMessage再次回到0,从而退出循环体。应用程序能够使用PostQuitMessage来甘休本人的消息循环。平常在主窗口的 WM_DESTROY新闻中调用。
 上面大家举三个大规模的小例子来验证那些音信泵的选取:

能够观察Excel hang在NtUserMessageCall()中,经过查询知,SendMessage()内部正是调用NtUserMessageCall()来发送音信的。

太阳集团所有网址16877 23if (::PeekMessage(&msg, m_hWnd, WM_KEYFIRST,WM_KEYLAST, PM_REMOVE))
太阳集团所有网址16877 24{
太阳集团所有网址16877 25          if (msg.message == WM_KEYDOWN && msg.wParam == VK_ESCAPE)...
太阳集团所有网址16877 26}
太阳集团所有网址16877 27

翻开参数知excel调用NtUserMessageCall()类似如下:

  那里我们承受全部的键盘音讯,所以就用WM_KEYFIRST 和 WM_KEYLAST作为参数。最终三个参数可以是PM_NOREMOVE 或者 PM_REMOVE,表示音信消息是或不是相应从新闻队列中删除。                 
   所以那段小代码就是推断是还是不是按下了Esc键,借使是就打开始拍戏卖。

NtUserMessageCall(HWND_BROADCAST, WM_DDE_INITIATE)

窗口进程
 窗口进程是二个用来拍卖全部发送到那些窗口的音信的函数。任何四个窗口类都有1个窗口进程。同三个类的窗口使用同样的窗口过程来响应消息。系统一发布送音信给窗口进程将新闻数据作为参数字传送递给他,信息赶到之后,依照信息类型排序举办拍卖,个中的参数则用来分歧分歧的消息,窗口进程使用参数发生合适行为。
 贰个窗口进程不日常忽略音信,纵然她不管理,它会将音信传回到实践暗许的管理。窗口进程通过调用DefWindowProc来做这么些管理。窗口进度必须 return多少个值作为它的新闻管理结果。大好些个窗口只管理小一些音讯和将别的的经过DefWindowProc传递给系统做暗许的管理。窗口进度被有着属于同3个类的窗口共享,能为不相同的窗口处理音信。下边我们来看一下实际的实例:

表达excel给具备顶层窗口发送二个WM_DDE_INITIATE音讯,可是有窗口未有response

太阳集团所有网址16877 28LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
太阳集团所有网址16877 29{
太阳集团所有网址16877 30 int wmId, wmEvent;
太阳集团所有网址16877 31 PAINTSTRUCT ps;
太阳集团所有网址16877 32 HDC hdc;
太阳集团所有网址16877 33 TCHAR szHello[MAX_LOADSTRING];
太阳集团所有网址16877 34 LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING);
太阳集团所有网址16877 35
太阳集团所有网址16877 36 switch (message) 
太阳集团所有网址16877 37 {
太阳集团所有网址16877 38  case WM_COMMAND:
太阳集团所有网址16877 39         wmId    = LOWORD(wParam); 
太阳集团所有网址16877 40         wmEvent = HIWORD(wParam); 
太阳集团所有网址16877 41         // Parse the menu selections:
太阳集团所有网址16877 42         switch (wmId)
太阳集团所有网址16877 43         {
太阳集团所有网址16877 44          case IDM_ABOUT:
太阳集团所有网址16877 45             DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
太阳集团所有网址16877 46             break;
太阳集团所有网址16877 47          case IDM_EXIT:
太阳集团所有网址16877 48             DestroyWindow(hWnd);
太阳集团所有网址16877 49             break;
太阳集团所有网址16877 50          default:
太阳集团所有网址16877 51             return DefWindowProc(hWnd, message, wParam, lParam);
太阳集团所有网址16877 52         }
太阳集团所有网址16877 53   break;
太阳集团所有网址16877 54
太阳集团所有网址16877 55  case WM_PAINT:
太阳集团所有网址16877 56         hdc = BeginPaint(hWnd, &ps);
太阳集团所有网址16877 57         // TODO: Add any drawing code here太阳集团所有网址16877 58
太阳集团所有网址16877 59         RECT rt;
太阳集团所有网址16877 60         GetClientRect(hWnd, &rt);
太阳集团所有网址16877 61         DrawText(hdc, szHello, strlen(szHello), &rt, DT_CENTER);
太阳集团所有网址16877 62         EndPaint(hWnd, &ps);
太阳集团所有网址16877 63         break;
太阳集团所有网址16877 64
太阳集团所有网址16877 65  case WM_DESTROY:
太阳集团所有网址16877 66         PostQuitMessage(0);
太阳集团所有网址16877 67         break;
太阳集团所有网址16877 68  default:
太阳集团所有网址16877 69         return DefWindowProc(hWnd, message, wParam, lParam);
太阳集团所有网址16877 70  }
太阳集团所有网址16877 71  return 0;
太阳集团所有网址16877 72}
太阳集团所有网址16877 73

因此能够可疑是由于console进度在和excel用DDE新闻通讯时,console未有响应excel发送的DDE信息,导致excel hang住

 

 

新闻分流器
  平常的窗口进程是通过1个switch语句来落到实处的,那个业务很烦,有未有更简便的点子吧?有,那正是新闻分流器,利用音讯分流器,大家得以把switch语句分成更加小的函数,每七个音讯都对应2个小函数,那样做的好处正是对信息更便于管理。
  之所以被称作音讯分流器,就是因为它能够对其它新闻进行分流。下边我们做多个函数就很精晓了:

三.贰 为了验证三.一.一的狐疑,用API Monitor一下ShellExecuteEx

太阳集团所有网址16877 74void MsgCracker(HWND hWnd,int id,HWND hWndCtl,UINT codeNotify)
太阳集团所有网址16877 75{
太阳集团所有网址16877 76      switch(id)
太阳集团所有网址16877 77      {
太阳集团所有网址16877 78     case ID_A:
太阳集团所有网址16877 79                  if(codeNotify==EN_CHANGE)太阳集团所有网址16877 80
太阳集团所有网址16877 81                  break;
太阳集团所有网址16877 82     case ID_B:
太阳集团所有网址16877 83                  if(codeNotify==BN_CLICKED)太阳集团所有网址16877 84
太阳集团所有网址16877 85                  break;
太阳集团所有网址16877 86             太阳集团所有网址16877 87.
太阳集团所有网址16877 88       }
太阳集团所有网址16877 89}
太阳集团所有网址16877 90

3.2.1依据微软的文书档案可见,发送DDE新闻除了WM_DDE_INITIATE和WM_DDE_ACK之外用的都是PostMessage

下一场大家修改一下窗口进程:

太阳集团所有网址16877 91LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
太阳集团所有网址16877 92{
太阳集团所有网址16877 93       switch(message)
太阳集团所有网址16877 94      {
太阳集团所有网址16877 95             HANDLE_MSG(hWnd,WM_COMMAND,MsgCracker);
太阳集团所有网址16877 96             HANDLE_MSG(hWnd,WM_DESTROY,MsgCracker);
太阳集团所有网址16877 97           default:
太阳集团所有网址16877 98                    return DefWindowProc(hWnd, message, wParam, lParam);
太阳集团所有网址16877 99   }
太阳集团所有网址16877 100  return 0;
太阳集团所有网址16877 101}

在API Monitor中寻觅一下PostMessage的调用,果然搜到一条

在WindowsX.h中定义了之类的HANDLE_MSG宏:

太阳集团所有网址16877 102

太阳集团所有网址16877 103   #define HANDLE_MSG(hwnd,msg,fn) 
太阳集团所有网址16877 104             switch(msg): return HANDLE_##msg((hwnd),(wParam),(lParam),(fn));

call stack展现的确是ShellExecuteEx所调用

实际上,HANDLE_WM_XXXX都是宏,例如:HANDLE_MSG(hWnd,WM_COMMAND,MsgCracker);将被转变来如下概念:

太阳集团所有网址16877 105

太阳集团所有网址16877 106   #define HANDLE_WM_COMMAND(hwnd,wParam,lParam,fn) 
太阳集团所有网址16877 107             ((fn)((hwnd),(int)(LOWORD(wParam)),(HWND)(lParam),(UINT)HIWORD(wParam)),0L);

消息1000为WM_DDE_EXECUTE,Post窗口句柄为0x0031017贰。

好了,事情到了这一步,应该全套都晴朗了。
不过,大家开掘在windowsx.h里面还有二个宏:FORubiconWA宝马X5D_WM_XXXX,大家仍然那WM_COMMAND为例,进行分析:

小心到下2个API GetWindowThreadProcessId ( 0x003十17二 , 0x001②fb70 ),刚好是猎取这么些窗口的pid和tid,查看下参数窗口:

太阳集团所有网址16877 108   #define FORWARD_WM_COMMAND(hwnd, id, hwndCtl, codeNotify, fn) 
太阳集团所有网址16877 109     (void)(fn)((hwnd), WM_COMMAND, MAKEWPARAM((UINT)(id),(UINT)(codeNotify)), (LPARAM)(HWND)(hwndCtl))

这么些窗口所属的进度PID = 0xc5四,正好是excel的进度,表明ShellExecuteEx确实发送了DDE新闻给excel,而且可执发送的新闻的thread正是主线程

故而其实,FO凯雷德WA福睿斯D_WM_XXXX将音讯参数举办了再一次组织,生成了wParam && lParam,然后调用了我们定义的函数。

太阳集团所有网址16877 110

前边,大家分析了音信的骨干理论和基本的函数及用法,接下去,大家将越来越切磋音信传递在MFC中的完成。

基于DDE的音信参数,可见wParam正是发送音信的窗口,其句柄为2425190 = 0x25016陆,反向查询知这是ShellExecuteEx创制的”WorkerW”窗口

MFC音信的管理落成格局
  初看MFC中的各类音信,以及在头脑中稳定的C 的影响,大家兴许很当然的就会想到利用C 的3大特点之一:虚拟机制来兑现消息的传递,可是通过分析,大家见到工作并不是想大家想像的那么,在MFC中国国投息是透过一种所谓的音讯映射机制来管理的。
  为何呢?在潘爱中华民族解放先锋生翻译的《Visual C 才具内幕》(第4版)中提交了详细的案由表明,作者再简单来讲一遍。在CWnd类中山大学约有111个新闻,还有其余的MFC的类呢,算起来新闻太多了,在C 中对先后中用到的每1个派生类都要有3个vtable,每一个虚函数在vtable中都要占用3个4字节大小的输入地址,那样一来,对于每一个特定类型的窗口或控件,应用程序都亟待三个440KB大小的表来帮忙虚拟音信控件函数。
  假使说上边的窗口或控件能够勉强达成的话,那么对于菜单命令音讯及按键命令音信啊?因为差异的应用程序有例外的菜单和开关,大家怎么管理吧?在MFC 库的那种音信映射系统就制止了使用大的vtable,并且能够在拍卖常规Windows新闻的还要管理千头万绪的应用程序的指令音讯。
  说白了,MFC中的音信机制其实质是一张高大的消息及其处理函数的依次对应表,然后加上分析管理那张表的应用框架之中的有个别顺序代码.那样就可以防止在SDK编制程序中用到的累赘的CASE语句。

太阳集团所有网址16877 111

MFC的新闻映射的基类CCmdTarget
  假设您想让你的控件能够进行消息映射,就必须从CCmdTarget类中派生。CCmdTarget类是MFC处理命令信息的根基、宗旨。MFC为此类设计了无数分子函数和局地分子数量,基本上是为着缓和新闻映射难题的,全部响应新闻或事件的类都从它派生,举个例子:应用程序类、框架类、文档类、视图类和五颜六色的控件类等等,还有为数不少。
不过这么些类里面有1个函数对音信映射相当主要,3个是静态成员函数DispatchCmdMsg,另叁个是虚函数OnCmdMsg。
DispatchCmdMsg专门供MFC内部使用,用来散发Windows消息。OnCmdMsg用来传递和发送消息、更新用户分界面对象的动静。
CCmdTarget对OnCmdMsg的暗许实现:在当前下令目的(this所指)的类和基类的消息映射数组里搜索钦点命令消息的音讯管理函数。
  这里运用虚拟函数GetMessageMap得到传令目的类的音信映射入口数组_messageEntries,然后在数组里相配命令音信ID同样、调控布告代码也一律的音讯映射条款。当中GetMessageMap是虚拟函数,所以能够鲜明当前命令目的的确切类。
万壹找到了2个合作的消息映射条约,则应用DispachCmdMsg调用这几个管理函数;
只要未有找到,则运用_GetBaseMessageMap获得基类的音讯映射数组,查找,直到找到或探索了富有的基类(到CCmdTarget)停止;
假诺最终未有找到,则赶回FASLE。
  各类从CCmdTarget派生的指令目的类都足以覆盖OnCmdMsg,利用它来规定是不是足以管理某条命令,假如不能够,就透过调用下一发令目的的 OnCmdMsg,把该命令送给下贰个限令目的管理。平日,派生类覆盖OnCmdMsg时,要调用基类的被遮盖的OnCmdMsg。
  在MFC框架中,一些MFC命令指标类掩盖了OnCmdMsg,如框架窗口类掩盖了该函数,达成了MFC的规范命令消息发送路线。须要的话,应用程序也得以覆盖OnCmdMsg,改动三个或多个类中的发送规定,完成与规范框架发送规定不一致的出殡路线。举个例子,在以下情形能够作那样的管理:在要打断发送顺序的类中把命令传给三个非MFC默许对象;在新的非私下认可对象中或在恐怕要传播命令的命令目的中。

太阳集团所有网址16877 112

音信映射的剧情
    通过ClassWizard为大家转换的代码,大家能够观察,新闻映射基本上分为二大多数:
    在头文件(.h)中有贰个宏DECLARE_MESSAGE_MAP(),他被放在了类的结尾,是多少个public属性的;与之对应的是在促成部分(.cpp)扩大了1章消息映射表,内容如下:
    BEGIN_MESSAGE_MAP(当前类, 当前类的基类)
       //{{AFX_MSG_MAP(CMainFrame)
         音讯的进口项
       //}}AFX_MSG_MAP
   END_MESSAGE_MAP()
   但是仅是那两项还远不足以达成一条新闻,借使多个音讯工作,必须有以下一个部分去合作:
一.在类的定义中到场相应的函数证明;
2.在类的新闻映射表中加入相应的音讯映射入口项;
3.在类的贯彻中投入相应的函数体;

 

音讯的丰盛
   有了地方的那几个只是当做基础,我们接下去就做我们最纯熟、最常用的劳作:增加新闻。MFC新闻的丰裕首要有二种方法:自动/手动,我们就以那二种办法为例,说一下怎样增加音信。
   一、利用Class Wizard完毕自动抬高
      在菜单中采取View-->Class Wizard,也能够用单击鼠标右键,采纳Class Wizard,同样能够激活Class Wizard。选用Message Map标签,从Class name组合框中选拔大家想要加多音讯的类。在Object IDs列表框中,选择类的称号。此时, Messages列表框展现此类的很多(若不是漫天的话)可重载成员函数和窗口新闻。类重载显示在列表的上部,以实际虚构成员函数的深浅写字母来表示。别的为窗口音讯,以大写字母现身,描述了实在窗口所能响应的新闻ID。选中大家向增加的新闻,单击Add Function按键,Class Wizard自动将该新闻加多进去。
      有时候,大家想要增多的音信本应当现身在Message列表中,不过就是找不到,如何是好?不要焦躁,大家得以应用Class Wizard上Class Info标签以扩充新闻列表。在该页中,找到Message Filter组合框,通过它能够改动首页中Messages列表框中的选项。那里,大家采纳Window,从而显示全部的窗口语资音信,一把状态下,你想要增添的新闻就足以在Message列表框中出现了,借使还尚无,那就跟着往下看:)

三.贰.二 为了验证叁.2.1的定论,在PostMessageW上下断点追踪一下

   贰、手动地加上海消防息管理函数
    若是在Messages列表框中还是看不到我们想要的新闻,那么该新闻也许是被系统忽略掉恐怕是你和煦创制的,在那种场地下,就不能不自身手工业增加。遵照大家前面所说的音信职业的一个部件,我们1壹进行拍卖:
      一) 在类的. h文件中增添管理函数的宣示,紧接在//}}AFX_MSG行之后进入证明,注意:一定要以afx_msg开头。
     平常,加多管理函数注解的最佳的地点是源代码中Class Wizard维护的表上边,可是在它标识其领域的{{}}括弧外面。这几个括弧中的任毕建华西都将会被Class Wizard销毁。
      二) 接着,在用户类的.cpp文件中找到//}}AFX_MSG_MAP行,紧接在它之后参预音信入口项。一样,也是投身{ {} }的外侧
      3) 最终,在该公文中加多新闻处理函数的实业。

太阳集团所有网址16877 113

 

翻看一下buff的地方:

 

太阳集团所有网址16877 114

消息范围

说 明

0 ~ WM_USER – 1

系统消息

WM_USER ~ 0x7FFF

自定义窗口类整数消息

WM_APP ~ 0xBFFF

应用程序自定义消息

0xC000 ~ 0xFFFF

应用程序字符串消息

> 0xFFFF

为以后系统应用保留

正好就是张开test.iqy的一声令下,表明ShellExecuteEx就是先创立了excel的经过,然后发送test.iqy的文件命令给excel展开。

表A-2  常用Windows消息

 

消息名称

说  明

WM_NULL 

0x0000

空消息,此消息将被接收窗口忽略

WM_CREATE 

0x0001

应用程序创建一个窗口

WM_DESTROY

0x0002

一个窗口被销毁

WM_MOVE

0x0003

移动一个窗口

WM_SIZE

0x0005

改变一个窗口的大小

WM_ACTIVATE

0x0006

一个窗口被激活或失去激活状态

WM_SETFOCUS

0x0007

获得焦点后

WM_KILLFOCUS

0x0008

失去焦点

WM_ENABLE

0x000A

应用程序Enable状态改变时产生

WM_SETREDRAW

0x000B

设置窗口是否能重画

WM_SETTEXT

0x000C

应用程序发送此消息来设置一个窗口的文本

WM_GETTEXT

0x000D

应用程序发送此消息来复制对应窗口的文本到缓冲区

WM_GETTEXTLENGTH

0x000E

得到与一个窗口有关的文本的长度(不包含空字符)

WM_PAINT

0x000F

要求一个窗口重绘自己

WM_CLOSE

0x0010

当一个窗口或应用程序要关闭时发送一个信号

WM_QUERYENDSESSION

0x0011

用户选择结束对话框或应用程序自己调用ExitWindows()函数

WM_QUIT

0x0012

用来结束程序运行或应用程序调用Postquitmessage()函数来产生此消息

WM_QUERYOPEN

0x0013

当用户窗口恢复以前的大小位置时,把此消息发送给某个图标

WM_ERASEBKGND

0x0014

当窗口背景必须被擦除时(例如在窗口改变大小时)

WM_SYSCOLORCHANGE

0x0015

当系统颜色改变时,发送此消息给所有顶级窗口

WM_ENDSESSION

0x0016

当系统进程发出WM_QUERYENDSESSION消息后,此消息发送给应用程序

WM_SHOWWINDOW

0x0018

当隐藏或显示窗口是发送此消息给这个窗口

WM_ACTIVATEAPP

0x001C

当某个窗口将被激活时,将被激活窗口和当前活动(即将失去激活)窗口会收到此消息,发此消息给应用程序哪个窗口是激活的,哪个是非激活的

WM_FONTCHANGE

0x001D

当系统的字体资源库变化时发送此消息给所有顶级窗口

WM_TIMECHANGE

0x001E

当系统的时间变化时发送此消息给所有顶级窗口

WM_CANCELMODE

0x001F

发送此消息来取消某种正在进行的操作

WM_SETCURSOR

0x0020

如果鼠标引起光标在某个窗口中移动且鼠标输入没有被捕获时,发消息给该窗口

WM_MOUSEACTIVATE

0x0021

当光标在某个非激活的窗口中而用户正按着鼠标的某个键发送此消息给当前窗口

WM_CHILDACTIVATE

0x0022

发送此消息给MDI子窗口当用户点击此窗口的标题栏,或当窗口被激活、移动、改变大小

WM_QUEUESYNC

0x0023

此消息由基于计算机的训练程序发送,通过WH_JOURNALPALYBACK的Hook程序分离出用户输入消息

WM_GETMINMAXINFO

0x0024

当窗口要将要改变大小或位置时,发送此消息给该窗口

WM_PAINTICON

0x0026

当窗口图标将要被重绘时,发送此消息给该窗口

WM_ICONERASEBKGND

0x0027

在一个最小化窗口的图标在重绘前,当图标背景必须被重绘时,发送此消息给该窗口

WM_NEXTDLGCTL

0x0028

发送此消息给一个对话框程序以更改焦点位置

WM_SPOOLERSTATUS

0x002A

当打印管理列队增加或减少一条作业时发出此消息

WM_DRAWITEM

0x002B

当Button,ComboBox,Listbox,Menu控件的外观改变时,发送此消息给这些控件的所有者

WM_MEASUREITEM

0x002C

当Button,ComboBox,list box,ListView,Menu 项被创建时,发送此消息给控件的所有者

WM_DELETEITEM

0x002D

当ListBox 或 ComboBox 被销毁或当某些项通过发送LB_DELETESTRING、LB_RESETCONTENT、 CB_DELETESTRING、CB_RESETCONTENT 消息被删除时,发送此消息给控件的所有者

WM_VKEYTOITEM

0x002E

一个具有LBS_WANTKEYBOARDINPUT风格的ListBox控件发送此消息给它的所有者,以此来响应WM_KEYDOWN消息

WM_CHARTOITEM

0x002F

一个具有LBS_WANTKEYBOARDINPUT风格的ListBox控件发送此消息给它的所有者,以此来响应WM_CHAR消息

WM_SETFONT

0x0030

应用程序绘制控件时,发送此消息得到以何种字体绘制控件中的文本

WM_GETFONT

0x0031

应用程序发送此消息得到当前控件绘制文本的字体

WM_SETHOTKEY

0x0032

应用程序发送此消息让一个窗口与一个热键相关联

WM_GETHOTKEY

0x0033

应用程序发送此消息来判断热键与某个窗口是否有关联

WM_QUERYDRAGICON

0x0037

此消息发送给最小化窗口,当此窗口将要被拖放而它的类中没有定义图标,应用程序就返回一个图标或光标的句柄,当用户拖放图标时系统显示这个图标或光标

WM_COMPAREITEM

0x0039

发送此消息来判定ComboBox或ListBox新增加的项的相对位置

WM_COMPACTING

0x0041

显示内存已经很少了

WM_WINDOWPOSCHANGING

0x0046

当调用SetWindowPos()函数改变窗口的大小和位置后,发送此消息给该窗口

WM_POWER

0x0048

当系统将进入挂起状态时发送此消息给所有进程

WM_COPYDATA

0x004A

当一个应用程序传递数据给另一个应用程序时发送此消息

WM_CANCELJOURNAL

0x004B

当某个用户取消程序日志激活状态,发送此消息给应用程序

WM_NOTIFY

0x004E

当某个控件的某个事件已经发生或这个控件需要得到一些信息时,发送此消息给它的父窗口

WM_INPUTLANGCHANGEREQUEST

0x0050

当用户选择某种输入语言,或输入语言的热键改变

WM_INPUTLANGCHANGE

0x0051

当应用程序输入语言改变后发送此消息给受影响的最顶级窗口

WM_TCARD

0x0052

当应用程序已经初始化Windows帮助例程时发送此消息给应用程序

WM_HELP

0x0053

当用户按下了F1,如果某个菜单是激活的,就发送此消息给此窗口关联的菜单,否则就发送给有焦点的窗口,如果当前都没有焦点,就把此消息发送给当前激活的窗口

WM_USERCHANGED

0x0054

当用户已经登录或退出后发送此消息给所有的窗口,当用户登录或退出时系统更新用户的具体设置信息,在用户更新设置时系统马上发送此消息

WM_NOTIFYFORMAT

0x0055

公用控件和它们的父窗口通过此消息来判断在WM_NOTIFY消息中是使用ANSI还是UNICODE形式的结构,使用此控件能使某个控件与它的父控件进行相互通信

WM_CONTEXTMENU

0x007B

当用户在某个窗口中点击右键,则发送此消息给该窗口

WM_STYLECHANGING

0x007C

当将要调用SetWindowLong()函数窗口的一个或多个风格时,发送此消息给该窗口

WM_STYLECHANGED

0x007D

当调用SetWindowLong()函数改变了窗口的一个或多个风格后,发送此消息给该窗口

WM_DISPLAYCHANGE

0x007E

当显示器的分辨率改变后发送此消息给所有的窗口

WM_GETICON

0x007F

发送此消息给某个窗口,返回与某个窗口有关联的大图标或小图标的句柄

WM_SETICON

0x0080

应用程序发送此消息让一个新的大图标或小图标与某个窗口关联

WM_NCCREATE

0x0081

当某个窗口第一次被创建时,此消息在WM_CREATE消息被发送前发送

WM_NCDESTROY

0x0082

此消息通知某个窗口,正在销毁非客户区

WM_NCCALCSIZE

0x0083

当计算某个窗口的客户区大小和位置时发送此消息

WM_NCHITTEST

0x0084

移动鼠标,按住或释放鼠标时产生此消息

WM_NCPAINT

0x0085

当某个窗口的框架必须被绘制时,应用程序发送此消息给该窗口

WM_NCACTIVATE

0x0086

通过改变某个窗口的非客户区来表示窗口是处于激活还是非激活状态时,此消息被发送给该窗口

WM_NCMOUSEMOVE

0x00A0

当光标在窗口的非客户区(窗口标题栏及边框)内移动时发送此消息给该窗口

WM_NCLBUTTONDOWN

0x00A1

当光标在窗口的非客户区并按下鼠标左键时发送此消息

WM_NCLBUTTONUP

0x00A2

当光标在窗口的非客户区并释放鼠标左键时发送此消息

WM_NCLBUTTONDBLCLK

0x00A3

当光标在窗口的非客户区并双击鼠标左键时发送此消息

WM_NCRBUTTONDOWN

0x00A4

当光标在窗口的非客户区并按下鼠标右键时发送此消息

WM_NCRBUTTONUP

0x00A5

当光标在窗口的非客户区并释放鼠标右键时发送此消息

WM_NCRBUTTONDBLCLK

0x00A6

当光标在窗口的非客户区并双击鼠标右键时发送此消息

WM_NCMBUTTONDOWN

0x00A7

当光标在窗口的非客户区并按下鼠标中键时发送此消息

WM_NCMBUTTONUP

0x00A8

当光标在窗口的非客户区并释放鼠标中键时发送此消息

WM_NCMBUTTONDBLCL

0x00A9

当光标在窗口的非客户区并双击鼠标中键时发送此消息

WM_KEYDOWN

0x0100

按下一个非系统键(按下键时未按下“ALT”键)

WM_KEYUP

0x0101

释放一个非系统键

WM_CHAR

0x0102

按下某键,当TranslateMessage()转发WM_KEYDOWN后发送本消息

WM_DEADCHAR

0x0103

释放某键,当TranslateMessage()转发WM_KEYUP后发送本消息

WM_SYSKEYDOWN

0x0104

当按住ALT键同时按下其他键时发送此消息给拥有键盘焦点的窗口

WM_SYSKEYUP

0x0105

当释放一个键同时按住ALT键时发送此消息给拥有键盘焦点的窗口

WM_SYSCHAR

0x0106

当TranslateMessage()转发WM_SYSKEYDOWN后发送此消息给拥有键盘焦点的窗口

WM_SYSDEADCHAR

0x0107

当TranslateMessage()转发WM_SYSKEYUP后发送此消息给拥有键盘焦点的窗口

WM_INITDIALOG

0x0110

在被显示前发送此消息对话框,通常用此消息初始化控件和执行其他任务

WM_COMMAND

0x0111

选择窗口菜单项或某个控件发送一条消息给它的父窗口或按下一个快捷键时产生此消息

WM_SYSCOMMAND

0x0112

选择窗口菜单项或选择最大化或最小化时,发送此消息给该窗口

WM_TIMER

0x0113

发生了定时器事件

WM_HSCROLL

0x0114

当窗口水平滚动条产生一个滚动事件时发送此消息给该窗口和滚动条的所有者

WM_VSCROLL

0x0115

当窗口垂直滚动条产生一个滚动事件时发送此消息给该窗口和滚动条的所有者

WM_INITMENU

0x0116

当一个菜单将要被激活时发送此消息,它发生在按下菜单项或按下菜单快捷键时,它允许程序在显示前更改菜单

WM_INITMENUPOPUP

0x0117

当一个下拉菜单或子菜单将要被激活时发送此消息,它允许显示前在修改菜单而不必更改整个菜单

WM_MENUSELECT

0x011F

选择一条菜单项时发送此消息给菜单的所有者(一般是窗口)

WM_MENUCHAR

0x0120

当菜单已被激活且用户按下了某个键(非快捷键),发送此消息给菜单的所有者

WM_ENTERIDLE

0x0121

当一个有模式对话框或菜单进入空闲状态时发送此消息给它的所有者,空闲状态指在处理完一条或几条先前的消息后,消息列队为空

WM_MENURBUTTONUP

0x0122

当光标位于菜单项上时,释放鼠标右键产生此消息

WM_MENUDRAG

0x0123

当拖动菜单项时,发送此消息给拖放菜单的所有者

WM_MENUGETOBJECT

0x0124

当光标移入菜单项或者从菜单项中心移到菜单项顶部或底部时,发送此消息给拖放菜单的所有者

WM_UNINITMENUPOPUP

0x0125

当下拉菜单或者子菜单被销毁时产生此消息

WM_MENUCOMMAND

0x0126

当用户选择菜单项时产生此消息

WM_CHANGEUISTATE

0x0127

应用程序发送此消息表明用户界面(UI)状态应当被改变

WM_UPDATEUISTATE

0x0128

应用程序发送此消息改变指定窗口及其子窗口的用户界面(UI)状态

WM_QUERYUISTATE

0x0129

应用程序发送此消息得到某个窗口的用户界面(UI)状态

WM_CTLCOLORMSGBOX

0x0132

绘制消息框前发送此消息给它的父窗口,通过响应这条消息,父窗口可以通过使用给定的相关显示设备的句柄来设置消息框的文本和背景颜色

WM_CTLCOLOREDIT

0x0133

绘制编辑型控件前发送此消息给它的父窗口,可用来设置编辑框的文本和背景颜色

WM_CTLCOLORLISTBOX

0x0134

绘制列表框控件前发送此消息给它的父窗口,可用来设置编辑框的文本和背景颜色

WM_CTLCOLORBTN

0x0135

绘制按钮控件前发送此消息给它的父窗口,可用来设置编辑框的文本和背景颜色

WM_CTLCOLORDLG

0x0136

绘制对话框前发送此消息给它的父窗口,可用来设置编辑框的文本和背景颜色

WM_CTLCOLORSCROLLBAR

0x0137

绘制滚动条控件前发送此消息给它的父窗口,可用来设置滚动条控件的文本和背景颜色

WM_CTLCOLORSTATIC

0x0138

绘制静态控件前发送此消息给它的父窗口,可用来设置静态控件的文本和背景颜色

WM_MOUSEMOVE

0x0200

鼠标移动

WM_LBUTTONDOWN

0x0201

按下鼠标左键

WM_LBUTTONUP

0x0202

释放鼠标左键

WM_LBUTTONDBLCLK

0x0203

双击鼠标左键

WM_RBUTTONDOWN

0x0204

按下鼠标右键

WM_RBUTTONUP

0x0205

释放鼠标右键

WM_RBUTTONDBLCLK

0x0206

双击鼠标右键

WM_MBUTTONDOWN

0x0207

按下鼠标中键

WM_MBUTTONUP

0x0208

释放鼠标中键

WM_MBUTTONDBLCLK

0x0209

双击鼠标中键

WM_MOUSEWHEEL

0x020A

当鼠标滚轮转动时发送此消息给当前获得焦点的窗口

WM_PARENTNOTIFY

0x0210

当MDI子窗口被创建或被销毁,或当光标位于子窗口上且用户按了一下鼠标键时,发送此消息给它的父窗口

WM_ENTERMENULOOP

0x0211

发送此消息通知应用程序的主窗口进程已经进入了菜单模式循环

WM_EXITMENULOOP

0x0212

发送此消息通知应用程序的主窗口进程已经退出了菜单模式循环

WM_SIZING

0x0214

调整窗口大小时发送此消息给窗口,通过此消息应用程序可以监视或修改窗口大小和位置

WM_CAPTURECHANGED

0x0215

当窗口设定为不捕获鼠标事件时,发送此消息给该窗口

WM_MOVING

0x0216

移动窗口时发送此消息给窗口,通过此消息应用程序可以监视或修改窗口大小和位置

WM_POWERBROADCAST

0x0218

发送此消息给应用程序通知它有关电源管理事件

WM_DEVICECHANGE

0x0219

当设备的硬件配置改变时发送此消息给应用程序或设备驱动程序

WM_MDICREATE

0x0220

应用程序发送此消息给多文档的客户窗口来创建一个MDI 子窗口

WM_MDIDESTROY

0x0221

应用程序发送此消息给多文档的客户窗口来关闭一个MDI 子窗口

WM_MDIACTIVATE

0x0222

应用程序发送此消息给多文档的客户窗口通知客户窗口激活另一个MDI子窗口,当客户窗口收到此消息后,它发出WM_MDIACTIVE消息给MDI子窗口(未激活)来激活它

WM_MDIRESTORE

0x0223

应用程序发送此消息给MDI客户窗口通知子窗口恢复到原来大小

WM_MDINEXT

0x0224

应用程序发送此消息给MDI客户窗口激活下一个或前一个窗口

WM_MDIMAXIMIZE

0x0225

应用程序发送此消息给MDI客户窗口以最大化一个MDI子窗口

WM_MDITILE

0x0226

应用程序发送此消息给MDI客户窗口以平铺方式重新排列所有MDI子窗口

WM_MDICASCADE

0x0227

应用程序发送此消息给MDI客户窗口以层叠方式重新排列所有MDI子窗口

WM_MDIICONARRANGE

0x0228

应用程序发送此消息给MDI客户窗口重新排列所有最小化的MDI子窗口

WM_MDIGETACTIVE

0x0229

应用程序发送此消息给MDI客户窗口以找到激活的子窗口的句柄

WM_MDISETMENU

0x0230

应用程序发送此消息给MDI客户窗口用MDI菜单代替子窗口的菜单

WM_ENTERSIZEMOVE

0x0231

当窗口进入移动或改变大小模式循环时,发送此消息给该窗口

WM_EXITSIZEMOVE

0x0232

当窗口退出移动或改变大小模式循环时,发送此消息给该窗口

WM_DROPFILES

0x0233

当用户在应用程序窗口中拖动某个文件时,产生此消息

WM_MDIREFRESHMENU

0x0234

应用程序发送此消息给MDI客户窗口以刷新窗口菜单

WM_MOUSEHOVER

0x02A1

当光标在窗口客户区悬停超过TrackMouseEvent()指定的时间时,发送此消息给该窗口

WM_MOUSELEAVE

0x02A3

当光标离开窗口客户区超过TrackMouseEvent()指定的时间时,发送此消息给该窗口

WM_CUT

0x0300

应用程序发送此消息给一个编辑框或ComboBox以删除当前选择的文本

WM_COPY

0x0301

应用程序发送此消息给一个编辑框或ComboBox以复制当前选择的文本到剪贴板

WM_PASTE 

0x0302

应用程序发送此消息给一个编辑框或ComboBox以从剪贴板中得到数据

WM_CLEAR

0x0303

应用程序发送此消息给一个编辑框或ComboBox以清除当前选择的内容

WM_UNDO

0x0304

应用程序发送此消息给一个编辑框或ComboBox以撤消最后一次操作

WM_DESTROYCLIPBOARD

0x0307

当调用EmptyClipboard()清空剪贴板时,发送此消息给剪贴板所有者

WM_DRAWCLIPBOARD

0x0308

当剪贴板的内容变化时发送此消息给剪贴板观察链中的第一个窗口,它允许用剪贴板观察窗口来显示剪贴板的新内容

WM_PAINTCLIPBOARD

0x0309

当剪贴板包含CF_OWNERDIPLAY格式的数据且剪贴板观察窗口的客户区需要重绘时,发送此消息给剪贴板所有者

WM_VSCROLLCLIPBOARD

0x030A

当剪贴板包含CF_OWNERDIPLAY格式的数据且剪贴板观察窗口发生垂直滚动条事件时,剪贴板观察窗口发送此消息给剪贴板所有者

WM_SIZECLIPBOARD

0x030B

当剪贴板包含CF_OWNERDIPLAY格式的数据且剪贴板观察窗口的客户区域的大小已经改变时,剪贴板观察窗口发送此消息给剪贴板的所有者

WM_ASKCBFORMATNAME

0x030C

剪贴板观察窗口发送此消息给剪贴板所有者以获得CF_OWNERDISPLAY剪贴板格式的名字

WM_CHANGECBCHAIN

0x030D

当一个窗口从剪贴板观察链中移去时发送此消息给剪贴板观察链中的第一个窗口

WM_HSCROLLCLIPBOARD

0x030E

当剪贴板包含CF_OWNERDIPLAY格式的数据且剪贴板观察窗口发生水平滚动条事件时,剪贴板观察窗口发送此消息给剪贴板所有者

WM_QUERYNEWPALETTE

0x030F

发送此消息给将要获得键盘焦点的窗口,此消息使窗口在获得焦点时同时有机会实现它的逻辑调色板

WM_PALETTEISCHANGING

0x0310

应用程序将要实现它的逻辑调色板时发送此消息通知所有应用程序

WM_PALETTECHANGED

0x0311

获得焦点的窗口实现它的逻辑调色板后发送此消息给所有顶级并重叠的窗口,以此

来改变系统调色板

WM_HOTKEY

0x0312

当用户按下由RegisterHotKey()注册的热键时产生此消息

WM_PRINT

0x0317

应用程序发送此消息给窗口,要求窗口在指定设备环境中绘制自己,一般情况下是打印机设备环境

WM_PRINTCLIENT

0x0318

应用程序发送此消息给窗口,要求窗口在指定设备环境中绘制窗口客户区,一般情况下是打印机设备环境

WM_APP

0x8000

帮助用户自定义消息,自定义消息可以为WM_APP X,X为正整数

WM_USER

0x0400

帮助用户自定义消息,自定义消息可以为WM_USER X,X为正整数

3.3 总结

  表A-3  通告音信-按键

1> ShellExecuteEx打开test.iqy的时先创造excel进程

消息名称

说 明

BN_CLICKED

单击按钮

BN_DISABLE

按钮被禁止

BN_DOUBLECLICKED

双击按钮

BN_HILITE

加亮按钮

BN_PAINT

按钮应当重画

BN_UNHILITE

加亮应当去掉

二> 然后创立3个"WorkerW"的窗口用于DDE通讯

表A-四  布告音讯-组合框

3> Post WM_DDE_EXECUTE给excel,告知展开test.iqy的一声令下

消息名称

说 明

CBN_CLOSEUP

组合框的列表框被关闭

CBN_DBLCLK

用户双击了一个字符串

CBN_DROPDOWN

组合框的列表框被拉下

CBN_EDITCHANGE

用户修改了组合框中的文本

CBN_EDITUPDATE

组合框内的文本即将更新

CBN_ERRSPACE

组合框内存不足

CBN_KILLFOCUS

组合框失去输入焦点

CBN_SELCHANGE

在组合框中选择了一项

CBN_SELENDCANCEL

用户的选择将被忽略

CBN_SELENDOK

用户的选择将被执行

CBN_SETFOCUS

组合框获得输入焦点

4> ShellExecuteEx实施完结,但并不destroy "WorkerW"窗口

表A-五  布告新闻-编辑框

5> excel收到WM_DDE_EXECUTE新闻后会广播WM_DDE_INITIATE音信,"WorkerW"窗口所在的console进度由于尚未定义新闻管理函数,ShellExecuteEx定义的"WorkerW"窗口新闻管理函数得不到CPU实践机会,导致不会response该新闻,从而致使excel hang住

消息名称

说 明

EN_CHANGE

编辑框中的文本己更新

EN_ERRSPACE

编辑框内存不足

EN_HSCROLL

用户点击了水平滚动条

EN_KILLFOCUS

编辑框失去输入焦点

EN_MAXTEXT

插入的内容被截断

EN_SETFOCUS

编辑框获得输入焦点

EN_UPDATE

编辑框中的文本将要更新

EN_VSCROLL

用户点击了垂直滚动条

恍如,大家可以创建多少个带窗口的主次,运维后将其挂起,那时,纵然直接双击张开test.iqy也会hang住。

表A-陆  公告音讯-列表框

 

消息名称

说 明

LBN_DBLCLK

用户双击了一项

LBN_ERRSPACE

列表框内存不足

LBN_KILLFOCUS

列表框正在失去输入焦点

LBN_SELCANCEL

用户选择被取消

LBN_SELCHANGE

用户选择将改变

LBN_SETFOCUS

列表框获得输入焦点

肆. 怎么双击张开excel不会hang住

Windows音信大全

因为双击打开实际是用explorer.exe展开,而explorer.exe是有窗口的,能够寻常的收到处理WM_DDE_INITIATE消息

  Windows是1新闻(Message)驱动式系统,Windows新闻提供了应用程序与应用程序之间、应用程序与Windows系统之间开始展览广播发表的手段。应用程序要落到实处的功力由新闻来触发,并靠对音讯的响应和拍卖来完结。Windows系统中有二种消息队列,1种是系统音信队列,另一种是应用程序音讯队列。Computer的具有输入设备由 Windows监察和控制,当八个事件产生时,Windows先将输入的消息放入系统音信队列中,然后再将输入的音讯拷贝到相应的应用程序队列中,应用程序中的新闻循环从它的新闻队列中找出每3个音讯并发送给相应的窗口函数中。一个事件的发出,达到管理它的窗口函数必须经历上述进度。值得注意的是音信的非超过性,即无论事件的急与缓,总是按达到的主次排队(一些体系新闻除却),那就使得部分表面实时事件大概得不到当下的管理。

 

  由于Windows自个儿是由新闻使得的,举3个例证来讲明这么些难题。张开记事本程序,该程序有3个File菜单,那么,在运行该应用程序的时候,假若用户单击了File菜单里New命令时,这几个动作将被Windows (而不是应用程序自己!)所擒获,Windows经过分析得知这些动作应该由地点所说的格外应用程序去管理,既然是这么,Windows就发送了个称呼WM_COMMAND的音信给应用程序,该音信所包涵消息告知应用程序:"用户单击了New菜单",应用程序得知那壹新闻之后,选拔相应的动作来响应它,这个进程称为新闻管理。Windows为每3个应用程序(确切地正是每3个线程)维护了对应的音信队列,应用程序的任务正是不停的从它的音信队列中得到音讯,分析消息和管理音信,直到一条吸收名字为WM_QUIT音讯停止,那一个进度一般是由壹种名称叫新闻循环的程序结构来得以完成的。

伍. 为啥win7上不会有这么的标题

  音信笔者是当做三个记录传递给应用程序的,那个记录中含有了消息的花色以及此外音讯。比如,对于单击鼠标所发出的音讯的话,那一个记录中包含了单击鼠标时的坐标。这么些记录类型叫做T M s g,它在Wi n d o w s单元中是如此注脚的:

5.1 在API Monitor中看下PostMessageW

type

太阳集团所有网址16877 115

TMsg = packedrecord

留意到win柒下PostMessageW是用的线程贰调用的,搜一下线程成立API CreateThread

hwnd: HWND / /窗口句柄

太阳集团所有网址16877 116

message: UINT / /消息常量标记符

可见是ShellExecuteEx内部创建的线程,所以win七上ShellExecuteEx创立了3个线程专门用来管理和excel的DDE音信通讯,那样就能不荒谬的吸收管理excel发过来的WM_DDE_INITIATE消息了

wParam: WPA 汉兰达 AM  // 33位音讯的一定附加新闻

lParam: LPA Sportage AM  // 三11位消息的特定附加新闻

time: DWO奇骏D / /音讯创设时的时辰

pt: TPoint / /音讯创设时的鼠标地点

end

 

音讯中有哪些?

是或不是以为3个新闻记录中的音信像爱沙尼亚语同样?假设是这么,那么看壹看下边包车型大巴分解:

hwnd 3一个人的窗口句柄。窗口能够是别的类型的荧屏对象,因为Win3二能够爱戴大繁多可视对象的句柄(窗口、对话框、按键、编辑框等)。

message 用于区分其余消息的常量值,这个常量能够是Windows单元中预订义的常量,也能够是自定义的常量。

wParam 平日是二个与音信有关的常量值,也或然是窗口或控件的句柄。

lParam 平日是多少个对准内部存款和储蓄器中数据的指针。由于WParm、lParam和Pointer都以三拾壹人的,因而,它们中间可以并行调换。

 

WM_NULL = 0

WM_CREATE = 1

应用程序创制1个窗口

WM_DESTROY = 2

3个窗口被销毁

WM_MOVE = 3

移动2个窗口

WM_SIZE = 5

改造七个窗口的深浅

WM_ACTIVATE = 6

3个窗口被激活或失去激活状态;

WM_SETFOCUS = 7

获得宗旨后

WM_KILLFOCUS = 8

错开核心

WM_ENABLE = 10

改变enable状态

WM_SETREDRAW = 11

设置窗口是还是不是能重画

WM_SETTEXT = 12

应用程序发送此音讯来安装一个窗口的文件

WM_GETTEXT = 13

应用程序发送此音信来复制对应窗口的公文到缓冲区

WM_GETTEXTLENGTH =14

收获与2个窗口有关的文书的长度(不含有空字符)

WM_PAINT = 15

务求多个窗口重画本身

WM_CLOSE = 16

当三个窗口或应用程序要关门时发送二个实信号

WM_QUERYENDSESSION= 17

当用户选用甘休对话框或程序本人调用ExitWindows函数

WM_QUIT = 18

用来了却程序运营或当程序调用postquitmessage函数

WM_QUERYOPEN = 19

当用户窗口复苏原先的大大小小地点时,把此音讯发送给有些Logo

WM_ERASEBKGND = 20

当窗口背景必须被擦除时(例在窗口改造大小时)

WM_SYSCOLORCHANGE =21

当系统颜色改造时,发送此新闻给持有顶尖窗口

WM_ENDSESSION = 22

当系统经过产生WM_QUE本田UR-VYENDSESSION音信后,此音信发送给应用程序,

文告它对话是还是不是甘休

WM_SYSTEMERROR = 23

WM_SHOWWINDOW = 24

当隐藏或出示窗口是发送此消息给那么些窗口

WM_ACTIVATEAPP = 28

发此音信给应用程序哪个窗口是激活的,哪个是非激活的;

WM_FONTCHANGE = 29

当系统的字体资源库变化时发送此音讯给持有一流窗口

WM_TIMECHANGE = 30

当系统的时日转移时发送此音讯给具备一级窗口

WM_CANCELMODE = 31

发送此消息来裁撤某种正在拓展的摸态(操作)

WM_SETCURSOR = 32

如若鼠标引起光标在有些窗口中活动且鼠标输入未有被抓走时,就发音信给有个别窗口

WM_MOUSEACTIVATE =33

当光标在有个别非激活的窗口中而用户正按着鼠标的某些键发送此音信给当下窗口

WM_CHILDACTIVATE =34

发送此音讯给MDI子窗口当用户点击此窗口的标题栏,或当窗口被激活,移动,退换大小

WM_QUEUESYNC = 35

此音讯由基于Computer的教练程序发送,通过WH_JOURNALPALYBACK的hook程序

告别出用户输入消息

WM_GETMINMAXINFO =36

此音信发送给窗口当它就要改造大小或地点;

WM_PAINTICON = 38

发送给最小化窗口当它图标将要被重画

WM_ICONERASEBKGND =39

此音讯发送给某些最小化窗口,仅当它在画Logo前它的背景必须被重画

WM_NEXTDLGCTL = 40

发送此新闻给贰个对话框程序去改造主旨地方

WM_SPOOLERSTATUS =42

每当打字与印刷处理列队扩大或减少一条作业时爆发此新闻

WM_DRAWITEM = 43

当button,combobox,listbox,menu的可视外观改动时发送

此音讯给这一个空件的持有者

WM_MEASUREITEM = 44

当button, combo box, list box, list view control, or menu item 被创设时

出殡此消息给控件的全部者

WM_DELETEITEM = 45

当the list box 或 combo box 被销毁 或 当 某个项被去除通过LB_DELETESTRING,LB_RESETCONTENT, CB_DELETESTRING, or CB_RESETCONTENT 消息

WM_VKEYTOITEM = 46

此消息有贰个LBS_WANTKEYBOATiguanDINPUT风格的发出给它的持有者来响应WM_KEYDOWN消息

WM_CHARTOITEM = 47

此音信由一个LBS_WANTKEYBOACR-VDINPUT风格的列表框发送给她的主人来响应WM_CHAR消息

WM_SETFONT = 48

当绘制文本时先后发送此音信获得控件要用的颜色

WM_GETFONT = 49

应用程序发送此信息得到当前控件绘制文本的字体

WM_SETHOTKEY = 50

应用程序发送此音讯让3个窗口与3个热键相关连

WM_GETHOTKEY = 51

应用程序发送此音讯来判别热键与有些窗口是还是不是有关联

WM_QUERYDRAGICON =55

此音讯发送给最小化窗口,当此窗口将在被拖放而它的类中平昔不概念Logo,应用程序能

回来一个Logo或光标的句柄,当用户拖放Logo时系统来得那几个Logo或光标

WM_COMPAREITEM = 57

发送此消息来决断combobox或listbox新添的项的绝对地方

WM_GETOBJECT = 61

WM_COMPACTING = 65

体现内部存款和储蓄器已经很少了

WM_WINDOWPOSCHANGING= 70

发送此新闻给那么些窗口的分寸和职位就要被改成时,来调用setwindowpos函数或别的窗口管理函数

WM_WINDOWPOSCHANGED= 71

发送此消息给那多少个窗口的高低和职位已经被改成时,来调用setwindowpos函数或其它窗口管理函数

WM_POWER = 72(适用于16位的windows)

当系统就要进入暂停状态时发送此音信

WM_COPYDATA = 74

当叁个应用程序传递数据给另三个应用程序时发送此新闻

WM_CANCELJOURNAL =75

当有些用户撤消程序日志激活状态,提交此音信给程序

WM_NOTIFY = 78

当有些控件的某部事件早已发出或以此控件必要获得部分音信时,发送此新闻给它的父窗口

WM_INPUTLANGCHANGEREQUEST= 80

当用户选择某种输入语言,或输入语言的热键改动

WM_INPUTLANGCHANGE= 81

当平台现场已经被转移后发送此消息给受影响的最一流窗口

WM_TCARD = 82

当程序已经起首化windows补助例程时发送此音信给应用程序

WM_HELP = 83

此信息展现用户按下了F1,若是有个别菜单是激活的,就发送此新闻个此窗口关联的美食做法,不然就

发送给有火热的窗口,即使当前都未有标准,就把此音讯发送给当前激活的窗口

WM_USERCHANGED = 84

当用户已经登六或剥离后发送此音信给具有的窗口,当用户登6或退出时系统创新用户的具体

设置消息,在用户更新设置时系统当下发送此音信;

WM_NOTIFYFORMAT =85

公用控件,自定义控件和她俩的父窗口通过此消息来决断控件是使用ANSI依然UNICODE结构

在WM_NOTIFY音讯,使用此控件能使有些控件与它的父控件之间举办交互通讯

WM_CONTEXTMENU =123

当用户某些窗口中点击了弹指间右键就发送此音讯给这一个窗口

WM_STYLECHANGING =124

当调用SETWINDOWLONG函数将在改变一个或多少个窗口的品格时发送此音讯给这几个窗口

WM_STYLECHANGED =125

当调用SETWINDOWLONG函数多个或五个 窗口的风骨后发送此音讯给那几个窗口

WM_DISPLAYCHANGE =126

当显示器的分辨率改动后发送此消息给具备的窗口

WM_GETICON = 127

此新闻发送给某些窗口来回到与有些窗口有关连的大Logo或小Logo的句柄;

WM_SETICON = 128

先后发送此音讯让3个新的大图标或小图标与某些窗口关联;

WM_NCCREATE = 129

当某些窗口第二遍被成立时,此消息在WM_CREATE消息发送前发送;

WM_NCDESTROY = 130

此消息布告有些窗口,非客户区正在销毁

WM_NCCALCSIZE = 131

当某些窗口的客户区域必须被核查时发送此新闻

WM_NCHITTEST =132//移动鼠标,按住或释放鼠标时发生

WM_NCPAINT = 133

次第发送此新闻给某些窗口当它(窗口)的框架必须被绘制时;

WM_NCACTIVATE = 134

此音信发送给有些窗口仅当它的非客户区须要被改造来展现是激活依然非激活状态;

WM_GETDLGCODE = 135

出殡此音讯给有些与对话框程序关联的控件,widdows调控方位键和TAB键使输入进去此控件

通过响应WM_GETDLGCODE新闻,应用程序能够把她当成四个非常的输入控件并能管理它

WM_NCMOUSEMOVE =160

当光标在3个窗口的非客户区内运动时发送此音信给这么些窗口 //非客户区为:窗体的标题栏及窗

的边框体

WM_NCLBUTTONDOWN =161

当光标在一个窗口的非客户区同时按下鼠标左键时提交此音信

WM_NCLBUTTONUP =162

当用户自由鼠标左键同时光标有些窗口在非客户区十发送此音信;

WM_NCLBUTTONDBLCLK= 163

当用户双击鼠标左键同时光标有个别窗口在非客户区10发送此新闻

WM_NCRBUTTONDOWN =164

当用户按下鼠标右键同时光标又在窗口的非客户区时发送此消息

WM_NCRBUTTONUP =165

当用户自由鼠标右键同时光标又在窗口的非客户区时发送此信息

WM_NCRBUTTONDBLCLK= 166

当用户双击鼠标右键同时光标某些窗口在非客户区10发送此音讯

WM_NCMBUTTONDOWN =167

当用户按下鼠标中键同时光标又在窗口的非客户区时发送此消息

WM_NCMBUTTONUP =168

当用户自由鼠标中键同时光标又在窗口的非客户区时发送此音讯

WM_NCMBUTTONDBLCLK= 169

当用户双击鼠标中键同时光标又在窗口的非客户区时发送此音讯

WM_KEYFIRST = 256

WM_KEYDOWN = 256

//按下3个键

WM_KEYUP = 257

//释放3个键

WM_CHAR = 258

//按下某键,并已发生WM_KEYDOWN, WM_KEYUP消息

WM_DEADCHAR = 259

当用translatemessage函数翻译WM_KEYUP新闻时发送此音讯给持有核心的窗口

WM_SYSKEYDOWN = 260

当用户按住ALT键同时按下任何键时提交此音讯给持有主旨的窗口;

WM_SYSKEYUP = 261

当用户自由一个键同时ALT 键还按着时提交此音信给具备大旨的窗口

WM_SYSCHAR = 262

当WM_SYSKEYDOWN音讯被TRANSLATEMESSAGE函数翻译后交由此消息给具有宗旨的窗口

WM_SYSDEADCHAR =263

当WM_SYSKEYDOWN音讯被TRANSLATEMESSAGE函数翻译后发送此新闻给全部大旨的窗口

WM_KEYLAST = 264

WM_INITDIALOG = 272

在1个会话框程序被展现前发送此消息给它,常常用此信息初阶化控件和实行别的义务

WM_COMMAND = 273

当用户选择一条菜单命令项或当有些控件发送一条音讯给它的父窗口,三个赶快键被翻译

WM_SYSCOMMAND = 274

当用户挑选窗口菜单的一条命令或当用户采取最大化或十分的小化时那些窗口会接受此音信

WM_TIMETiggo = 275 //发生了反应计时器事件

WM_HSCROLL = 276

当叁个窗口规范水平滚动条产生三个滚动事件时发送此音信给这个窗口,也发送给具有它的控件

WM_VSCROLL = 277

当三个窗口标准垂直滚动条发生三个轮转事件时发送此消息给那1个窗口也,发送给具备它的控件 WM_INITMENU = 278

当四个美食做法将在被激活时发送此新闻,它发出在用户菜单条中的某项或按下有个别菜单键,它同意

先后在呈现前改变菜单

WM_INITMENUPOPUP =279

当一个下拉菜单或子菜单将在被激活时发送此讯息,它同意程序在它展现前改造菜单,而不用

改变整个

WM_MENUSELECT = 287

当用户采用一条菜单项时发送此消息给菜单的全部者(一般是窗口)

WM_MENUCHAR = 288

当菜单已被激活用户按下了有个别键(不一致于加快键),发送此新闻给菜单的持有者;

WM_ENTERIDLE = 289

当3个模态对话框或菜单进入空载状态时发送此消息给它的持有者,3个模态对话框或菜单进入空载状态便是在管理完一条或几条先前的消息后未有新闻它的列队中等候

WM_MENURBUTTONUP =290

WM_MENUDRAG = 291

WM_MENUGETOBJECT =292

WM_UNINITMENUPOPUP= 293

WM_MENUCOMMAND =294

WM_CHANGEUISTATE =295

WM_UPDATEUISTATE =296

WM_QUERYUISTATE =297

WM_CTLCOLORMSGBOX =306

在windows绘制音讯框前发送此音讯给音讯框的持有者窗口,通过响应那条消息,全部者窗口可以

通过运用给定的相关显示设备的句柄来设置新闻框的文书和背景颜色

WM_CTLCOLOREDIT =307

当三个编辑型控件将要被绘制时发送此音信给它的父窗口;通过响应那条消息,全体者窗口可以

经过行使给定的连锁呈现设备的句柄来安装编辑框的文本和背景颜色

WM_CTLCOLORLISTBOX= 308

当一个列表框控件即将被绘制前发送此消息给它的父窗口;通过响应那条消息,全数者窗口能够

经过动用给定的连带展现设备的句柄来设置列表框的公文和背景颜色

WM_CTLCOLORBTN =309

当3个按键控件将在被绘制时发送此消息给它的父窗口;通过响应那条音信,全体者窗口能够

透过动用给定的有关展现设备的句柄来设置按纽的文件和背景颜色

WM_CTLCOLORDLG =310

当3个对话框控件将在被绘制前发送此音信给它的父窗口;通过响应那条新闻,全部者窗口可以

由此采纳给定的相关显示设备的句柄来安装对话框的文件背景颜色

WM_CTLCOLORSCROLLBAR=311

当三个滚动条控件就要被绘制时发送此音讯给它的父窗口;通过响应那条新闻,全部者窗口能够

由此使用给定的连锁显示设备的句柄来设置滚动条的背景颜色

WM_CTLCOLORSTATIC =312

当二个静态控件将要被绘制时发送此音讯给它的父窗口;通过响应那条音信,全部者窗口能够

通过使用给定的有关显示设备的句柄来设置静态控件的文书和背景颜色

WM_MOUSEFIRST = 512

WM_MOUSEMOVE = 512

// 移动鼠标

WM_LBUTTONDOWN =513

//按下鼠标左键

WM_LBUTTONUP = 514

//释放鼠标左键

WM_LBUTTONDBLCLK =515

//双击鼠标左键

WM_RBUTTONDOWN =516

//按下鼠标右键

WM_RBUTTONUP = 517

//释放鼠标右键

WM_RBUTTONDBLCLK =518

//双击鼠标右键

WM_MBUTTONDOWN =519

//按下鼠标中键

WM_MBUTTONUP = 520

//释放鼠标中键

WM_MBUTTONDBLCLK =521

//双击鼠标中键

WM_MOUSEWHEEL = 522

当鼠标轮子转动时发送此音信个当前有标准的控件

WM_MOUSELAST = 522

WM_PARENTNOTIFY =528

当MDI子窗口被创制或被灭绝,或用户按了一下鼠标键而光标在子窗口上时发送此音信给它的父窗口

WM_ENTERMENULOOP =529

出殡此音讯布告应用程序的主窗口that已经进入了菜单循环形式

WM_EXITMENULOOP =530

发送此信息通告应用程序的主窗口that已脱离了菜单循环方式

WM_NEXTMENU = 531

WM_SIZING = 532

当用户正在调治窗口大时辰发先生送此消息给窗口;通过此音讯应用程序能够监视窗口大小和地点

也得以修改他们

WM_CAPTURECHANGED =533

发送此消息给窗口当它失去捕获的鼠标时;

WM_MOVING = 534

当用户在运动窗口时发送此音讯,通过此音讯应用程序能够监视窗口大小和岗位

也得以修改他们;

WM_POWERBROADCAST =536

此音信发送给应用程序来打招呼它有关电源处管事人件;

WM_DEVICECHANGE =537

当设备的硬件配置退换时发送此消息给应用程序或设施驱动程序

WM_IME_STARTCOMPOSITION= 269

WM_IME_ENDCOMPOSITION= 270

WM_IME_COMPOSITION= 271

WM_IME_KEYLAST =271

WM_IME_SETCONTEXT =641

WM_IME_NOTIFY = 642

WM_IME_CONTROL =643

WM_IME_COMPOSITIONFULL= 644

WM_IME_SELECT = 645

WM_IME_CHAR = 646

WM_IME_REQUEST =648

WM_IME_KEYDOWN =656

WM_IME_KEYUP = 657

WM_MDICREATE = 544

应用程序发送此新闻给多文书档案的客户窗口来创建八个MDI 子窗口

WM_MDIDESTROY = 545

应用程序发送此音讯给多文书档案的客户窗口来关闭一个MDI 子窗口

WM_MDIACTIVATE =546

应用程序发送此新闻给多文档的客户窗口文告客户窗口激活另一个MDI子窗口,当客户窗口收到

此消息后,它发生WM_MDIACTIVE消息给MDI子窗口(未激活)激活它;

WM_MDIRESTORE = 547

先后发送此音信给MDI客户窗口让子窗口从最大最小化苏醒到原来大小

WM_MDINEXT = 548

次第发送此音讯给MDI客户窗口激活下多少个或前三个窗口

WM_MDIMAXIMIZE =549

程序发送此消息给MDI客户窗口来最大化三个MDI子窗口;

WM_MDITILE = 550

程序发送此新闻给MDI客户窗口以平铺格局重新排列全数MDI子窗口

WM_MDICASCADE = 551

先后发送此新闻给MDI客户窗口以层叠形式重新排列全数MDI子窗口

WM_MDIICONARRANGE =552

先后发送此音讯给MDI客户窗口重新排列全体最小化的MDI子窗口

WM_MDIGETACTIVE =553

先后发送此消息给MDI客户窗口来找到激活的子窗口的句柄

WM_MDISETMENU = 560

次第发送此新闻给MDI客户窗口用MDI菜单替代子窗口的美食做法

WM_ENTERSIZEMOVE =561

WM_EXITSIZEMOVE =562

WM_DROPFILES = 563

WM_MDIREFRESHMENU =564

WM_MOUSEHOVER = 673

WM_MOUSELEAVE = 675

WM_CUT = 768

次第发送此音信给1个编辑框或combobox来删除当前甄选的文件

WM_COPY = 769

程序发送此新闻给贰个编辑框或combobox来复制当前挑选的公文到剪贴板

WM_PASTE = 770

先后发送此音讯给editcontrol或combobox从剪贴板中赢得数码

WM_CLEAR = 771

先后发送此音信给editcontrol或combobox清除当前选用的内容;

WM_UNDO = 772

先后发送此音信给editcontrol或combobox撤除最终三次操作

WM_RENDERFORMAT =773

WM_DESTROYCLIPBOARD= 775

当调用ENPTYCLIPBOA冠道D函数时 发送此音信给剪贴板的主人

WM_DRAWCLIPBOARD =776

当剪贴板的内容更改时发送此音讯给剪贴板观望链的率先个窗口;它同意用剪贴板旁观窗口来

来得剪贴板的新剧情;

WM_PAINTCLIPBOARD =777

当剪贴板包括CF_OWNE景逸SUVDIPLAY格式的数码同时剪贴板观察窗口的客户区供给重画;

WM_VSCROLLCLIPBOARD= 778

WM_SIZECLIPBOARD =779

当剪贴板包涵CF_OWNELX570DIPLAY格式的数量同时剪贴板观看窗口的客户区域的大小已经转移是此新闻通过剪贴板观望窗口发送给剪贴板的全部者;

WM_ASKCBFORMATNAME= 780

经过剪贴板观看窗口发送此音讯给剪贴板的全体者来呼吁叁个CF_OWNE兰德XC90DISPLAY格式的剪贴板的名字

WM_CHANGECBCHAIN =781

当三个窗口从剪贴板观看链中移去时发送此音信给剪贴板观察链的第一个窗口;

WM_HSCROLLCLIPBOARD= 782

此音信通过一个剪贴板观看窗口发送给剪贴板的主人;它发生在当剪贴板包罗CFOWNE中华VDISPALY格式的多少同时有个事件在剪贴板阅览窗的档期的顺序滚动条上;全数者应滚动剪贴板图象并更新滚动条的值;

WM_QUERYNEWPALETTE= 783

此音讯发送给就要收到大旨的窗口,此音讯能使窗口在吸收核心时同时有机会达成他的逻辑调色板

WM_PALETTEISCHANGING=784

当贰个应用程序正要落到实处它的逻辑调色板时发此音讯文告全体的应用程序

WM_PALETTECHANGED =785

此信息在3个负有主旨的窗口完结它的逻辑调色板后发送此音信给持有超级并交汇的窗口,以此

来改动系统调色板

WM_HOTKEY = 786

当用户按下由REGISTE牧马人HOTKEY函数注册的热键时提交此新闻

WM_PRINT = 791

应用程序发送此新闻仅当WINDOWS或任何应用程序发出三个请求供给绘制2个应用程序的壹局地;

WM_PRINTCLIENT =792

WM_HANDHELDFIRST =856

WM_HANDHELDLAST =863

WM_PENWINFIRST =896

WM_PENWINLAST = 911

WM_COALESCE_FIRST =912

WM_COALESCE_LAST =927

WM_DDE_FIRST = 992

WM_DDE_INITIATE =WM_DDE_FIRST 0

贰个DDE客户程序提交此音信起先五个与服务器程序的对话来响应这一个钦定的主次和大旨名;

WM_DDE_TERMINATE =WM_DDE_FIRST 1

二个DDE应用程序(无论是客户依旧服务器)提交此新闻来终止八个对话;

WM_DDE_ADVISE =WM_DDE_FIRST 2

2个DDE客户程序提交此音信给一个DDE服务程序来呼吁服务器每当数据项改成时更新它

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客户程序来传递个1数目项给客户或文告客户的一条可用数据项

WM_DDE_REQUEST =WM_DDE_FIRST 6

1个DDE客户程序提交此消息给1个DDE服务程序来呼吁2个数量项的值;

WM_DDE_POKE =WM_DDE_FIRST 7

二个DDE客户程序提交此音信给2个DDE服务程序,客户利用此音信来呼吁服务器收到2个未经同意的数码项;服务器通过答复WM_DDE_ACK新闻提示是或不是它接受那几个数据项;

WM_DDE_EXECUTE =WM_DDE_FIRST 8

3个DDE客户程序提交此音讯给两个DDE服务程序来发送三个字符串给服务器让它象串行命令同样被拍卖,服务器通过提交WM_DDE_ACK消息来作回应;

WM_DDE_LAST =WM_DDE_FIRST 8

WM_APP = 32768

WM_USER = 1024

此信息能协助应用程序自定义私有消息;

/////////////////////////////////////////////////////////////////////

文告音讯(Notification message)是指那样一种新闻,一个窗口内的子控件爆发了有的专门的学业,供给通

知父窗口。布告新闻只适用刘震云式的窗口控件如开关、列表框、组合框、编辑框,以及Windows 玖伍公

共控件如树状视图、列表视图等。举个例子,单击或双击多个控件、在控件中精选一些文件、操作控件的

滚动条都会时有发生通告新闻。

按扭

B N _ C L I C K E D//用户单击了开关

B N _ D I S A B L E//开关被明确命令禁止

B N _ D O U B L E CL I C K E D //用户双击了按键

B N _ H I L I T E//用户加亮了开关

B N _ PA I N T开关应当重画

B N _ U N H I L I TE加亮应当去掉

组合框

C B N _ C L O S E UP组合框的列表框被关门

C B N _ D B L C L K用户双击了三个字符串

C B N _ D 牧马人 O P D OW N组合框的列表框被拉出

C B N _ E D I T C HA N G E用户修改了编辑框中的文本

C B N _ E D I T U PD AT E编辑框内的文本就要履新

C B N _ E 帕杰罗 逍客 S PAC E组合框内部存储器不足

C B N _ K I L L F OC U S组合框失去输入大旨

C B N _ S E L C H AN G E在组合框中挑选了一项

C B N _ S E L E N DC A N C E L用户的挑选相应被撤回

C B N _ S E L E N DO K用户的抉择是合法的

C B N _ S E T F O CU S组合框得到输入主旨

编辑框

E N _ C H A N G E编辑框中的文本己更新

E N _ E 宝马X5 Qashqai S PA CE编辑框内部存款和储蓄器不足

E N _ H S C 奥迪Q3 O L L用户点击了水平滚动条

E N _ K I L L F O CU S编辑框正在失去输入主旨

E N _ M A X T E X T插入的剧情被截断

E N _ S E T F O C US编辑框获得输入主题

E N _ U P D AT E编辑框中的文本将在更新

E N _ V S C 冠道 O L L用户点击了僵直滚动条音信含义

列表框

L B N _ D B L C L K用户双击了1项

L B N _ E 奥迪Q3 CRUISER S PAC E列表框内部存款和储蓄器不够

L B N _ K I L L F OC U S列表框正在失去输入主旨

L B N _ S E L C A NC E L选用被注销

L B N _ S E L C H AN G E选拔了另一项

L B N _ S E T F O CU S列表框得到输入核心

 

转载:

本文由太阳集团所有网址16877发布于www.16877.com,转载请注明出处:Windows消息机制太阳集团所有网址16877

您可能还会对下面的文章感兴趣: