>

Windows消息机制要点,Windows音信机制

- 编辑:www.bifa688.com -

Windows消息机制要点,Windows音信机制

1. 问题

1. 窗口进程 
各种窗口会有二个称作窗口进程的回调函数(WndProc卡塔尔国,它蕴涵四个参数,分别为:窗口句柄(Window Handle卡塔尔国,音讯ID(Message ID卡塔尔国,和七个音讯参数(wParam, lParam卡塔尔国,当窗口收到音信时系统就可以调用此窗口进度来拍卖音信。(所以叫回调函数)

音信是指什么?
     消息系统对此四个win32前后相继来讲非常至关首要,它是三个程序运转的动力源泉。贰个音信,是系统定义的八个叁16位的值,他唯后生可畏的概念了叁个事变,向 Windows发出一个通知,告诉应用程序有些事情时有爆发了。举例,单击鼠标、退换窗口尺寸、按下键盘上的二个键都会使Windows发送四个信息给应用程序。
    音讯小编是用作三个记下传递给应用程序的,这一个记录中隐含了音讯的品种甚至其它音讯。举个例子,对于单击鼠标所发出的新闻以来,这么些记录中包涵了单击鼠标时的坐标。那几个记录类型叫做MSG,MSG含有来自windows应用程序信息队列的音信消息,它在Windows中扬言如下:

当在console中调用API ShellExecuteEx展开"test.iqy"文件时,开掘excel会hang住,console退出后excel才会响应,但直接双击"test.iqy"是不曾难点的,风趣的是以此场地唯有在xp产生,在win7上尚未那几个标题。

2 音信类型 
1卡塔尔 系统定义音讯(System-Defined Messages卡塔尔(قطر‎
 
在SDK中刚开始阶段定义好的音信,非顾客定义的,其范围在[0x0000, 0x03ff]以内, 能够分成以下三类:
1>窗口音信(Windows Message卡塔尔国 
与窗口的内部运维有关,如创立窗口,绘制窗口,销毁窗口等。能够是近似的窗口,也能够是Dialog,控件等。
如:WM_CREATE, WM_PAINT, WM_MOUSEMOVE, WM_CTLCOLOR, WM_HSCROLL...
2>命令新闻(Command Message卡塔尔(英语:State of Qatar):注意那类音讯通称为WM_COMMAND
与拍卖顾客央浼有关, 如单击菜单项或工具栏或控件时, 就能发出命令新闻。
WM_COMMAND, LOWOEvoqueD(wParam卡塔尔表示菜单项,工具栏按钮或控件的ID。要是是控件, HIWO奥迪Q5D(wParam卡塔尔(قطر‎表示控件消息类型
3> 控件布告(Notify Message卡塔尔(قطر‎ 
控件公告音讯, 那是最灵敏的音讯格式, 其Message, wParam, lParam分别为:WM_NOTIFY, 控件ID,指向NMHD奥迪Q7的指针。NMHDRubicon包罗控件公告的源委, 能够轻松扩充。
2卡塔尔国 程序定义音信(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

图片 1typedef struct tagMsg
图片 2{
图片 3       HWND    hwnd;       //选用该音信的窗口句柄
图片 4       UINT    message;    //新闻常量标记符,也正是大家不认为奇所说的音频域信号
图片 5       WPARAM  wParam;     //三十二位音讯的一定附加消息,确切含义重视于新闻值
图片 6       LPARAM  lParam;     //叁十几个人音讯的特定附加新闻,确切含义信任于音讯值
图片 7       DWO福睿斯D   time;       //音讯创立时的小时
图片 8       POINT   pt;         //消息成立时的鼠标/光标在荧屏坐标系中的地点
图片 9}MSG;
图片 10

 

3 音讯队列(Message Queues卡塔尔 
Windows中有两连串型的音信队列
1卡塔尔 系统消息队列(System Message Queue卡塔尔(英语:State of Qatar) 这是一个类别唯风流倜傥的Queue,设备驱动(mouse, keyboard卡塔尔会把操作输入转形成音信存在系统队列中,然后系统会把此音讯放到目的窗口所在的线程的音信队列(thread-specific message queue卡塔尔国中等候处理
2卡塔尔 线程音信队列(Thread-specific Message Queue卡塔尔 每一个GUI线程都会维护这么二个线程音讯队列。(这些行列独有在线程调用GDI函数时才会创制,暗中认可不成立卡塔尔国。然后线程音讯队列中的音信会被送到对应的窗口进程(WndProc卡塔尔国处理.
留意: 线程音信队列中WM_PAINT,WM_TIME奥德赛只有在Queue中从不别的音讯的时候才会被拍卖,WM_PAINT新闻还有恐怕会被统一以进步作用。别的具有音讯以先进先出(FIFO)的方法被管理。

    新闻能够由系统恐怕应用程序发生。系统在产生输入事件时发生音信。譬如, 当顾客敲键, 移动鼠标只怕单击控件。系统也发生音信以响应由应用程序带来的变化, 比方应用程序更动系统字体制校订变窗体大小。应用程序能够发生音信使窗体施行任务,只怕与其余应用程序中的窗口通信。

2. 重现步骤

4 队列消息(Queued Messages卡塔尔国和非队列音信(Non-Queued Messages卡塔尔国
1卡塔尔国队列音信(Queued Messages卡塔尔(قطر‎
 
新闻会先保存在音信队列中,音讯循环会从此队列中取音讯并散发到各窗口管理
如鼠标,键盘音信。
2卡塔尔(英语:State of Qatar) 非队列音讯(NonQueued Messages卡塔尔 新闻会绕过系统音信队列和线程新闻队列直接发送到窗口进度被拍卖
如: WM_ACTIVATE, WM_SETFOCUS, WM_SETCURSOR, WM_WINDOWPOSCHANGED 
在乎: postMessage发送的音讯是队列音信,它会把消息Post到音信队列中; SendMessage发送的消息是非队列信息, 被直接送到窗口进度管理

音信中有如何?
   大家提交了上边包车型大巴注释,是还是不是会对新闻构造有了一个相比清楚的认知?借使还尚无,那么大家再试着提交下边包车型客车表明:
     hwnd 三拾壹人的窗口句柄。窗口能够是任何项指标显示屏对象,因为Win32能力所能达到保证大多数可视对象的句柄(窗口、对话框、按键、编辑框等卡塔尔(英语:State of Qatar)。
     message用于区分其余新闻的常量值,这一个常量能够是Windows单元中预定义的常量,也得以是自定义的常量。音讯标记符以常量命名的点子提议音讯的含义。当窗口进度选取到音信随后,他就能够接纳音信标志符来决定如哪管理音信。比方、WM_PAINT告诉窗口进度窗体客商区被改成了亟待重绘。符号常量钦赐系统音信归于的品类,其前缀指明了拍卖解释音讯的窗体的门类。
     wParam 经常是七个与信息有关的常量值,也说不许是窗口或控件的句柄。
     lParam 经常是四个针对内部存款和储蓄器中多少的指针。由于WParam、lParam和Pointer都是31位的,由此,它们之间能够互相转变。

再次出现情形:XP sp3 / Office 二〇〇六(别的office版本应该也得以,未有测验)

5 PostMessage(PostThreadMessage), SendMessage 
PostMessage:把音信放到钦赐窗口所在的线程音讯队列中后马上回到。 PostThreadMessage:把音信放到钦命线程的音信队列中后随时回去。
SendMessage:直接把音信送到窗口进度管理,管理完了才回来。

新闻标志符的值
     系统保留音讯标记符的值在0x0000在0x03ff(WM_USESportage-1卡塔尔(英语:State of Qatar)范围。那么些值被系统定义务消防队息使用。应用程序不能够运用这几个值给和谐的新闻。应用程序新闻从WM_USER(0X0400)到0X7FFF,或0XC000到0XFFFF;WM_USE奥迪Q7到 0X7FFF范围的音讯由应用程序本身使用;0XC000到0XFFFF范围的音讯用来和此外应用程序通讯,我们顺便说一下存有标志性的新闻值:
     WM_NULL---0x0000    空消息。
     0x0001----0x0087    首假诺窗口新闻。
     0x00A0----0x00A9    非客商区新闻 
     0x0100----0x0108    键盘消息
     0x0111----0x0126    菜单新闻
     0x0132----0x0138    颜色调整音讯
     0x0200----0x020A    鼠标音讯
     0x0211----0x0213    菜单循环音讯
     0x0220----0x0230    多文书档案音讯
     0x03E0----0x03E8    DDE消息
     0x0400              WM_USER
     0x8000              WM_APP
     0x0400----0x7FFF    应用程序自定义私有音信

6 GetMessage, PeekMessage 
PeekMessage会马上赶回能够保存音讯
GetMessage在有新闻时回来会去除音讯

消息有哪两种?
   其实,windows中的新闻即使非常多,但是项目并不散乱,概略上有3种:窗口音信、命令新闻和控件通告音信。
     窗口新闻大约是系统中最为平淡无奇的新闻,它是指由操作系统和决定其他窗口的窗口所利用的新闻。比如CreateWindow、DestroyWindow和MoveWindow等都会鼓劲窗口音信,还会有我们在上面聊起的单击鼠标所爆发的新闻也是生龙活虎种窗口消息。
     命令信息,那是风流浪漫种新鲜的窗口语资源音信息,他用来管理从二个窗口发送到另叁个窗口的客户央求,比方按下叁个按键,他就能向主窗口发送八个发令新闻。
     控件布告新闻,是指那样生机勃勃种音讯,多个窗口内的子控件爆发了部分作业,须求通告父窗口。通知音信只适用王宛平规的窗口控件如开关、列表框、组合框、编辑框,以致Windows公共控件如树状视图、列表视图等。举例,单击或双击三个控件、在控件中接收部分文件、操作控件的滚动条都会发生布告音讯。她就疑似于命令新闻,当客商与控件窗口交互作用时,那么控件文告音讯就能从控件窗口发送到它的主窗口。不过这种新闻的存在并非为了处理客商命令,而是为了让主窗口能够退换控件,比如加载、展现数据。比如按下一个开关,他向父窗口发送的音信也足以作为是一个控件公告音信;单击鼠标所爆发的音讯能够由主窗口平昔管理,然后交给控件窗口处理。
    此中窗口语资源音信息及控件通告新闻根本由窗口类即直接或直接由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卡塔尔(英语:State of Qatar),并放置当前线程的新闻队列中,信息循环下三遍抽出处理。
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科雷傲CRUISERSPACE 组合框内部存款和储蓄器不足
 CBN_KILLFOCUS 组合框失去输入宗旨
 CBN_SELCHANGE 在组合框中选用了生机勃勃项
 CBN_SELENDCANCEL 顾客的选项相应被收回
 CBN_SELENDOK 客户的精选是法定的
 CBN_SETFOCUS 组合框拿到输入大旨

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

8(音讯死锁( Message Deadlocks卡塔尔国 
只要有线程A和B, 以后有以下下步骤
1卡塔尔(英语:State of Qatar) 线程A SendMessage给线程B, A等待新闻在线程B中管理后再次来到
2卡塔尔国 线程B收到了线程A发来的消息,并打开始拍戏卖, 在管理进度中,B也向线程A SendMessgae,然后等待从A重临。
因为那个时候, 线程A正等待从线程B重返, 不只怕管理B发来的音讯, 进而招致了/线程A,B互相等待, 形成死锁。多个线程也能够产生环形死锁。
能够动用 SendNotifyMessage或SendMessageTimeout来防止现身死锁。

编辑框控件
 EN_CHANGE 编辑框中的文本己更新
 EN_E讴歌RDX本田UR-VSPACE 编辑框内部存款和储蓄器不足
 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卡塔尔(英语:State of Qatar), 系统级设备驱动(system-level device drivers卡塔尔(قطر‎等, 
布罗兹castSystemMessage这几个API能够对以上系统组件发送消息。

列表框控件
 LBN_DBLCLK 客商双击了黄金时代项
 LBN_E奥迪Q7陆风X8SPACE 列表框内部存款和储蓄器非常不足
 LBN_KILLFOCUS 列表框正在失去输入宗旨
 LBN_SELCANCEL 选取被吊销
 LBN_SELCHANGE 接纳了另大器晚成项
 LBN_SETFOCUS 列表框拿到输入大旨

shell_execute.exe的主要code:

队列新闻和非队列音信
   从音信的发送路子来看,新闻能够分为2种:队列音信和非队列音讯。音讯队列由得以分成体系新闻队列和线程音信队列。系统新闻队列由Windows维护,线程音信队列则由种种GUI线程自个儿开展保证,为防止给non-GUI现存创立音信队列,所有线程爆发时并未新闻队列,仅当线程第叁回调用GDI函数时系统才给线程成立多个音讯队列。队列音讯送到系统音讯队列,然后到线程新闻队列;非队列音信一向送给目标窗口进程。
     对于队列新闻,最分布的是鼠标和键盘触发的新闻,比方WM_MOUSERMOVE,WM_CHA昂Cora等音信,还应该有大器晚成都部队分其余的新闻,举个例子:WM_PAINT、 WM_TIMER和WM_QUIT。当鼠标、键盘事件被触发后,相应的鼠标或键盘驱动程序就能够把那一个事件转变来相应的新闻,然后输送到系统新闻队列,由 Windows系统去开展拍卖。Windows系统则在切合的火候,从系统消息队列中抽取贰个音信,依据前边大家所说的MSG新闻布局鲜明消息是要被送往特别窗口,然后把抽出的消息送往创造窗口的线程的应和队列,上面包车型大巴事体就该由线程新闻队列操心了,Windows发轫忙自个儿的专门的工作去了。线程看见本身的新闻队列中有音信,就从队列中收取来,通过操作系统一发布送到合适的窗口进度去管理。
     日常来说,系统连接将新闻Post在消息队列的末梢。那样保险窗口以先进先出的次第选取音信。不过,WM_PAINT是二个区别,同叁个窗口的多少个WM_PAINT被统十分之一二个 WM_PAINT 音讯, 合并全数的无效区域到二个不行区域。合併WM_PAIN的指标是为了减小刷新窗口的次数。
图片 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;
}

图片 12
    非队列信息将会绕过系统队列和新闻队列,直接将音信发送到窗口进度,。系统一发布送非队列新闻文告窗口,系统一发布送音讯公告窗口。比如,当顾客激活二个窗口系统一发布送WM_ACTIVATE, WM_SETFOCUS, and WM_SETCU本田CR-VSO卡宴。那么些音信公告窗口它被激活了。非队列音信也得以由当应用程序调用系统函数发生。比方,当程序调用SetWindowPos系统一发布送WM_WINDOWPOSCHANGED新闻。一些函数也发送非队列音讯,比方上面我们要聊起的函数。
     
音信的出殡和安葬
     领会了上边的这几个根底理论之后,大家就足以张开一下简短的音讯发送与吸收接纳。
     把一个音信发送到窗口有3种艺术:发送、寄送和播放。
     发送音信的函数有SendMessage、SendMessageCallback、SendNotifyMessage、 SendMessageTimeout;寄送音信的函数重要有PostMessage、PostThreadMessage、 PostQuitMessage;广播音讯的函数小编清楚的仅有布罗兹castSystemMessage、 布罗兹castSystemMessageEx。
     SendMessage的原型如下:LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam卡塔尔,那么些函数重若是向八个或八个窗口发送一条音讯,一直等到音信被拍卖未来才会回到。然而需求潜心的是,假若接纳新闻的窗口是同多少个应用程序的一片段,那么这些窗口的窗口函数就被用作八个子前后相继及时被调用;假诺接到消息的窗口是被别的的线程所开创的,那么窗口系统就切换到对应的线程并且调用相应的窗口函数,那条音信不会被放进目的应用程序队列中。函数的再次回到值是由接受音信的窗口的窗口函数重返,重返的值决意于被发送的音信。
     PostMessage的原型如下:BOOL PostMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam卡塔尔(英语:State of Qatar),该函数把一条音讯放置到成立hWnd窗口的线程的新闻队列中,该函数不等新闻被拍卖就应声将决定重回。须求留意的是,尽管hWnd参数为 HWND_BROADCAST,那么,消息将被寄送给系统中的全数的交汇窗口和弹出窗口,不过子窗口不会收取该音讯;要是hWnd参数为NULL,则该函数相像于将dwThreadID参数设置成当下线程的注脚来调用PostThreadMEssage函数。
  从上面包车型地铁那2个有着代表性的函数,大家得以看来音信的出殡和安葬方式和寄送方式的区分所在:被发送的音信是还是不是会被当下处理,函数是或不是马上赶回。被发送的音讯会被立马处理,管理达成后函数才会重临;被寄送的新闻不会被立时管理,他被置于贰个先进先出的系列中,向来等到应用程序空线的时候才会被管理,然则函数放置音信后马上重临。
图片 13
  实际上,发送消息到三个窗口管理进程和一直调用窗口管理进程之间并从未太大的区分,他们直接的唯风度翩翩区别就在于你能够供给操作系统截获全数被发送的音讯,不过不可以知道收获对窗口管理进度的直白调用。
  以寄送点子发送的新闻常常是与客商输入事件相对应的,因为那个事件不是老大火急,能够开展缓慢的缓冲管理,举例鼠标、键盘音讯会被寄送,而按键等音信则会被发送。
  广播音讯用得超少,布罗兹castSystemMessage函数原型如下:
      long BroadcastSystemMessage(DWOENVISIOND dwFlags,LPDWOEscortD lpdwRecipients,UINT uiMessage,WPARAM wParam,LPARAM lParam卡塔尔(英语:State of Qatar);该函数能够向钦定的接纳者发送一条消息,这么些选择者能够是应用程序、可安装的驱动程序、网络驱动程序、系统级其他装置驱动新闻和她们的妄动组合。要求在意的是,假使dwFlags参数是BSF_QUE揽胜Y并且至少多少个接受者再次来到了BROADCAST_QUERY_DENY,则再次来到值为0,若无一点名BSF_QUEHighlanderY,则函数将新闻发送给全部接受者,并且忽略其再次来到值。

 

消息的吸收接纳
 新闻的收到主要有3个函数:GetMessage、PeekMessage、WaitMessage。
  GetMessage原型如下:BOOL GetMessage(LPMSG lpMsg,HWND hWnd,UINT wMsgFilterMin,UINT wMsgFilterMax卡塔尔国;该函数用来赢得与hWnd参数所内定的窗口相关的且wMsgFilterMin和wMsgFilter马克斯参数所提交的音信值范围内的信息。要求静心的是,假若hWnd为NULL,则GetMessage获取归属调用该函数应用程序的任黄金时代窗口的消息,假诺wMsgFilterMin和wMsgFilter马克斯都是0,则GetMessage就回去所有可获得的新闻。函数获取之后将去除音讯队列中的除 WM_PAINT音信之外的其余新闻,至于WM_PAINT则独有在其管理现在才被删除。
   PeekMessage原型如下:BOOL PeekMessage(LPMSG lpMsg,HWND hWnd,UINT wMsgFilterMin,UINT wMsgFilterMax,UINT wRemoveMsg);该函数用于查看应用程序的新闻队列,如若内部有音信就将其放入lpMsg所指的组织中,不过,与GetMessage差异的是,PeekMessage函数不会等到有音信放入队列时才重回。同样,假如hWnd为NULL,则PeekMessage获取归属调用该函数应用程序的任意气风发窗口的音信,要是hWnd=-1,那么函数只回去把hWnd参数为NULL的PostAppMessage函数送去的信息。假若wMsgFilterMin和wMsgFilterMax都以0,则PeekMessage就回到全部可收获的新闻。函数获取之后将视最终一个参数来支配是或不是删除消息队列中的除 WM_PAINT音信之外的别样音讯,至于WM_PAINT则唯有在其拍卖现在才被剔除。
   WaitMessage原型如下:BOOL WaitMessage(卡塔尔;当多少个应用程序无事可做时,该函数就将调控权交给其它的应用程序,同不经常候将该应用程序挂起,直到四个新的新闻被放入应用程序的种类之中才重返。

3. 缘由剖判

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

3.1 excel hang在哪里?

图片 14while(GetMessage(&msg, NULL, 0, 0))
图片 15{
图片 16       if(!TranslateAccelerator(msg.hWnd, hAccelTable, &msg))
图片 17      { 
图片 18            TranslateMessage(&msg);
图片 19            DispatchMessage(&msg);
图片 20       }
图片 21}

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

 

图片 22

   首先,GetMessage从进度的主线程的消息队列中获得叁个消息并将它复制到MSG布局,尽管队列中从不消息,则GetMessage函数将等待二个音讯的过来未来才再次回到。假使您将三个窗口句柄作为第4个参数字传送入GetMessage,那么独有钦赐窗口的的音信可以从队列中收获。GetMessage也能够从信息队列中过滤信息只采取音信队列中落在限制内的音信。此时将在动用GetMessage/PeekMessage钦点一个音讯过滤器。那个过滤器是二个音讯标志符的约束或许是贰个窗体句柄,可能两个同有的时候候钦定。当应用程序要寻觅一个后入消息队列的音讯是很有用。WM_KEYFIRST 和 WM_KEYLAST 常量用于接纳全数的键盘新闻。 WM_MOUSEFIRST 和 WM_MOUSELAST 常量用于选取全数的鼠标音讯。 
 然后TranslateAccelerator决断该音讯是还是不是七个按钮音信还假诺多少个加速键音讯,假若是,则该函数将把多少个开关信息转变到二个加快键信息传递给窗口的回调函数。管理了加快键之后,函数TranslateMessage将把四个按钮音讯WM_KEYDOWN和WM_KEYUP调换来二个WM_CHARAV4,但是需求在意的是,新闻WM_KEYDOWN,WM_KEYUP照旧将传递给窗口的回调函数。     
 管理完今后,DispatchMessage函数将把此音信发送给该音讯内定的窗口中已设定的回调函数。假如音讯是WM_QUIT,则 GetMessage再次回到0,进而退出循环体。应用程序能够利用PostQuitMessage来截至本身的消息循环。平常在主窗口的 WM_DESTROY音信中调用。
 上面大家举一个左近的小例子来证实那么些新闻泵的利用:

能够见到Excel hang在NtUserMessageCall(卡塔尔中,经过查询知,SendMessage(卡塔尔(قطر‎内部正是调用NtUserMessageCall(卡塔尔(英语:State of Qatar)来发送音讯的。

图片 23if (::PeekMessage(&msg, m_hWnd, WM_KEYFIRST,WM_KEYLAST, PM_REMOVE))
图片 24{
图片 25          if (msg.message == WM_KEYDOWN && msg.wParam == VK_ESCAPE)...
图片 26}
图片 27

翻开参数知excel调用NtUserMessageCall(卡塔尔(英语:State of Qatar)相像如下:

  这里大家担当全部的键盘音信,所以就用WM_KEYFIRST 和 WM_KEYLAST作为参数。最后三个参数能够是PM_NOREMOVE 或者 PM_REMOVE,表示音讯音讯是或不是应该从消息队列中删除。                 
   所以这段小代码便是推断是或不是按下了Esc键,假诺是就开展拍卖。

NtUserMessageCall(HWND_BROADCAST, WM_DDE_INITIATE)

窗口进程
 窗口进度是一个用于拍卖全数发送到那几个窗口的音信的函数。任何二个窗口类都有一个窗口进度。同三个类的窗口使用同样的窗口进程来响应音讯。系统一发布送信息给窗口进程将音讯数据作为参数传递给他,新闻赶到之后,依据新闻类型排序实行管理,个中的参数则用来分别分化的音讯,窗口进度使用参数发生合适行为。
 二个窗口进度不平时忽视音讯,假使他不管理,它会将音信传回到实施暗中同意的管理。窗口进度通过调用DefWindowProc来做那么些管理。窗口进程必须return一个值作为它的音讯管理结果。大超多窗口只处理小一些音信和将其余的经过DefWindowProc传递给系统做默许的拍卖。窗口进度被有着归属同贰个类的窗口分享,能为不一致的窗口管理音讯。下边我们来看一下现实的实例:

表达excel给持有顶层窗口发送一个WM_DDE_INITIATE音信,不过有窗口没有response

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

由此能够狐疑是由于console过程在和excel用DDE新闻通讯时,console未有响应excel发送的DDE新闻,招致excel hang住

 

 

信息分流器
  平日的窗口进度是透过三个switch语句来兑现的,这几个业务很烦,有未有更省事的办法吗?有,那正是音讯分流器,利用新闻分流器,我们得以把switch语句分成越来越小的函数,每一个音信都对应一个小函数,那样做的好处正是对新闻更易于管理。
  之所以被称作音信分流器,正是因为它可以对其它音信进行疏散。上面我们做二个函数就很明亮了:

3.2 为了验证3.1.1的疑心,用API Monitor一下ShellExecuteEx

图片 74void MsgCracker(HWND hWnd,int id,HWND hWndCtl,UINT codeNotify)
图片 75{
图片 76      switch(id)
图片 77      {
图片 78     case ID_A:
图片 79                  if(codeNotify==EN_CHANGE)图片 80
图片 81                  break;
图片 82     case ID_B:
图片 83                  if(codeNotify==BN_CLICKED)图片 84
图片 85                  break;
图片 86             图片 87.
图片 88       }
图片 89}
图片 90

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

然后大家修正一下窗口进度:

图片 91LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
图片 92{
图片 93       switch(message)
图片 94      {
图片 95             HANDLE_MSG(hWnd,WM_COMMAND,MsgCracker);
图片 96             HANDLE_MSG(hWnd,WM_DESTROY,MsgCracker);
图片 97           default:
图片 98                    return DefWindowProc(hWnd, message, wParam, lParam);
图片 99   }
图片 100  return 0;
图片 101}

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

在WindowsX.h中定义了如下的HANDLE_MSG宏:

图片 102

图片 103   #define HANDLE_MSG(hwnd,msg,fn) 
图片 104             switch(msg): return HANDLE_##msg((hwnd),(wParam),(lParam),(fn));

call stack展现实在是ShellExecuteEx所调用

实际上,HANDLE_WM_XXXX都是宏,例如:HANDLE_MSG(hWnd,WM_COMMAND,MsgCracker卡塔尔(英语:State of Qatar);将被调换到如下概念:

图片 105

图片 106   #define HANDLE_WM_COMMAND(hwnd,wParam,lParam,fn) 
图片 107             ((fn)((hwnd),(int)(LOWORD(wParam)),(HWND)(lParam),(UINT)HIWORD(wParam)),0L);

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

好了,事情到了这一步,应该全套都晴朗了。
而是,大家发今后windowsx.h里面还或者有贰个宏:FOTiggoWAEnclaveD_WM_XXXX,大家依旧那WM_COMMAND为例,进行剖释:

注意到下多个API GetWindowThreadProcessId ( 0x00310172 , 0x0012fb70 卡塔尔(英语:State of Qatar),刚好是收获那么些窗口的pid和tid,查看下参数窗口:

图片 108   #define FORWARD_WM_COMMAND(hwnd, id, hwndCtl, codeNotify, fn) 
图片 109     (void)(fn)((hwnd), WM_COMMAND, MAKEWPARAM((UINT)(id),(UINT)(codeNotify)), (LPARAM)(HWND)(hwndCtl))

以此窗口所属的进度PID = 0xc54,恰巧是excel的经过,表明ShellExecuteEx确实发送了DDE新闻给excel,並且可执发送的音讯的thread正是主线程

所以实际,FOHavalWA中华VD_WM_XXXX将新闻参数实行了再一次结构,生成了wParam && lParam,然后调用了小编们定义的函数。

图片 110

前面,我们解析了消息的核激情论和主导的函数及用法,接下去,大家将尤其研商新闻传递在MFC中的达成。

基于DDE的消息参数,可以预知wParam正是发送音讯的窗口,其句柄为2425190 = 0x250166,反向查询知这是ShellExecuteEx创立的”WorkerW”窗口

MFC音信的拍卖完毕格局
  初看MFC中的种种音讯,以致在脑子中牢固的C 的影响,大家兴许很自然的就能够想到利用C 的三大特色之后生可畏:设想机制来兑现音信的传递,不过通过剖析,大家看来职业实际不是想我们想像的那么,在MFC中国国投息是通过黄金时代种所谓的新闻映射机制来管理的。
  为啥吗?在潘爱中华民族解放先锋生翻译的《Visual C 本领内部意况》(第4版)中付出了详实的原因表明,笔者再综上可得一回。在CWnd类中差非常少有1十三个新闻,还大概有其它的MFC的类呢,算起来消息太多了,在C 中对前后相继中用到的每叁个派生类都要有贰个vtable,每个虚函数在vtable中都要占用二个4字节大小的输入地址,那样一来,对于每一种特定项目标窗口或控件,应用程序都亟待二个440KB大小的表来支持设想音信控件函数。
  借使说上面的窗口或控件能够勉强达成的话,那么对于菜单命令音信及按键命令音信呢?因为分裂的应用程序有两样的菜系和开关,咱们怎么管理啊?在MFC 库的这种音信映射系统就制止了利用大的vtable,並且能够在拍卖符合规律Windows音信的还要管理百废待举的应用程序的授命新闻。
  说白了,MFC中的音讯机制其实质是一张高大的音讯及其管理函数的各样对应表,然后加上解析管理那张表的使用框架之中的部分程序代码.那样就足以制止在SDK编制程序中用到的累赘的CASE语句。

图片 111

MFC的音信映射的基类CCmdTarget
  假诺您想让您的控件能够实行音讯映射,就必需从CCmdTarget类中派生。CCmdTarget类是MFC管理命令新闻的底子、大旨。MFC为此类设计了好多分子函数和意气风发部分成员数量,基本上是为着解决新闻映射难点的,全数响应音信或事件的类都从它派生,举个例子:应用程序类、框架类、文书档案类、视图类和精彩纷呈的控件类等等,还应该有不菲。
只是这些类里面有2个函数对音讯映射超级重大,三个是静态成员函数DispatchCmdMsg,另一个是虚函数OnCmdMsg。
DispatchCmdMsg特地供MFC内部接收,用来散发Windows音信。OnCmdMsg用来传递和出殡和安葬新闻、更新顾客分界面临象的情事。
CCmdTarget对OnCmdMsg的私下认可完结:在时下命令指标(this所指卡塔尔(英语:State of Qatar)的类和基类的音讯映射数组里研究钦定命令音讯的音信处理函数。
  这里运用虚构函数GetMessageMap拿到传令指标类的音信映射入口数组_messageEntries,然后在数组里相配命令音讯ID相似、调控文告代码也同等的音讯映射条款。此中GetMessageMap是虚构函数,所以能够确认当前下令指标的确切类。
假诺找到了三个拾贰分的音信映射条约,则运用DispachCmdMsg调用这一个管理函数;
黄金年代经未有找到,则使用_GetBaseMessageMap拿到基类的音信映射数组,查找,直到找到或探寻了装有的基类(到CCmdTarget)甘休;
倘诺最后未有找到,则赶回FASLE。
  各样从CCmdTarget派生的一声令下指标类都得以覆盖OnCmdMsg,利用它来规定是否能够拍卖某条命令,即便无法,就经过调用下一指令指标的 OnCmdMsg,把该命令送给下叁个发令指标管理。经常,派生类覆盖OnCmdMsg时,要调用基类的被隐讳的OnCmdMsg。
  在MFC框架中,一些MFC命令指标类隐讳了OnCmdMsg,如框架窗口类隐讳了该函数,实现了MFC的正经八百命令新闻发送路线。须要的话,应用程序也足以覆盖OnCmdMsg,退换二个或三个类中的发送规定,达成与正统框架发送规定分歧的出殡和安葬路径。比如,在偏下处境可以作那样的拍卖:在要打断发送顺序的类中把命令传给三个非MFC默许对象;在新的非暗许对象中或在或然要传播命令的下令目的中。

图片 112

消息映射的剧情
    通过ClassWizard为大家转移的代码,大家得以见到,信息映射基本上分为2多数:
    在头文件(.h卡塔尔中有贰个宏DECLARE_MESSAGE_MAP(卡塔尔国,他被放在了类的最后,是二个public属性的;与之相应的是在促成都部队分(.cpp卡塔尔国扩张了黄金年代章信息映射表,内容如下:
    BEGIN_MESSAGE_MAP(当前类, 当前类的基类卡塔尔国
       //{{AFX_MSG_MAP(CMainFrame)
         新闻的输入项
       //}}AFX_MSG_MAP
   END_MESSAGE_MAP()
   但是仅是这两项还远不足以达成一条音讯,借使二个新闻工作,必需有以下3个部分去合作:
1.在类的定义中投入相应的函数注脚;
2.在类的音讯映射表中踏向相应的消息映射入口项;
3.在类的兑现中进入相应的函数体;

 

音信的丰硕
   有了地点的这么些只是用作根底,大家接下去就做我们最熟练、最常用的做事:增加音信。MFC新闻的增进主要有2种方法:自动/手动,大家就以那2种办法为例,说一下如何增添音讯。
   1、利用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列表框中现身了,假诺还还没,那就接着往下看:卡塔尔(英语:State of Qatar)

3.2.2 为了验证3.2.1的定论,在PostMessageW上下断点追踪一下

   2、手动地丰硕新闻管理函数
    若是在Messages列表框中如故看不到大家想要的新闻,那么该音讯也许是被系统忽视掉或然是你和煦创设的,在这里种情景下,就不得不和谐手工业增添。依照大家眼下所说的新闻职业的3个零部件,大家逐个进行管理:
      1卡塔尔(英语:State of Qatar) 在类的. h文件中增加管理函数的扬言,紧接在//}}AFX_MSG行之后加盟申明,注意:必定要以afx_msg开头。
     经常,增加管理函数评释的最佳的地点是源代码中Class Wizard维护的表上面,可是在它标记其世界的{{}}括弧外面。这一个括弧中的任何事物都将会被Class Wizard销毁。
      2卡塔尔(英语:State of Qatar)接着,在顾客类的.cpp文件中找到//}}AFX_MSG_MAP行,紧接在它之后加盟音信入口项。相符,也是身处{ {} }的外面
      3卡塔尔(قطر‎ 最终,在该公文中增加新闻管理函数的实体。

图片 113

 

翻开一下buff的地址:

 

图片 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

加亮应当去掉

2> 然后创制叁个"WorkerW"的窗口用于DDE通讯

表A-4  公告音信-组合框

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  通告信息-编辑框

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-6  公告新闻-列表框

 

消息名称

说 明

LBN_DBLCLK

用户双击了一项

LBN_ERRSPACE

列表框内存不足

LBN_KILLFOCUS

列表框正在失去输入焦点

LBN_SELCANCEL

用户选择被取消

LBN_SELCHANGE

用户选择将改变

LBN_SETFOCUS

列表框获得输入焦点

4. 为啥双击展开excel不会hang住

Windows新闻大全

因为双击展开实际是用explorer.exe展开,而explorer.exe是有窗口的,能够健康的接纳管理WM_DDE_INITIATE消息

  Windows是风流罗曼蒂克新闻(Message)驱动式系统,Windows信息提供了应用程序与应用程序之间、应用程序与Windows系统之间进行报纸发表的手段。应用程序要贯彻的功用由音信来触发,并靠对新闻的响应和管理来完结。Windows系统中有二种音讯队列,生机勃勃种是系统新闻队列,另后生可畏种是应用程序音信队列。Computer的持有输入设备由 Windows监察和控制,当二个事件时有发生时,Windows先将输入的新闻归入系统音信队列中,然后再将输入的消息拷贝到相应的应用程序队列中,应用程序中的音讯循环从它的音信队列中搜寻每四个音讯并发送给相应的窗口函数中。三个风浪的发出,达到管理它的窗口函数必得经历上述过程。值得注意的是消息的非超过性,即无论事件的急与缓,总是按达到的主次排队(一些系统消息除却卡塔尔国,那就使得有些外表实时事件恐怕得不到当下的拍卖。

 

  由于Windows自个儿是由音讯使得的,举三个例子来注明这么些标题。展开记事本程序,该程序有一个File菜单,那么,在运营该应用程序的时候,假如顾客单击了File菜单里New命令时,这几个动作将被Windows (并非应用程序自身!)所擒获,Windows经过剖析获知那一个动作应该由地方所说的拾贰分应用程序去管理,既然是如此,Windows就发送了个名称叫WM_COMMAND的音讯给应用程序,该新闻所富含音讯报告应用程序:"客户单击了New菜单",应用程序得悉那后生可畏音信之后,接收相应的动作来响应它,这几个进度称为音讯管理。Windows为每四个应用程序(确切地说是每二个线程卡塔尔(英语:State of Qatar)维护了对应的信息队列,应用程序的天职就是不停的从它的音信队列中收获音信,深入分析新闻和拍卖音讯,直到一条吸收名字为WM_QUIT新闻截止,这么些进程日常是由风流罗曼蒂克种名称为新闻循环的程序构造来促成的。

5. 怎么win7上不会犹如此的主题素材

  音讯小编是作为三个记下传递给应用程序的,这一个记录中包罗了新闻的品种以至其余消息。比如,对于单击鼠标所发出的消息的话,这么些记录中蕴藏了单击鼠标时的坐标。那一个记录类型叫做T M s g,它在Wi n d o w s单元中是这么声明的:

5.1 在API Monitor中看下PostMessageW

type

图片 115

TMsg = packedrecord

注意到win7下PostMessageW是用的线程2调用的,搜一下线程创制API CreateThread

hwnd: HWND / /窗口句柄

图片 116

message: UINT / /新闻常量标志符

可以知道是ShellExecuteEx内部成立的线程,所以win7上ShellExecuteEx创造了一个线程专门用来管理和excel的DDE音信通讯,那样就能够平常的选取管理excel发过来的WM_DDE_INITIATE消息了

wParam: WPA avancier AM  // 32个人音讯的特定附加音讯

lParam: LPA 奥迪Q5 AM  // 33人音信的特定附加消息

time: DWO福特ExplorerD / /音信创设时的时间

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

end

 

音讯中有如何?

是或不是以为贰个音讯记录中的音讯像菲律宾语相同?假诺是那样,那么看大器晚成看上边包车型大巴解释:

hwnd 三十二人的窗口句柄。窗口能够是任何类型的显示屏对象,因为Win32力所能致维护大好多可视对象的句柄(窗口、对话框、按键、编辑框等卡塔尔(قطر‎。

message 用于区分别的音信的常量值,那个常量能够是Windows单元中预订义的常量,也能够是自定义的常量。

wParam 常常是一个与消息有关的常量值,也恐怕是窗口或控件的句柄。

lParam 平常是贰个针对性内部存款和储蓄器中数量的指针。由于WParm、lParam和Pointer都是叁16个人的,因而,它们之间可以相互转变。

 

WM_NULL = 0

WM_CREATE = 1

应用程序创立八个窗口

WM_DESTROY = 2

三个窗口被销毁

WM_MOVE = 3

移动贰个窗口

WM_SIZE = 5

转移四个窗口的轻重

WM_ACTIVATE = 6

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

WM_SETFOCUS = 7

获得大旨后

WM_KILLFOCUS = 8

失掉核心

WM_ENABLE = 10

改变enable状态

WM_SETREDRAW = 11

安装窗口是或不是能重画

WM_SETTEXT = 12

应用程序发送此音信来安装二个窗口的文本

WM_GETTEXT = 13

应用程序发送此新闻来复制对应窗口的文书到缓冲区

WM_GETTEXTLENGTH =14

获得与贰个窗口有关的文件的长度(不带有空字符)

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_QUELX570YENDSESSION消息后,此消息发送给应用程序,

照会它对话是不是终止

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

发送给最小化窗口当它Logo就要被重画

WM_ICONERASEBKGND =39

此音信发送给有个别最小化窗口,仅当它在摄影标前它的背景必需被重画

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_WANTKEYBOASportageDINPUT风格的产生给它的持有者来响应WM_KEYDOWN消息

WM_CHARTOITEM = 47

此新闻由三个LBS_WANTKEYBOA大切诺基DINPUT风格的列表框发送给她的全数者来响应WM_CHAR消息

WM_SETFONT = 48

当绘制文本时前后相继发送此新闻拿到控件要用的颜料

WM_GETFONT = 49

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

WM_SETHOTKEY = 50

应用程序发送此音信让三个窗口与二个热键相关连

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

当顾客已经登入或退出后发送此音信给持有的窗口,当客户登陆或分离时系统更新顾客的具体

设置音信,在顾客更新设置时系统及时发送此新闻;

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

次第发送此音讯让三个新的大Logo或小Logo与某些窗口关联;

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

当光标在一个窗口的非客户区内活动时发送此音讯给这一个窗口 //非顾客区为:窗体的标题栏及窗

的边框体

WM_NCLBUTTONDOWN =161

当光标在二个窗口的非顾客区同临时间按下鼠标左键时提交此音信

WM_NCLBUTTONUP =162

当客户自由鼠标左键同期光标有个别窗口在非客商区十发送此音讯;

WM_NCLBUTTONDBLCLK= 163

当客商双击鼠标左键同不经常间光标有个别窗口在非顾客区十发送此音讯

WM_NCRBUTTONDOWN =164

当客商按下鼠标右键同一时候光标又在窗口的非客商区时发送此新闻

WM_NCRBUTTONUP =165

当客商自由鼠标右键同一时候光标又在窗口的非客户区时发送此音信

WM_NCRBUTTONDBLCLK= 166

当顾客双击鼠标右键同期光标有个别窗口在非顾客区十发送此新闻

WM_NCMBUTTONDOWN =167

当顾客按下鼠标中键同不经常间光标又在窗口的非客商区时发送此消息

WM_NCMBUTTONUP =168

当顾客自由鼠标中键同时光标又在窗口的非客商区时发送此音信

WM_NCMBUTTONDBLCLK= 169

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

WM_KEYFIRST = 256

WM_KEYDOWN = 256

//按下三个键

WM_KEYUP = 257

//释放三个键

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

在三个对话框程序被显示前发送此音讯给它,平常用此消息早先化控件和实行此外任务

WM_COMMAND = 273

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

WM_SYSCOMMAND = 274

当客商筛选窗口菜单的一条命令或当客商选用最大化或纤维化时那些窗口会选用此音讯

WM_TIMERubicon = 275 //产生了沙漏事件

WM_HSCROLL = 276

当二个窗口标准水平滚动条爆发四个轮转事件时发送此新闻给那么些窗口,也发送给具有它的控件

WM_VSCROLL = 277

当二个窗口标准垂直滚动条发生一个滚动事件时发送此音信给这多少个窗口也,发送给具有它的控件 WM_INITMENU = 278

当一个菜系就要被激活时发送此消息,它发生在客商菜单条中的某项或按下有些菜单键,它同意

前后相继在突显前更换菜单

WM_INITMENUPOPUP =279

当二个下拉菜单或子菜单就要被激活时发送此音讯,它同意程序在它显得前修改菜单,而毫不

改动整个

WM_MENUSELECT = 287

当顾客筛选一条菜单项时发送此新闻给菜单的持有者(平常是窗口)

WM_MENUCHAR = 288

当菜单已被激活客商按下了有个别键(分化于加快键),发送此消息给菜单的全部者;

WM_ENTERIDLE = 289

当一个模态对话框或菜单步入空载状态时发送此音信给它的主人,一个模态对话框或菜单步入空载状态正是在拍卖完一条或几条先前的新闻后不曾新闻它的列队中伺机

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

当三个开关控件将在被绘制时发送此音讯给它的父窗口;通过响应那条音讯,全数者窗口能够

由此选择给定的相干展现设备的句柄来安装按纽的文书和背景颜色

WM_CTLCOLORDLG =310

当一个会话框控件将要被绘制前发送此新闻给它的父窗口;通过响应这条音信,全数者窗口能够

经过应用给定的相干展现设备的句柄来安装对话框的公文背景颜色

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

次第发送此新闻给二个编辑框或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宝马7系D函数时 发送此音信给剪贴板的主人

WM_DRAWCLIPBOARD =776

当剪贴板的剧情改动时发送此新闻给剪贴板观看链的第一个窗口;它同意用剪贴板观望窗口来

体现剪贴板的新内容;

WM_PAINTCLIPBOARD =777

当剪贴板满含CF_OWNEHighlanderDIPLAY格式的数码同有时候剪贴板观察窗口的客商区需求重画;

WM_VSCROLLCLIPBOARD= 778

WM_SIZECLIPBOARD =779

当剪贴板蕴含CF_OWNE路虎极光DIPLAY格式的数目同有时间剪贴板观看窗口的顾客区域的朗朗上口已经转移是此音信通过剪贴板观察窗口发送给剪贴板的主人;

WM_ASKCBFORMATNAME= 780

透过剪贴板观看窗口发送此消息给剪贴板的持有者来号召二个CF_OWNE奥迪Q5DISPLAY格式的剪贴板的名字

WM_CHANGECBCHAIN =781

当二个窗口从剪贴板观望链中移去时发送此音讯给剪贴板观看链的首先个窗口;

WM_HSCROLLCLIPBOARD= 782

此音讯通过三个剪贴板观察窗口发送给剪贴板的持有者;它发出在当剪贴板包蕴CFOWNEQashqaiDISPALY格式的数量同期有个事件在剪贴板阅览窗的等级次序滚动条上;全部者应滚动剪贴板图象并创新滚动条的值;

WM_QUERYNEWPALETTE= 783

此音信发送给将在收到宗旨的窗口,此音信能使窗口在选用核心时相同的时间有机遇完毕他的逻辑调色板

WM_PALETTEISCHANGING=784

当四个应用程序正要贯彻它的逻辑调色板时发此音信通告全数的应用程序

WM_PALETTECHANGED =785

此消息在多个怀有宗旨的窗口完毕它的逻辑调色板后发送此音信给持有一级并交汇的窗口,以此

来改换系统调色板

WM_HOTKEY = 786

当顾客按下由REGISTECRUISERHOTKEY函数注册的热键时交因此消息

WM_PRINT = 791

应用程序发送此音讯仅当WINDOWS或别的应用程序发出叁个号令须要绘制三个应用程序的大器晚成有个别;

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

多个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顾客程序来传递个风流罗曼蒂克数据项给顾客或通告客商的一条可用数据项

WM_DDE_REQUEST =WM_DDE_FIRST 6

三个DDE顾客程序提交此新闻给七个DDE服务程序来倡议一个数据项的值;

WM_DDE_POKE =WM_DDE_FIRST 7

三个DDE客商程序提交此音信给三个DDE服务程序,顾客使用此新闻来号令服务器收到叁个未经同意的多寡项;服务器通过答复WM_DDE_ACK新闻提示是还是不是它选取这几个数目项;

WM_DDE_EXECUTE =WM_DDE_FIRST 8

多个DDE客商程序提交此音讯给多少个DDE服务程序来发送叁个字符串给服务器让它象串行命令同样被拍卖,服务器通过提交WM_DDE_ACK音信来作回应;

WM_DDE_LAST =WM_DDE_FIRST 8

WM_APP = 32768

WM_USER = 1024

此音信能支援应用程序自定义私有音信;

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

通报音讯(Notification message卡塔尔(英语:State of Qatar)是指那样生龙活虎种音信,三个窗口内的子控件发生了部分作业,须要通

知父窗口。文告音讯只适用于专门的学业的窗口控件如按键、列表框、组合框、编辑框,以致Windows 95公

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

滚动条都会生出通告新闻。

按扭

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 CRUISER 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 Odyssey XC60 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 福睿斯 Haval S PA CE编辑框内部存款和储蓄器不足

E N _ H S C 科雷傲 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 GL450 O L L顾客点击了僵直滚动条音讯含义

列表框

L B N _ D B L C L K客商双击了风姿浪漫项

L B N _ E QX56 本田UR-V 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列表框得到输入主题

 

转载:

本文由bifa688.com发布,转载请注明来源:Windows消息机制要点,Windows音信机制