龙电竞官网:Windows消息机制要点

2019-12-01 02:55栏目:竞技宝app
TAG:

1. 问题

1. 窗口进度 
各类窗口会有叁个可以称作窗口进度的回调函数(WndProc卡塔尔(قطر‎,它富含多个参数,分别为:窗口句柄(Window Handle卡塔尔国,音信ID(Message ID卡塔尔,和八个音信参数(wParam, lParam卡塔尔,当窗口收到新闻时系统就能够调用此窗口进度来处理音讯。(所以叫回调函数)

音信是指什么?
     音信系统对此二个win32顺序来讲非常非常重要,它是一个程序运行的引力来源。一个音讯,是系统定义的三个叁拾伍人的值,他唯风姿浪漫的定义了八个事变,向 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卡塔尔(英语:State of Qatar) 
与窗口的内部运维有关,如创设窗口,绘制窗口,销毁窗口等。能够是平时的窗口,也足以是Dialog,控件等。
如:WM_CREATE, WM_PAINT, WM_MOUSEMOVE, WM_CTLCOLOR, WM_HSCROLL...
2>命令新闻(Command Message卡塔尔:注意这类新闻通称为WM_COMMAND
与拍卖客户央求有关, 如单击菜单项或工具栏或控件时, 就能时有爆发命令音讯。
WM_COMMAND, LOWO普拉多D(wParam卡塔尔表示菜单项,工具栏开关或控件的ID。假若是控件, HIWO途睿欧D(wParam卡塔尔(قطر‎表示控件音讯类型
3> 控件通告(Notify Message卡塔尔国 
控件通告音信, 那是最灵敏的新闻格式, 其Message, wParam, lParam分别为:WM_NOTIFY, 控件ID,指向NMHD中华V的指针。NMHD奥德赛包蕴控件公告的剧情, 可以从心所欲增添。
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;     //32个人音讯的一定附加新闻,确切含义信赖于音讯值
龙电竞官网 6       LPARAM  lParam;     //三十人信息的特定附加消息,确切含义信赖于音讯值
龙电竞官网 7       DWOLANDD   time;       //新闻创制时的时日
龙电竞官网 8       POINT   pt;         //信息创立时的鼠标/光标在显示器坐标系中的地点
龙电竞官网 9}MSG;
龙电竞官网 10

 

3 音信队列(Message Queues卡塔尔国 
Windows中有二种等级次序的消息队列
1卡塔尔(英语:State of Qatar) 系统音讯队列(System Message Queue卡塔尔(英语:State of Qatar) 那是二个系统唯豆蔻梢头的Queue,设备驱动(mouse, keyboard卡塔尔会把操作输入转产生音信存在系统队列中,然后系统会把此音讯放到指标窗口所在的线程的新闻队列(thread-specific message queue卡塔尔(英语:State of Qatar)中等待管理
2卡塔尔(英语:State of Qatar) 线程音信队列(Thread-specific Message Queue卡塔尔国 每三个GUI线程都会爱惜这么一个线程音讯队列。(那么些队列唯有在线程调用GDI函数时才会创建,暗中同意不创制卡塔尔国。然后线程新闻队列中的新闻会被送到相应的窗口进程(WndProc卡塔尔(قطر‎管理.
在乎: 线程音信队列中WM_PAINT,WM_TIME昂Cora独有在Queue中从未其余音信的时候才会被管理,WM_PAINT音信还有大概会被统一以提升作用。别的具备音讯以先进先出(FIFO)的办法被拍卖。

    新闻可以由系统可能应用程序爆发。系统在发生输入事件时发生音讯。比方, 当顾客敲键, 移动鼠标可能单击控件。系统也发出新闻以响应由应用程序带给的改换, 比如应用程序改造系统字体制更正变窗体大小。应用程序能够生出音信使窗体施行职分,恐怕与任何应用程序中的窗口通信。

2. 重现步骤

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

音信中有怎么着?
   大家付出了地点的评释,是否会对消息构造有了二个比较清楚的认知?假使还从未,那么大家再试着提交上面包车型地铁分解:
     hwnd 三14人的窗口句柄。窗口能够是其他项指标荧屏对象,因为Win32可见维护大多数可视对象的句柄(窗口、对话框、按钮、编辑框等卡塔尔(قطر‎。
     message用于区分其余音讯的常量值,那一个常量能够是Windows单元中预约义的常量,也足以是自定义的常量。新闻标记符以常量命名的办法提议音讯的意思。当窗口进度选取到新闻随后,他就能够使用消息标志符来决定哪些管理新闻。举个例子、WM_PAINT告诉窗口进度窗体客户区被改变了亟需重绘。符号常量钦命系统音讯归于的类别,其前缀指明了拍卖解释音信的窗体的种类。
     wParam 日常是五个与音讯有关的常量值,也可能是窗口或控件的句柄。
     lParam 经常是三个照准内部存款和储蓄器中多少的指针。由于WParam、lParam和Pointer都以三13个人的,由此,它们之间能够互相转换。

复发碰着:XP sp3 / Office 二零零五(其余office版本应该也可以,未有测量检验)

5 PostMessage(PostThreadMessage), SendMessage 
PostMessage:把音信放到指定窗口所在的线程新闻队列中后即刻再次回到。 PostThreadMessage:把音信放到钦赐线程的音讯队列中后旋即赶回。
SendMessage:直接把音信送到窗口进度管理,管理完了才回去。

音信标记符的值
     系统一保险留音讯标记符的值在0x0000在0x03ff(WM_USE讴歌RDX-1卡塔尔(英语:State of Qatar)范围。这几个值被系统定义音信使用。应用程序不能够选择这几个值给协和的音信。应用程序新闻从WM_USER(0X0400)到0X7FFF,或0XC000到0XFFFF;WM_USEEnclave到 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路虎极光智跑SPACE 组合框内部存款和储蓄器不足
 CBN_KILLFOCUS 组合框失去输入核心
 CBN_SELCHANGE 在组合框中采取了大器晚成项
 CBN_SELENDCANCEL 客户的选项相应被撤回
 CBN_SELENDOK 客商的精选是法定的
 CBN_SETFOCUS 组合框获得输入核心

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

8(新闻死锁( Message Deadlocks卡塔尔(英语:State of Qatar) 
假诺有线程A和B, 今后有以下下步骤
1卡塔尔国 线程A SendMessage给线程B, A等待音信在线程B中拍卖后再次来到
2卡塔尔(英语:State of Qatar) 线程B收到了线程A发来的音讯,并进行拍卖, 在管理进程中,B也向线程A SendMessgae,然后等待从A再次回到。
因为这个时候, 线程A正等待从线程B再次来到, 相当小概管理B发来的音信, 进而招致了/线程A,B相互等待, 产生死锁。多少个线程也得以产生环形死锁。
能够运用 SendNotifyMessage或SendMessageTimeout来幸免现身死锁。

编辑框控件
 EN_CHANGE 编辑框中的文本己更新
 EN_E牧马人途达SPACE 编辑框内存不足
 EN_HSCROLL 客户点击了等级次序滚动条
 EN_KILLFOCUS 编辑框正在失去输入核心
 EN_MAXTEXT 插入的开始和结果被截断
 EN_SETFOCUS 编辑框获得输入宗旨
 EN_UPDATE 编辑框中的文本将在更新
 EN_VSCROLL 客商点击了僵直滚动条音信含义

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

9 BroadcastSystemMessage 
大家平时所接触到的信息都是发送给窗口的,其实, 消息的选择者可以是多种多种的,它能够是应用程序(applications卡塔尔, 可安装驱动(installable drivers卡塔尔(英语:State of Qatar),网络设施(network drivers卡塔尔国, 系统级设备驱动(system-level device drivers卡塔尔国等, 
布罗兹castSystemMessage那么些API能够对以上系统组件发送消息。

列表框控件
 LBN_DBLCLK 顾客双击了生龙活虎项
 LBN_EKoleos中华VSPACE 列表框内存远远不足
 LBN_KILLFOCUS 列表框正在失去输入宗旨
 LBN_SELCANCEL 选用被撤除
 LBN_SELCHANGE 采取了另意气风发项
 LBN_SETFOCUS 列表框获得输入主旨

shell_execute.exe的主要code:

队列信息和非队列音讯
   从新闻的出殡渠道来看,音信能够分为2种:队列音信和非队列新闻。新闻队列由得以分为种类音讯队列和线程音信队列。系统音信队列由Windows维护,线程音信队列则由各类GUI线程本身开展保险,为制止给non-GUI现存创造消息队列,所有线程发生时并未音信队列,仅当线程第三回调用GDI函数时系统才给线程创立三个新闻队列。队列信息送到系统音讯队列,然后到线程音信队列;非队列消息平素送给指标窗口进度。
     对于队列音讯,最司空眼惯的是鼠标和键盘触发的新闻,例如WM_MOUSERMOVE,WM_CHA宝马7系等音信,还也可能有一点别的的音讯,比如: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冠道SO途达。那个消息文告窗口它被激活了。非队列新闻也足以由当应用程序调用系统函数发生。例如,当程序调用SetWindowPos系统一发布送WM_WINDOWPOSCHANGED音信。一些函数也发送非队列音信,譬喻上边大家要谈起的函数。
     
消息的发送
     了然了地点的那个根基理论之后,大家就可以开展一下简易的新闻发送与吸取。
     把多少个新闻发送到窗口有3种办法:发送、寄送和播发。
     发送音讯的函数有SendMessage、SendMessageCallback、SendNotifyMessage、 SendMessageTimeout;寄送音讯的函数首要有PostMessage、PostThreadMessage、 PostQuitMessage;广播音信的函数小编晓得的独有BroadcastSystemMessage、 布RhodescastSystemMessageEx。
     SendMessage的原型如下:LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam卡塔尔,这些函数首即便向八个或多少个窗口发送一条音讯,一贯等到新闻被管理今后才会回来。可是供给小心的是,要是收到音信的窗口是同二个应用程序的一片段,那么这一个窗口的窗口函数就被看做二个子顺序及时被调用;倘使选择音讯的窗口是被此外的线程所创设的,那么窗口系统就切换成对应的线程并且调用相应的窗口函数,那条音信不会被放进指标应用程序队列中。函数的重回值是由采用新闻的窗口的窗口函数重返,再次回到的值决定于被发送的音信。
     PostMessage的原型如下:BOOL PostMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam卡塔尔,该函数把一条信息放置到创造hWnd窗口的线程的信息队列中,该函数不等新闻被管理就立马将调节再次来到。要求注意的是,假诺hWnd参数为 HWND_BROADCAST,那么,音讯将被寄送给系统中的所有的重叠窗口和弹出窗口,不过子窗口不会选取该音信;要是hWnd参数为NULL,则该函数肖似于将dwThreadID参数设置成当下线程的标记来调用PostThreadMEssage函数。
  从地点的那2个具备代表性的函数,大家可以看看音信的发送情势和寄送情势的界别所在:被发送的音信是不是会被当即处理,函数是不是及时回去。被发送的音信会被及时管理,管理实现后函数才会回到;被寄送的音讯不会被立时管理,他被内置三个先进先出的行列中,从来等到应用程序空线的时候才会被拍卖,可是函数放置新闻后立马回到。
龙电竞官网 13
  实际上,发送消息到三个窗口管理进度和一贯调用窗口处理进程之间并未有太大的界别,他们直白的绝无独有分化就在于你能够须求操作系统截获全数被发送的消息,但是不可见收获对窗口管理进程的第一手调用。
  以寄送点子发送的音讯平日是与顾客输入事件相对应的,因为这几个事件不是老大热切,能够拓宽缓慢的缓冲管理,举个例子鼠标、键盘音信会被寄送,而按键等音讯则会被发送。
  广播音信用得非常少,BroadcastSystemMessage函数原型如下:
      long 布罗兹castSystemMessage(DWO奥德赛D dwFlags,LPDWOTiguanD lpdwRecipients,UINT uiMessage,WPARAM wParam,LPARAM lParam卡塔尔(قطر‎;该函数能够向内定的选拔者发送一条信息,那几个接纳者能够是应用程序、可安装的驱动程序、网络驱动程序、系统级其余装置驱动音信和她们的随机组合。须求小心的是,假若dwFlags参数是BSF_QUELacrosseY並且起码一个接纳者重返了BROADCAST_QUERY_DENY,则再次回到值为0,若无一点名BSF_QUEEvoqueY,则函数将新闻发送给全部选取者,何况忽视其重返值。

 

音讯的吸纳
 新闻的收到首要有3个函数:GetMessage、PeekMessage、WaitMessage。
  GetMessage原型如下:BOOL GetMessage(LPMSG lpMsg,HWND hWnd,UINT wMsgFilterMin,UINT wMsgFilterMax卡塔尔(قطر‎;该函数用来赢得与hWnd参数所内定的窗口相关的且wMsgFilterMin和wMsgFilterMax参数所付出的新闻值范围内的音讯。供给注意的是,如果hWnd为NULL,则GetMessage获取归属调用该函数应用程序的任朝气蓬勃窗口的音讯,假使wMsgFilterMin和wMsgFilterMax都以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函数将等待贰个新闻的到来今后才回去。即便你将三个窗口句柄作为第叁个参数字传送入GetMessage,那么唯有钦点窗口的的新闻能够从队列中收获。GetMessage也足以从消息队列中过滤音讯只采纳新闻队列中落在约束内的消息。那时候将在选取GetMessage/PeekMessage钦定贰个音讯过滤器。那个过滤器是八个新闻标志符的界定或许是三个窗体句柄,只怕双方同不日常候钦点。当应用程序要物色叁个后入新闻队列的新闻是很有用。WM_KEYFIRST 和 WM_KEYLAST 常量用于选取全体的键盘音信。 WM_MOUSEFIRST 和 WM_MOUSELAST 常量用于选择全部的鼠标消息。 
 然后TranslateAccelerator决断该音信是还是不是三个按钮新闻还要是三个加快键信息,借使是,则该函数将把多少个开关音信转换来二个加快键信息传递给窗口的回调函数。管理了加快键之后,函数TranslateMessage将把四个开关新闻WM_KEYDOWN和WM_KEYUP转变来一个WM_CHA奥迪Q3,可是需求小心的是,消息WM_KEYDOWN,WM_KEYUP依然将传递给窗口的回调函数。     
 管理完事后,DispatchMessage函数将把此新闻发送给该音讯钦赐的窗口中已设定的回调函数。如若新闻是WM_QUIT,则 GetMessage再次回到0,进而退出循环体。应用程序能够选择PostQuitMessage来结束本身的音讯循环。平常在主窗口的 WM_DESTROY音讯中调用。
 上面大家举一个分布的小例子来验证那些音信泵的选拔:

能够看出Excel hang在NtUserMessageCall(卡塔尔(英语:State of Qatar)中,经过查询知,SendMessage(卡塔尔(英语:State of Qatar)内部正是调用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(卡塔尔(قطر‎相同如下:

  这里大家选取全数的键盘音讯,所以就用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卡塔尔(قطر‎;将被转变来如下概念:

龙电竞官网 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里面还会有一个宏:FO昂CoraWAEnclaveD_WM_XXXX,大家照旧那WM_COMMAND为例,实行剖释:

留意到下多少个API GetWindowThreadProcessId ( 0x00310172 , 0x0012fb70 卡塔尔,正巧是赢得这些窗口的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就是主线程

就此实际,FO逍客WAMuranoD_WM_XXXX将新闻参数实行了再也布局,生成了wParam && lParam,然后调用了大家定义的函数。

龙电竞官网 110

日前,大家剖析了新闻的主导理论和着力的函数及用法,接下去,我们将越发商讨音讯传递在MFC中的完毕。

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

MFC音讯的拍卖达成方式
  初看MFC中的各样音讯,以至在脑子中深根固柢的C++的熏陶,大家大概很自然的就能想到利用C++的三大特征之生龙活虎:设想机制来贯彻信息的传递,可是经过解析,大家看出专门的学问并非想大家想像的那么,在MFC中国国投息是由此生龙活虎种所谓的音讯映射机制来管理的。
  为啥呢?在潘爱中华民族解放先锋生翻译的《Visual C++手艺内部景况》(第4版)中付出了详细的案由表明,作者再一句话来说一回。在CWnd类中山大学约有112个音信,还应该有其余的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所指卡塔尔的类和基类的音信映射数组里探寻钦定命令新闻的消息管理函数。
  这里运用设想函数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卡塔尔 在类的. h文件中丰硕管理函数的宣示,紧接在//}}AFX_MSG行之后参预注解,注意:必定要以afx_msg开头。
     平时,增加管理函数申明的最佳之处是源代码中Class Wizard维护的表上边,可是在它标识其领域的{{}}括弧外面。这一个括弧中的任何小川西都将会被Class Wizard销毁。
      2卡塔尔(قطر‎接着,在顾客类的.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 途观 AM  // 叁12个人音讯的一定附加音讯

lParam: LPA Tiggo AM  // 31人音信的特定附加音信

time: DWO奥迪Q5D / /音讯创造时的时刻

pt: TPoint / /信息创建时的鼠标地方

end

 

音信中有怎么样?

是或不是以为三个音信记录中的音讯像日文同样?假若是那般,那么看生龙活虎看下边包车型客车解释:

hwnd 38位的窗口句柄。窗口可以是其余类型的显示屏对象,因为Win32可以见到维护大多数可视对象的句柄(窗口、对话框、开关、编辑框等卡塔尔国。

message 用于区分别的新闻的常量值,这一个常量能够是Windows单元中预约义的常量,也能够是自定义的常量。

wParam 平常是叁个与音讯有关的常量值,也是有可能是窗口或控件的句柄。

lParam 平时是叁个针对内部存款和储蓄器中数量的指针。由于WParm、lParam和Pointer都以三十四人的,因而,它们之间可以并行调换。

 

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_QUESportageYENDSESSION音信后,此新闻发送给应用程序,

文告它对话是不是终止

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_WANTKEYBOALX570DINPUT风格的发出给它的持有者来响应WM_KEYDOWN消息

WM_CHARTOITEM = 47

此音讯由二个LBS_WANTKEYBOAEscortDINPUT风格的列表框发送给他的持有者来响应WM_CHAR消息

WM_SETFONT = 48

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

WM_GETFONT = 49

应用程序发送此音讯获得当前控件绘制文本的字体

WM_SETHOTKEY = 50

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

WM_GETHOTKEY = 51

应用程序发送此新闻来剖断热键与有个别窗口是或不是有关联

WM_QUERYDRAGICON =55

此音信发送给最小化窗口,当此窗口就要被拖放而它的类中并未有定义Logo,应用程序能

归来三个Logo或光标的句柄,当客商拖放图标时系统来得这么些Logo或光标

WM_COMPAREITEM = 57

发送此音信来判断combobox或listbox新增的项的相持地点

WM_GETOBJECT = 61

WM_COMPACTING = 65

版权声明:本文由龙竞技官网发布于竞技宝app,转载请注明出处:龙电竞官网:Windows消息机制要点