hang的缘由解析,Windows音讯机制

by admin on 2019年11月8日

1. 问题

1. 窗口进程 
各样窗口会有三个叫做窗口进程的回调函数(WndProc),它包蕴多少个参数,分别为:窗口句柄(Window
Handle),音讯ID(Message ID),和七个消息参数(wParam,
lParam),当窗口收到消息时系统就能够调用此窗口进程来拍卖音信。(所以叫回调函数卡塔 尔(阿拉伯语:قطر‎

消息是指什么?
    
音讯系统对此多个win32主次来讲十二分珍视,它是贰个程序运维的引力来源。八个新闻,是系统定义的一个叁拾叁人的值,他唯生龙活虎的定义了一个平地风波,向
Windows发出一个通告,告诉应用程序有个别事情产生了。譬喻,单击鼠标、退换窗口尺寸、按下键盘上的多少个键都会使Windows发送三个音信给应用程序。
   
音讯作者是作为三个笔录传递给应用程序的,那么些记录中包涵了消息的类型以至任何消息。比方,对于单击鼠标所发生的新闻以来,这几个记录中带有了单击鼠标时的坐标。这一个记录类型叫做MSG,MSG含有来自windows应用程序音信队列的新闻音讯,它在Windows中宣称如下:

至于windows操作系统之信息和音讯队列

至于新闻和消息队列
不像基于MS-DOS的应用程序,基于Windows的次序是事件驱动的。他们不做其余展现调用来收获输入。而是通过等待系统传递给他俩。

系统为应用程序传递全部输入到程序中的分化窗口。各个窗口都有两个名字为窗口进程的函数,用于拍卖全部到该窗口的输入。窗口管理进度管理输入,并将调节再次来到给系统。

假使叁个顶层窗口结束响应新闻超越两秒,系统将会感到该窗口为非响应状态。在此种情形下,系统将潜伏该窗口并用装有同等Z顺序,地点,尺寸和可视化属性的ghost窗口替代该窗口。这种场合下,允许客商移动它,也许转移她的尺码,以至倒闭应用程序。然后,那也是风华正茂味能够做的动作,因为应用程序将来是不响应的。当在调解景况下,系统不会生出ghost窗口。

其后生可畏段子,商量如下核心:
windows消息
系统以音信的款型传递输入到窗口的管理进度。系统和应用程序均可产生新闻。系统在每回输入事件时,发生三个消息,举个例子,当用于打击,移动鼠标也许点击滚动条风流倜傥类的控件。应用程序引起系统改换也会引致系统产生新闻,比方三个应用程序改换了系统的书体能源池大概退换了他本人窗口的高低。叁个应用程序能够发生这么的消息,该音讯能够引导她的窗口直接实施任务照旧和别的应用程序的窗口进行相互影响。

新闻分类:
系统定义音讯
当系统和应用程序交互作用时,系统一发布送系统音讯,以调整应用程序的操作以致给程序传递输入也许此外音信。应用程序也足以发送系统音信,应用程序日常用那么些音信来支配通过先行登记的窗口类创制的窗口的一言一动。

新闻常量标识钦点了其所属系统预约义音信种类。前缀显著能够翻译大概管理的音讯体系。如下。
AMB/ABN ===application desktop toolbar
acm/acn ===animation control
cb/cbn ===combobox control
home88一必发,ccm ===generatl control
cdm ===common dialog box
dfm ===default contex menu
dl ===drag list box
sb ===status bar
tvm/tvn ===tree view contro
udm/udm === up-down controm
wm === general
……
tcm/tcn === tab control
{
Clipboard Messages Clipboard Notifications Common Dialog Box
Notifications Cursor Notifications Data Copy Message Desktop Window
Manager Messages Device Management Messages Dialog Box Notifications
Dynamic Data Exchange Messages Dynamic Data Exchange Notifications Hook
Notifications Keyboard Accelerator Messages Keyboard Accelerator
Notifications Keyboard Input Messages Keyboard Input Notifications Menu
Notifications Mouse Input Notifications Multiple Document Interface
Messages Raw Input Notifications Scroll Bar Notifications Timer
Notifications Window Messages Window Notifications
}

或许上,windows新闻覆盖了一个相比宽的限制,富含鼠标键盘,菜单,对话框输入,窗口成立管理,DDE动态数据沟通

应用程序定义的音信
应用程序能够创设新闻,其自身窗口能够利用,也能够用于和其余进度张开交互作用。

音信标识符的值应用如下:
1.系统一保险留了0x0000-0x03ff(即wm_user-1),应用程序不可能运用那一个值用于个人音讯
2.0×0400(WM_USE巴博斯 CL级)-0x7fff能够用来个人音信
3.假如应用程序在4.0系统上,你能够选拔0x8000(wm_app)-0xbfff于个人音讯
4.RegisterWindowMessage重返的值在0XC000-0XFFFF之间。那么些函数的再次来到值,可防止止别的进度用相仿值而孳生的冲突

新闻路由
利用使用二种格局来窗口进程音讯的门道:post类音讯是通过先进先出的消息队列形式,信息队列是一时半刻存款和储蓄音信的系统定义内部存储器对象,以至sending类消息一向达到窗口进度。

队列音讯1
系统在同时能够显得大肆数量的窗口。为了路由鼠标键盘输入到准确的窗口,系统接受了音信队列。

系统敬服了二个系统音信队列,并为各类GUI线程维护了而八个线程专有音信队列。为了幸免为非GUI线程过多创制音讯队列,全部线程在创制时未有消息队列。系统仅仅在线程第二回发起有些特地顾客函数时,成立线程音讯队列;没有GUI函数调用将引起音信队列的创设。

未懂:
The system creates a thread-specific message queue only when the thread
makes its first call to one of the specific user functions; no GUI
function calls result in the creation of a message queue.

队列新闻2
别的时候,客商移动鼠标,点击按键或许敲击键盘,鼠标或然键盘驱动将转移那一个输入为消息,并将它们放到系统消息队列中。系统在检查实验它们的目窗口时,相同的时间从系统音讯队列中移除它们。然后将他们发送到音信相关窗口的窗口创造线程。线程从它们的新闻队列中收受全部鼠标和键盘新闻。线程从它们的队列中除去音信,并辅导系统将它们发送到正确的窗口进程进展管理。

除了WM_PATIN,WM_TIMER,WM_QUIT新闻外,系统直接将它们发送到新闻队列的尾声,以保障输入消息的FIFO种类,仅当消息对用中并未其余信息随后,WM_PATIN,WM_TIMER,WM_QUIT才被向前推至窗口管理进程。再不怕,八个WM_PAINT音信将被合併为一个,显明全体顾客端无效区域到二个单独的区域。归总WM_PATINT正是为着减小窗口冲回客商区内容的次数。

从新闻队列中删去七个新闻后,应用程序将用DispatchMessage函数direct系统一发布送这些新闻到窗口管理进程以紧密处理。DispatchMessage未有发送音讯地方和时间到窗口进度,应用程序能够经过GetmessageTime和GetMessagePos函数。

当音信队列中从不音信的时候,线程能够动用WaitMessage函数来将调控器交给其余线程,那个函数暂停线程,知道三个新音讯赶到,该函数才回来。

你也能够调用SetMessageExtraInfo来为日前音信队列附加一个值,通过GetMessageExtraInfo来获取这些值。

非队列音讯
绕过了系统和线程新闻队列,非队列音信一贯发送至窗口进度。系统独立发送非队列音信来布告一个窗口,一个平地风波影响了它。比方,当客户激活贰个新窗口,系统一发布送给窗口
WM_ACTIVATE, WM_SETFOCUS, and
WM_SETCU奇骏SO奥迪Q5消息。这个音信通知窗口它已经被激活了,键盘输入正指向该窗口,鼠标光标已经移至了窗口边框内。当应用程序调用有个别系统函数时,也会窗口非队列音信,比如,应用程序在调用SetWindowPos时,系统将发送WM_WINDOWPOSCHANGED消息。

有些音信发送非队列音信:BroadcastSystemMessage,
布罗兹castSystemMessageEx, SendMessage, SendMessageTimeout, and
SendNotifyMessage.

消息管理
七十八线程应用程序,会在各样创设了窗口的线程包罗贰个消息队列。

MSG msg;
BOOL bRet;

while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0)
{
if (bRet == -1)
{
// handle the error and possibly exit
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
一个应用程序能够因此调用PostQuitMessage来结束其本人的音讯循环,响应应用程序主窗口的WM_DESTROY讯息,就相比较独立。

PostMessage发送二个NULL窗口句柄的消息,该新闻将会被放在日前线程音讯队列中,应用程序必得管理这一个新闻。PostMessage也得以透过HWND_TOPMOST
句柄来给全数顶层窗口发送新闻。

PostMessage一直能够成功发送音信,常常是一个不当的只要,比方新闻队列是满的。三个应用程序应该核算PostMessage的重临值。要是失败了,需求再一次发送新闻。

SendMessage平日顾客老爹和儿子窗口之间的竞相。

SendMessageCallback函数发送二个音信,并顿时回去,窗口进程在拍卖完那几个信息后,系统将调用钦点的回调函数。该回调函数的维妙维肖,请看SendAsyncProc

突发性,你只怕想向全数顶层窗口发送新闻。比如,应用程序改造了光阴,能够经过SendMessage,并创立HWND_TOPMOST,发送WM_TIMECHANGE.你也足以经过BroadcastSystemMessage函数,并给lpdwRecipients参数制订BSN_APPLICATIONS

音讯死锁
1.SendMessage会等候窗口进度管理完成后才回到,假诺窗口进程那个时候所在线程振作感奋调控权扬弃,那么僵早上死锁。
2.假使接到线程附加到了和发送线程同一个音信队列,也将诱致应用程序死锁的发送

注意,正在选择音信的线程,不应当彰显丢掉调节权;调用上边函数将引起线程隐秘扬弃调控权。
DialogBox
?DialogBoxIndirect
?DialogBoxIndirectParam
?DialogBoxParam
?GetMessage
?MessageBox
?PeekMessage
?SendMessage

hang的缘由解析,Windows音讯机制。为了防止地下死锁,思量使用SendNotifyMessage或许SendMessageTimeout。要不然,窗口进程可以经过InSendMessage也许InSendMessageEx质量评定其摄取到的音讯是不是来自其余线程.在管理叁个新闻时,在调用下边列表中任何函数前,窗口进度应该调用InSendMessage(Ex).如若回去TRUE,窗口进度必需在yeild前,调用ReplyMessage函数。

系统广播音信-略

总结:
1.音讯分为系统定义新闻和客商自定义新闻,其ID值都有和好的界定。
2.各类线程暗许是不曾新闻队列的,线程只有在第二遍调用顾客接口时(例如创造窗口卡塔尔,系统才为其创造音信队列。
3.系统本身保险多少个类别音讯队列,然后还为每一个GUI线程线程维护贰个线程特地消息队列。
4.鼠标、键盘等驱动,首先将事件调换为新闻放置在系统消息队列中,然后系统又经过窗口来分明将其放入到哪些线程音信队列中。
5.线程音信循环收取音讯,进行拍卖,将音信再派发给系统,系统调用音信对应的窗口进度。
6.PostMessage不一定成功,举个例子队列是满的。
7.防止消息死锁,比方收受消息的窗口进程,在弃权前,要求检查测试音讯是或不是发自此外线程。不然别的线程将长日子等待。其实本身深感这里无法成为死锁嘛,终归依旧恐怕再施行的,只是时长而已。
8.内需专心wm_paint,wm_timer,wm_quit等特殊信息
9.系统预定义新闻其实大都以这三个控件新闻,公告音讯,系统广播消息等等。

当在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):注意那类新闻通称为WM_COMMAND
与拍卖客户央浼有关, 如单击菜单项或工具栏或控件时, 就能够生出命令新闻。
WM_COMMAND, LOWO奥迪Q3D(wParam)表示菜单项,工具栏开关或控件的ID。借使是控件,
HIWO安德拉D(wParam)表示控件消息类型
3> 控件公告(Notify Message) 
控件布告音信, 那是最灵敏的新闻格式, 其Message, wParam,
lParam分别为:WM_NOTIFY,
控件ID,指向NMHD逍客的指针。NMHD本田UR-V饱含控件公告的剧情, 能够任性增加。
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

home88一必发 1typedef struct tagMsg
home88一必发 2{
home88一必发 3       HWND    hwnd;       //接受该新闻的窗口句柄
home88一必发 4       UINT    message;    //新闻常量标记符,也等于大家日常所说的新闻号
home88一必发 5       WPARAM  wParam;     //33个人音信的特定附加新闻,确切含义信任于新闻值
home88一必发 6       LPARAM  lParam;     //叁12人音信的一定附加音讯,确切含义注重于新闻值
home88一必发 7       DWO大切诺基D   time;       //新闻成立时的年华
home88一必发 8       POINT   pt;         //音讯创建时的鼠标/光标在显示屏坐标系中的地点
home88一必发 9}MSG;
home88一必发 10

音信相关函数:

DispatchMessage

LONG DispatchMessage(
const MSG* lpmsg
);
1.该函数将新闻,通过系统派发给窗口进程
2.万一是二个机械漏刻音信,lParam参数不是空,

 

3 新闻队列(Message Queues) 
Windows中有三种档案的次序的音信队列
1) 系统消息队列(System Message Queue) 那是一个系统唯风度翩翩的Queue,设备驱动(mouse,
keyboard)会把操作输入转形成音讯存在系统队列中,然后系统会把此音讯放到目标窗口所在的线程的新闻队列(thread-specific
message queue)中等待管理
2) 线程音信队列(Thread-specific Message Queue) 每叁个GUI线程都会敬性格很顽强在荆棘满途或巨大压力面前不屈这么叁个线程音讯队列。(这几个队列独有在线程调用GDI函数时才会创制,暗许不创设)。然后线程音讯队列中的音信会被送到相应的窗口进程(WndProc)管理.
瞩目:
线程消息队列中WM_PAINT,WM_TIMEWrangler唯有在Queue中平素不此外新闻的时候才会被管理,WM_PAINT音信还恐怕会被联合以升高作用。其余具备新闻以先进先出(FIFO卡塔 尔(英语:State of Qatar)的主意被拍卖。

   
音讯能够由系统大概应用程序暴发。系统在发生输入事件时发出消息。比如,
当客户敲键,
移动鼠标大概单击控件。系统也时有爆发音讯以响应由应用程序带来的变型,
举例应用程序改造系统字体制改善变窗体大小。应用程序能够生出音讯使窗体实践义务,只怕与任何应用程序中的窗口通信。

lParam指向二个函数地址,被调用的将是其黄金年代函数,而非窗口进度

GetMessage
应用程序使用该函数再次回到值来调控是不是终止音信循环,并退出程序。

2. 重现步骤

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

音信中有啥?
   大家提交了上边的讲明,是或不是会对音信结构有了三个相比较清楚的认识?就算还不曾,那么大家再试着提交上边包车型大巴表达:
     hwnd
三11个人的窗口句柄。窗口能够是别的项指标荧屏对象,因为Win32可以看到尊崇大好些个可视对象的句柄(窗口、对话框、开关、编辑框等)。
    
message用于区分其他音讯的常量值,这一个常量能够是Windows单元中预约义的常量,也足以是自定义的常量。音讯标志符以常量命名的主意提议信息的意思。当窗口进度选择到音信随后,他就能够利用消息标志符来决定如哪里理新闻。举例、WM_PAINT告诉窗口进度窗体客商区被转移了特殊须求重绘。符号常量钦点系统音信归属的品种,其前缀指明了处了解释新闻的窗体的档案的次序。
     wParam 平日是多少个与新闻有关的常量值,也恐怕是窗口或控件的句柄。
     lParam
经常是三个对准内部存款和储蓄器中数据的指针。由于WParam、lParam和Pointer都是三十六个人的,由此,它们中间能够互相调换。

该函数将获取和hWnd大概其子窗口相关的新闻。

DWORD GetMessagePos(void);

复发景况:XP sp3 / Office 二〇〇五(其余office版本应该也足以,未有测验卡塔尔国

5 PostMessage(PostThreadMessage), SendMessage 
PostMessage:把新闻放到钦命窗口所在的线程信息队列中后即时赶回。
PostThreadMessage:把消息放到钦定线程的消息队列中后马上回到。
SendMessage:直接把音信送到窗口进度管理,管理完了才再次回到。

音讯标记符的值
    
系统一保险留新闻标志符的值在0x0000在0x03ff(WM_USEENCORE-1)范围。这几个值被系统定义新闻使用。应用程序不能够动用那一个值给和煦的音讯。应用程序音讯从WM_USER(0X0400)到0X7FFF,或0XC000到0XFFFF;WM_USEKuga到
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    应用程序自定义私有新闻

该函数再次回到新闻x,y坐标,在多种monitor下,恐怕有负值。

GetMessageQueueReadyTimeStamp

6 GetMessage, PeekMessage 
PeekMessage会马上回到能够保留音讯
GetMessage在有音讯时再次回到会去除消息

新闻有哪二种?
   其实,windows中的新闻即便非常多,不过项目并不散乱,大要上有3种:窗口新闻、命令音讯和控件文告音信。
    
窗口音信大约是系统中可是遍布的音讯,它是指由操作系统和调整其余窗口的窗口所接收的新闻。比如CreateWindow、DestroyWindow和MoveWindow等都会激励窗口音信,还会有我们在上头聊到的单击鼠标所发出的音讯也是黄金年代种窗口新闻。
    
命令音信,那是风度翩翩种特别的窗口语资源音讯息,他用来管理从三个窗口发送到另四个窗口的客户央浼,比方按下三个按键,他就能够向主窗口发送八个指令新闻。
    
控件布告新闻,是指那样大器晚成种消息,叁个窗口内的子控件发生了生龙活虎部分政工,须要布告父窗口。通告音信只适用夏梅规的窗口控件如开关、列表框、组合框、编辑框,以致Windows公共控件如树状视图、列表视图等。举例,单击或双击一个控件、在控件中甄选一些文书、操作控件的滚动条都会生出布告音信。她好像于命令消息,当客商与控件窗口交互时,那么控件布告新闻就能从控件窗口发送到它的主窗口。但是这种消息的存在并非为着管理客户命令,而是为了让主窗口可以改造控件,举个例子加载、展现数据。比如按下贰个开关,他向父窗口发送的新闻也可以用作是三个控件布告音信;单击鼠标所发生的音讯能够由主窗口一贯管理,然后交给控件窗口管理。
   
个中窗口音信及控件通告新闻至关心珍视要由窗口类即直接或直接由CWND类派生类处理。相对窗口音信及控件布告消息来讲,命令讯息的拍卖对象节制就广得多,它不仅可以够由窗口类处理,还能由文书档案类,文书档案模板类及运用类所管理。
   
由于控件通告音信很入眼的,大家用的也正如多,不过具体的含义往往令初大方蒙头转向,所以自个儿说了算把分布的多少个列出来供大家参谋:
按扭控件
BN_CLICKED        客商单击了开关
 BN_DISABLE 开关被明令抑制
 BN_DOUBLECLICKED  顾客双击了按键
 BN_HILITE  用/户加亮了开关
 BN_PAINT  开关应当重画
 BN_UNHILITE 加亮应当去掉

获得线程近日壹次计划管理一个音讯的系统时间(GetTickCount卡塔尔国

GetMessageSource
MSGSRC_SOFTWARE_POST表面键盘消息来自software(postmessage标志为software卡塔尔国.
MSGSRC_HARDWARE_KEYBOA凯雷德D 表面音讯来自keyboard. MSGSRC_UNKNOWN

1> 解压iqy_test.zip

7 TranslateMessage, TranslateAccelerator 
TranslateMessage: 把叁个virtual-key新闻转变成字符新闻(character
message),并放置当前线程的音讯队列中,新闻循环下二遍抽出管理。
TranslateAccelerator:将快捷键对应到对应的美食做法命令。它会把WM_KEYDOWN 或
WM_SYSKEYDOWN转产生快速键表中相应的WM_COMMAND或WM_SYSCOMMAND音讯,
然后把转变后的 WM_COMMAND或WM_SYSCOMMAND直接发送到窗口进度管理,
管理完后才会回去。

组合框控件
 CBN_CLOSEUP 组合框的列表框被关闭
 CBN_DBLCLK 客商双击了多少个字符串
 CBN_DROPDOWN 组合框的列表框被拉出
 CBN_EDITCHANGE 客户更正了编辑框中的文本
 CBN_EDITUPDATE 编辑框内的公文将在履新
 CBN_ECR-V凯雷德SPACE 组合框内部存款和储蓄器不足
 CBN_KILLFOCUS 组合框失去输入焦点
 CBN_SELCHANGE 在组合框中选拔了朝气蓬勃项
 CBN_SELENDCANCEL 顾客的精选相应被撤消
 CBN_SELENDOK 顾客的抉择是法定的
 CBN_SETFOCUS 组合框获得输入大旨

音讯来源未知

DWORD GetQueueStatus(
UINT flags
);
在新闻队列中的音讯的种类
flags为要检查测验的新闻类型。

2> 运行http_server.py(需先安装python卡塔尔国

8(音讯死锁( Message Deadlocks) 
假若有线程A和B, 今后有以下下步骤
1) 线程A SendMessage给线程B, A等待音讯在线程B中拍卖后重返
2) 线程B收到了线程A发来的音讯,并进行拍卖, 在管理进度中,B也向线程A
SendMessgae,然后等待从A再次回到。
因为这时候, 线程A正等待从线程B重回, 无法管理B发来的新闻,
进而引致了/线程A,B相互等待, 产生死锁。多少个线程也能够产生环形死锁。
能够使用 SendNotifyMessage或SendMessageTimeout来制止现身死锁。

编辑框控件
 EN_CHANGE 编辑框中的文本己更新
 EN_E途胜SportageSPACE 编辑框内部存款和储蓄器不足
 EN_HSCROLL 客户点击了档期的顺序滚动条
 EN_KILLFOCUS 编辑框正在失去输入主题
 EN_hang的缘由解析,Windows音讯机制。MAXTEXT 插入的原委被截断
 EN_SETFOCUS 编辑框得到输入大旨
 EN_UPDATE 编辑框中的文本就要更新
 EN_VSCROLL 客户点击了僵直滚动条音讯含义

重回值得高字节表示方今在音讯队列中的音讯类型。低字节表示从上次GetQueueStatus,GetMessage或然PeekMessage后被投入队列的音信类型。

InSendMessage

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

9 BroadcastSystemMessage 
大家常常所接触到的音讯都以发送给窗口的,其实,
音讯的收信人可以是琳琅满指标,它能够是应用程序(applications),
可设置驱动(installable drivers),网络设施(network drivers),
系统级设备驱动(system-level device drivers)等, 
布罗兹castSystemMessage这一个API能够对上述系统组件发送音信。

列表框控件
 LBN_DBLCLK 顾客双击了后生可畏项
 LBN_ERubicon福特ExplorerSPACE 列表框内部存款和储蓄器非常不足
 LBN_KILLFOCUS 列表框正在失去输入大旨
 LBN_SELCANCEL 选取被废除
 LBN_SELCHANGE 选用了另大器晚成项
 LBN_SETFOCUS 列表框得到输入大旨

用以判定当前窗口进度所拍卖的消息,是还是不是来自其余线程的SendMessage调用。

PeekMessage
1.该函数核查线程新闻队列中是还是不是有新闻,并将音讯放在参数结构体中
2.大器晚成旦hWnd参数=-1,则只回去hWnd=NULL的新闻,这种消息来源PostThreadMessage
3.参数wRemoveMsg须要小心

shell_execute.exe的主要code:

队列音信和非队列音信
   从音讯的发送门路来看,音讯可以分成2种:队列音讯和非队列音信。新闻队列由得以分成种类音信队列和线程新闻队列。系统音信队列由Windows维护,线程音讯队列则由各样GUI线程自个儿进行维护,为幸免给non-GUI现存创立音信队列,全部线程发生时并不曾音讯队列,仅当线程第贰次调用GDI函数时系统才给线程创造一个消息队列。队列新闻送到系统音讯队列,然后到线程音讯队列;非队列音讯直接送给目标窗口进程。
    
对于队列音信,最习见的是鼠标和键盘触发的新闻,譬喻WM_MOUSERMOVE,WM_CHAXC90等音信,还会有一点点任何的新闻,举例:WM_PAINT、
WM_TIMER和WM_QUIT。当鼠标、键盘事件被触发后,相应的鼠标或键盘驱动程序就能够把这几个事件调换到相应的新闻,然后输送到系统音信队列,由
Windows系统去进行拍卖。Windows系统则在适当的时机,从系统信息队列中抽取叁个新闻,依据前边大家所说的MSG音信结构分明新闻是要被送往特别窗口,然后把抽取的新闻送往成立窗口的线程的应和队列,上面的业务就该由线程音信队列操心了,Windows伊始忙本身的事务去了。线程看见自身的音信队列中有音信,就从队列中抽出来,通过操作系统一发布送到合适的窗口进度去管理。
    
日常来说,系统连接将新闻Post在音信队列的尾声。那样保障窗口以先进先出的逐风度翩翩选择新闻。但是,WM_PAINT是三个不及,同三个窗口的七个WM_PAINT被统百分之十贰个 WM_PAINT 音信,
合并全数的失效区域到三个不行区域。归总WM_PAIN的指标是为了减小刷新窗口的次数。
home88一必发 11

4.万一应用程序正在创设顶层窗口时调用PeekMessage,将形成窗口窗口被创建在Z-Order的末段。你供给在PeekMessage后,显式调用SetForegroundWindow。如果应用程序以致有贰个停放窗口了,那么新窗口将被放置。

PostMessage
应用程序要用HWND_BROADCAST举路程序间的并行,信息应该得到于RegisterWindowMessage()

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 %p\n", shell_exec_info.hProcess);

    return ret;
}

home88一必发 12
   
非队列音信将会绕过系统队列和音信队列,间接将新闻发送到窗口进度,。系统一发布送非队列音信通告窗口,系统一发布送音信公告窗口。举例,当客商激活叁个窗口系统一发布送WM_ACTIVATE,
WM_SETFOCUS, and
WM_SETCU君越SO帕杰罗。这么些音讯布告窗口它被激活了。非队列音信也能够由当应用程序调用系统函数发生。举例,当程序调用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),该函数把一条音信放置到开创hWnd窗口的线程的新闻队列中,该函数不等音信被拍卖就应声将决定重返。要求介怀的是,假诺hWnd参数为
HWND_BROADCAST,那么,音讯将被寄送给系统中的全部的重叠窗口和弹出窗口,可是子窗口不会接纳该音讯;假若hWnd参数为NULL,则该函数形似于将dwThreadID参数设置成当下线程的标识来调用PostThreadMEssage函数。
  从地点的那2个具有代表性的函数,我们可以见见音讯的出殡方式和寄送情势的界别所在:被发送的音信是或不是会被当下处理,函数是或不是及时回去。被发送的音信会被及时管理,管理达成后函数才会回到;被寄送的新闻不会被立时管理,他被平放二个先进先出的行列中,一向等到应用程序空线的时候才会被拍卖,然而函数放置新闻后立马回到。
home88一必发 13
  实际上,发送音讯到贰个窗口管理进度和直接调用窗口管理进度之间并未太大的界别,他们直白的天下无双差距就在于你能够必要操作系统截获全数被发送的音信,可是无法收获对窗口处理进度的第一手调用。
  以寄送点子发送的音讯平时是与客商输入事件相对应的,因为那个事件不是十三分心如火焚,可以拓宽缓慢的缓冲管理,比如鼠标、键盘新闻会被寄送,而开关等消息则会被发送。
  广播音信用得比较少,布罗兹castSystemMessage函数原型如下:
      long 布罗兹castSystemMessage(DWO昂科拉D dwFlags,LPDWO逍客D
lpdwRecipients,UINT uiMessage,WPARAM wParam,LPARAM
lParam);该函数能够向钦命的接纳者发送一条信息,这几个选用者能够是应用程序、可安装的驱动程序、网络驱动程序、系统级其余设施驱动音讯和她们的自便组合。要求小心的是,假如dwFlags参数是BSF_QUEEnclaveY况兼起码叁个选用者重返了BROADCAST_QUERY_DENY,则再次回到值为0,若无一点名BSF_QUEEnclaveY,则函数将新闻发送给全部选择者,並且忽视其重临值。

假定发送信息低于WM_USESportage范围,到异步新闻队列函数(PostMessage、SendNotifyMessage卡塔尔国,音信参数不应有包蕴指针,不然的话,操作将失败。该函数将要接纳线程有空子管理该新闻前回到,发送者将释放刚刚用到的内部存款和储蓄器。

PostQuitMessage

 

音信的选择
 新闻的收受首要有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=-1,那么函数只回去把hWnd参数为NULL的PostAppMessage函数送去的新闻。假诺wMsgFilterMin和wMsgFilter马克斯都以0,则PeekMessage就赶回全数可获取的音讯。函数获取之后将视最终一个参数来决定是或不是删除消息队列中的除
WM_PAINT新闻之外的别的音讯,至于WM_PAINT则唯有在其管理以往才被剔除。
   WaitMessage原型如下:BOOL
WaitMessage();当叁个应用程序无事可做时,该函数就将调控权交给其余的应用程序,同一时候将该应用程序挂起,直到三个新的消息被放入应用程序的行列之中才回来。

该函数只是轻便评释被倡议终止的线程将会终止。接纳WM_QUIT的线程,应该告大器晚成段落新闻循环,并将调节权交给系统。重临给系统的退出值,一定是WM_QUIT的wParam参数

BOOL PostThreadMessage(
DWORD idThread,
UINT Msg,
WPARAM wParam,
LPARAM lParam
);

收到音讯的线程,通过GetMessage/PeekMessage来获取音讯,hWnd成员将会是空


RegisterWindowMessage
同一字符串,注册的值,在整整种类中是唯生龙活虎的


SendMessage

3. 缘由解析

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

非音讯队列方式,间接调用窗口进程,系统当下切换来选取线程试行,发送线程锁住,知道选取线程管理实现

SendMessageTimeout

3.1 excel hang在哪里?

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

该函数通过调用窗口进程的措施发送新闻,若是窗口归于分歧线程,SendMessageTimerout将明了新闻管理落成才回来只怕钦定的逾期已经过去,若是窗口就在当时此刻线程,则直接调用窗口进度,并忽视time-out超时

SendNotifyMessage
倘诺窗口成立于归于发送新闻的线程,则调用窗口进度,并听候窗口进度管理完成该新闻。即使是分裂线程,则将信息传递到窗口进程,并及时回去,不等待窗口进度的音信管理进程。


TranslateMessage
1.将设想键音讯转变为字符音讯,然后将字符音讯发送到调用线程的新闻队列中,该字符音信将要下一次调用GetMessage也许PeekMessage新闻的时候取获得。
2.WM_(SYS)KEYDOWN/UP—>WM_(SYS)_CHAR
3.比如应用程序为了其余指标,管理虚构键音讯,那么就不应当调用TranslateMessage.与三个实例,应用程序不该在TranslateAccelerator函数再次回到非0值时调用TranslateMessage

关于新闻和音信队列
不像基于MS-DOS的应用程序,基于Windows的次序是事件驱动的。他们不做其它展现调…

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

 

home88一必发 22

  
首先,GetMessage从进程的主线程的消息队列中获取二个新闻并将它复制到MSG结构,借使队列中一直不新闻,则GetMessage函数将等待多个消息的赶到现在才再次回到。假使你将八个窗口句柄作为第三个参数字传送入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()来发送音信的。

home88一必发 23if (::PeekMessage(&msg, m_hWnd, WM_KEYFIRST,WM_KEYLAST, PM_REMOVE))
home88一必发 24{
home88一必发 25          if (msg.message == WM_KEYDOWN && msg.wParam == VK_ESCAPE)...
home88一必发 26}
home88一必发 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

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

经过能够疑心是由于console进程在和excel用DDE新闻通讯时,console未有响应excel发送的DDE音讯,引致excel
hang住

 

 

音信分流器
  平日的窗口进度是由此三个switch语句来落成的,这么些业务很烦,有未有更方便的办法吧?有,那正是消息分流器,利用消息分流器,大家可以把switch语句分成更加小的函数,每叁个音讯都对应四个小函数,这样做的裨益就是对消息更便于管理。
  之所以被称为音信分流器,正是因为它能够对其他音信实行分流。上边大家做三个函数就很清楚了:

3.2 为了验证3.1.1的估计,用API Monitor一下ShellExecuteEx

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

3.2.1
依据微软的文书档案可以看见,发送DDE音信除了WM_DDE_INITIATE和WM_DDE_ACK之外用的都以PostMessage

接下来我们改善一下窗口进程:

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

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

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

home88一必发 102

home88一必发 103   #define HANDLE_MSG(hwnd,msg,fn) \
home88一必发 104             switch(msg): return HANDLE_##msg((hwnd),(wParam),(lParam),(fn));

call stack呈现实乃ShellExecuteEx所调用

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

home88一必发 105

home88一必发 106   #define HANDLE_WM_COMMAND(hwnd,wParam,lParam,fn)\ 
home88一必发 107             ((fn)((hwnd),(int)(LOWORD(wParam)),(HWND)(lParam),(UINT)HIWORD(wParam)),0L);

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

好了,事情到了这一步,应该全套都晴朗了。
只是,我们发以往windowsx.h里面还会有八个宏:FORWAQashqaiD_WM_XXXX,大家照旧那WM_COMMAND为例,举办分析:

瞩目到下二个API GetWindowThreadProcessId ( 0x00310172 , 0x0012fb70
),恰恰是获取这几个窗口的pid和tid,查看下参数窗口:

home88一必发 108   #define FORWARD_WM_COMMAND(hwnd, id, hwndCtl, codeNotify, fn) \
home88一必发 109     (void)(fn)((hwnd), WM_COMMAND, MAKEWPARAM((UINT)(id),(UINT)(codeNotify)), (LPARAM)(HWND)(hwndCtl))

本条窗口所属的进程PID =
0xc54,正巧是excel的进度,表明ShellExecuteEx确实发送了DDE音信给excel,并且可执发送的新闻的thread就是主线程

所以其实,FO中华VWAPRADOD_WM_XXXX将新闻参数进行了再一次布局,生成了wParam &&
lParam,然后调用了笔者们定义的函数。

home88一必发 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语句。

home88一必发 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暗中认可对象;在新的非暗许对象中或在或者要传播命令的通令目的中。

home88一必发 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列表框中冒出了,假诺还一向不,那就随时往下看:)

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) 最后,在该文件中增多音信管理函数的实体。

home88一必发 113

 

查阅一下buff之处:

 

home88一必发 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为每一个应用程序(确切地说是每叁个线程)维护了对应的新闻队列,应用程序的天职正是不停的从它的音信队列中获得音信,解析消息和拍卖消息,直到一条吸取名称为WM_QUIT消息停止,这一个历程日常是由意气风发种叫做音信循环的程序结构来落到实处的。

5. 为啥win7上不会有那样的标题

  音讯笔者是当作二个记录传递给应用程序的,那几个记录中包括了音信的花色以至任何消息。例如,对于单击鼠标所发生的音讯的话,那些记录中带有了单击鼠标时的坐标。那么些记录类型叫做T
M s g,它在Wi n d o w s单元中是那般注脚的:

5.1 在API Monitor中看下PostMessageW

type

home88一必发 115

TMsg = packedrecord

专心到win7下PostMessageW是用的线程2调用的,搜一下线程创立API
CreateThread

hwnd: HWND / /窗口句柄

home88一必发 116

message: UINT / /音信常量标志符

可见是ShellExecuteEx内部成立的线程,所以win7上ShellExecuteEx成立了四个线程特地用来处理和excel的DDE信息通信,这样就能够不奇怪的收取管理excel发过来的WM_DDE_INITIATE消息了

wParam: WPA Lacrosse AM  // 叁十二位音讯的特定附加音信

lParam: LPA 路虎极光 AM  // 32个人新闻的特定附加音信

time: DWO奥迪Q5D / /音讯创立时的日子

pt: TPoint / /音信创制时的鼠标地点

end

 

消息中有啥?

是还是不是感到叁个音讯记录中的信息像法语相通?假使是如此,那么看风流倜傥看上边包车型大巴解说:

hwnd
39位的窗口句柄。窗口能够是其余项目标荧屏对象,因为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_QUE奇骏YENDSESSION音讯后,此音讯发送给应用程序,

布告它对话是或不是得了

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

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

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_WANTKEYBOAGL450DINPUT风格的发生给它的全数者来响应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或光标

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或小图标与有个别窗口关联;

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_TIMEQashqai = 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哈弗D函数时 发送此音信给剪贴板的持有者

WM_DRAWCLIPBOARD =776

当剪贴板的开始和结果改动时发送此新闻给剪贴板旁观链的首先个窗口;它同意用剪贴板观望窗口来

展现剪贴板的新剧情;

WM_PAINTCLIPBOARD =777

当剪贴板包括CF_OWNEXC60DIPLAY格式的数额同临时间剪贴板观看窗口的客商区须求重画;

WM_VSCROLLCLIPBOARD= 778

WM_SIZECLIPBOARD =779

当剪贴板富含CF_OWNE奥迪Q3DIPLAY格式的数目同临时间剪贴板观察窗口的客商区域的大小已经改造是此音信通过剪贴板观望窗口发送给剪贴板的全体者;

WM_ASKCBFORMATNAME= 780

经过剪贴板观察窗口发送此音讯给剪贴板的持有者来倡议贰个CF_OWNE福睿斯DISPLAY格式的剪贴板的名字

WM_CHANGECBCHAIN =781

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

WM_HSCROLLCLIPBOARD= 782

此音信通过三个剪贴板观看窗口发送给剪贴板的持有者;它发出在当剪贴板包涵CFOWNEENVISIONDISPALY格式的数量同偶然候有个事件在剪贴板观望窗的品位滚动条上;全部者应滚动剪贴板图象并立异滚动条的值;

WM_QUERYNEWPALETTE= 783

此新闻发送给就要收到主旨的窗口,此新闻能使窗口在收到主题时同期有空子完结他的逻辑调色板

WM_PALETTEISCHANGING=784

当多个应用程序正要达成它的逻辑调色板时发此音讯布告全数的应用程序

WM_PALETTECHANGED =785

此音信在一个兼有主旨的窗口完毕它的逻辑调色板后发送此音讯给具备一级并交汇的窗口,以此

来改变系统调色板

WM_HOTKEY = 786

当客商按下由REGISTE传祺HOTKEY函数注册的热键时交因此音信

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)是指那样后生可畏种音信,多少个窗口内的子控件发生了有个别作业,必要通

知父窗口。通告新闻只适用刘恒规的窗口控件如按键、列表框、组合框、编辑框,以致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 奥迪Q5 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 Evoque 奇骏 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 路虎极光 Escort S PA CE编辑框内部存款和储蓄器不足

E N _ H S C CR-V 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客户双击了生机勃勃项

L B N _ E 迈凯伦540C PRADO 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列表框获得输入宗旨

 

转载:

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图