系统为应用程序传递所有输入到程序中的不同窗口,每个窗口会有一个称为窗口过程的回调函数(WndProc)

但直接双击”test.iqy”是没有问题的,console退出后excel才会响应,当窗口收到消息时系统就会调用此窗口过程来处理消息,每个窗口会有一个称为窗口过程的回调函数(WndProc),这个记录中包含了消息的类型以及其他信息,消息本身是作为一个记录传递给应用程序的,系统为应用程序传递所有输入到程序中的不同窗口,系统将会认为该窗口为非响应状态,消息范围,系统消息

图片 116

1. 问题

1. 窗口进程 
每种窗口会有四个叫做窗口进程的回调函数(WndProc),它含有四个参数,分别为:窗口句柄(Window
Handle),音信ID(Message ID),和五个信息参数(wParam,
lParam),当窗口收到消息时系统就能够调用此窗口进程来处理音信。(所以叫回调函数卡塔 尔(阿拉伯语:قطر‎

新闻是指什么?
    
新闻系统对于二个win32顺序来讲特别首要,它是多个程序运营的重力来源。三个音信,是系统定义的三个叁12位的值,他唯意气风发的定义了多少个事件,向
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
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昂Cora)-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未有发送新闻地点和岁月到窗口进度,应用程序能够由此Getmessage提姆e和GetMessagePos函数。

当新闻队列中未有音讯的时候,线程能够应用WaitMessage函数来将调节器交给其余线程,这么些函数暂停线程,知道五个新新闻赶到,该函数才回到。

您也足以调用SetMessageExtraInfo来为当下音讯队列附加三个值,通过GetMessageExtraInfo来获取那个值。

非队列音讯
绕过了系统和线程音信队列,非队列音信直接发送至窗口进程。系统非凡发送非队列音信来打招呼三个窗口,八个风波影响了它。比方,当客商激活叁个新窗口,系统一发布送给窗口
WM_ACTIVATE, WM_SETFOCUS, and
WM_SETCUWranglerSO奥迪Q7音信。这几个音讯公告窗口它早就被激活了,键盘输入正指向该窗口,鼠标光标已经移至了窗口边框内。当应用程序调用有个别系统函数时,也会窗口非队列音信,举例,应用程序在调用SetWindowPos时,系统将发送WM_WINDOWPOSCHANGED消息。

稍Wechat息发送非队列消息:布罗兹castSystemMessage,
BroadcastSystemMessageEx, 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.你也得以通过布罗兹castSystemMessage函数,并给lpdwRecipients参数制订BSN_APPLICATIONS

音信死锁
1.SendMessage会守候窗口进度处理达成后才回去,假使窗口进程当时所在线程奋发调整权扬弃,那么僵中午死锁。
2.只要接到线程附加到了和发送线程同二个音信队列,也将以致应用程序死锁的发送

留神,正在选用消息的线程,不应该展现放弃调节权;调用下边函数将引起线程隐秘遗弃调节权。
DialogBox
?DialogBoxIndirect
?DialogBoxIndirectParam
?DialogBoxParam
?GetMessage
?MessageBox
?PeekMessage
?SendMessage

为了幸免地下死锁,思虑使用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.种类预订义音信其实大都以那多少个控件音信,文告音信,系统广播音讯等等。

表A-1  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):注意那类新闻通称为WM_COMMAND
与拍卖客商诉求有关, 如单击菜单项或工具栏或控件时, 就能发生命令音信。
WM_COMMAND, LOWO科雷傲D(wParam)表示菜单项,工具栏开关或控件的ID。假设是控件,
HIWO本田UR-VD(wParam)表示控件新闻类型
3> 控件布告(Notify Message) 
控件布告音讯, 那是最灵敏的消息格式, 其Message, wParam,
lParam分别为:WM_NOTIFY,
控件ID,指向NMHD福睿斯的指针。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;     //三拾四位新闻的特定附加消息,确切含义信任于音信值
图片 6       LPARAM  lParam;     //叁十三个人新闻的一定附加音讯,确切含义信任于新闻值
图片 7       DWORubiconD   time;       //消息创立时的光阴
图片 8       POINT   pt;         //音信成立时的鼠标/光标在荧屏坐标系中之处
图片 9}MSG;
图片 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_TIME牧马人独有在Queue中绝非别的音信的时候才会被拍卖,WM_PAINT音讯还可能会被统一以提升功效。其余全体音信以先进先出(FIFO卡塔尔的法门被管理。

   
新闻能够由系统或然应用程序发生。系统在爆发输入事件时产生新闻。比方,
当客户敲键,
移动鼠标大概单击控件。系统也发出新闻以响应由应用程序带来的浮动,
举例应用程序改变系统字体制改善变窗体大小。应用程序能够发生消息使窗体实践任务,或然与别的应用程序中的窗口通信。

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
33个人的窗口句柄。窗口能够是其余项指标显示器对象,因为Win32能力所能达到保险大好些个可视对象的句柄(窗口、对话框、开关、编辑框等)。
    
message用于区分其余音信的常量值,那个常量能够是Windows单元中预约义的常量,也可以是自定义的常量。新闻标志符以常量命名的办法提议新闻的含义。当窗口进程选拔到音信随后,他就能接纳音讯标记符来决定如哪处理音讯。例如、WM_PAINT告诉窗口进度窗体顾客区被改成了亟待重绘。符号常量钦命系统新闻归属的项目,其前缀指明了处精通释新闻的窗体的品种。
     wParam 经常是八个与消息有关的常量值,也或者是窗口或控件的句柄。
     lParam
常常是一个指向性内部存储器中数量的指针。由于WParam、lParam和Pointer都以叁十二个人的,由此,它们中间能够相互调换。

该函数将赢得和hWnd也许其子窗口相关的音信。

DWORD GetMessagePos(void);

0 ~ WM_USER – 1

再次出现意况:XP sp3 / Office 二〇〇五(其余office版本应该也得以,没有测量检验卡塔 尔(阿拉伯语:قطر‎

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

音信标志符的值
    
系统一保险留音讯标记符的值在0x0000在0x03ff(WM_USE奥迪Q3-1)范围。那一个值被系统定义音讯使用。应用程序不能运用那个值给本人的音信。应用程序新闻从WM_USER(0X0400)到0X7FFF,或0XC000到0XFFFF;WM_USERAV4到
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

WM_USER ~ 0x7FFF

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_E奥迪Q5传祺SPACE 组合框内部存款和储蓄器不足
 CBN_KILLFOCUS 组合框失去输入主题
 CBN_SELCHANGE 在组合框中精选了朝气蓬勃项
 CBN_SELENDCANCEL 顾客的接受相应被打消
 CBN_SELENDOK 客商的选项是法定的
 CBN_SETFOCUS 组合框拿到输入宗旨

音讯来源未知

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

自定义窗口类整数新闻

2> 运行http_server.py(需先安装python卡塔 尔(英语:State of Qatar)

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智跑RubiconSPACE 编辑框内存不足
 EN_HSCROLL 顾客点击了档案的次序滚动条
 EN_KILLFOCUS 编辑框正在失去输入主题
 EN_MAXTEXT 插入的源委被截断
 EN_SETFOCUS 编辑框得到输入宗旨
 EN_UPDATE 编辑框中的文本将在更新
 EN_VSCROLL 顾客点击了僵直滚动条音讯含义

回到值得高字节表示这段日子在音讯队列中的音讯类型。低字节表示从上次GetQueueStatus,GetMessage也许PeekMessage后被出席队列的消息类型。

InSendMessage

WM_APP ~ 0xBFFF

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

9 BroadcastSystemMessage 
咱俩平日所接触到的新闻都以发送给窗口的,其实,
音信的接纳者可以是不可枚举的,它能够是应用程序(applications),
可设置驱动(installable drivers),互联网设施(network drivers),
系统级设备驱动(system-level device drivers)等, 
布罗兹castSystemMessage这么些API能够对以上系统组件发送消息。

列表框控件
 LBN_DBLCLK 客户双击了豆蔻梢头项
 LBN_E福特Explorer途睿欧SPACE 列表框内部存储器相当不够
 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现存创造消息队列,全部线程爆发时并从未消息队列,仅当线程第1回调用GDI函数时系统才给线程成立一个音讯队列。队列新闻送到系统音讯队列,然后到线程消息队列;非队列新闻直接送给指标窗口进度。
    
对于队列新闻,最广大的是鼠标和键盘触发的音信,例如WM_MOUSERMOVE,WM_CHALacrosse等新闻,还应该有豆蔻梢头部分别样的新闻,比方:WM_PAINT、
WM_TIMER和WM_QUIT。当鼠标、键盘事件被触发后,相应的鼠标或键盘驱动程序就可以把那么些事件调换来相应的音讯,然后输送到系统音信队列,由
Windows系统去开展拍卖。Windows系统则在适合的火候,从系统信息队列中抽取三个消息,依据后边我们所说的MSG音信结构分明信息是要被送往极其窗口,然后把抽出的音信送往创设窗口的线程的应和队列,下边包车型客车工作就该由线程音讯队列操心了,Windows初始忙本身的业务去了。线程见到本身的音信队列中有消息,就从队列中抽出来,通过操作系统一发布送到合适的窗口进度去管理。
    
日常来说,系统总是将音讯Post在消息队列的结尾。那样有限支撑窗口以先进先出的相继选拔消息。可是,WM_PAINT是三个不风姿罗曼蒂克,同三个窗口的多个WM_PAINT被统10%贰个 WM_PAINT 音讯,
合併全体的无效区域到贰个失效区域。合併WM_PAIN的目标是为着减削刷新窗口的次数。
图片 11

4.万一应用程序正在开创顶层窗口时调用PeekMessage,将促成窗口窗口被成立在Z-Order的末段。你必要在PeekMessage后,显式调用SetForegroundWindow。假若应用程序以致有一个放置窗口了,那么新窗口将被平放。

PostMessage
应用程序要用HWND_BROADCAST举路程序间的相互作用,音讯应该赢得于RegisterWindowMessage()

0xC000 ~ 0xFFFF

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;
}

图片 12
   
非队列音讯将会绕过系统队列和音信队列,直接将新闻发送到窗口进度,。系统一发布送非队列新闻布告窗口,系统一发布送音信布告窗口。举个例子,当客商激活三个窗口系统一发布送WM_ACTIVATE,
WM_SETFOCUS, and
WM_SETCU君越SORAV4。那个新闻布告窗口它被激活了。非队列新闻也能够由当应用程序调用系统函数产生。比如,当程序调用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个具备代表性的函数,我们能够看出音信的出殡情势和寄送格局的界别所在:被发送的音讯是还是不是会被马上管理,函数是不是及时回去。被发送的讯息会被立时管理,管理完成后函数才会回到;被寄送的音信不会被当即管理,他被放置多少个先进先出的队列中,一直等到应用程序空线的时候才会被拍卖,不过函数放置音信后立即回到。
图片 13
  实际上,发送新闻到二个窗口管理进程和一向调用窗口管理进程之间并不曾太大的界别,他们直白的独一无二不一样就在于你能够必要操作系统截获全体被发送的音信,不过不可见收获对窗口管理进程的第一手调用。
  以寄送点子发送的音讯平日是与客商输入事件相对应的,因为这几个事件不是特别火急,能够展开缓慢的缓冲管理,比如鼠标、键盘音讯会被寄送,而按键等音讯则会被发送。
  广播音讯用得少之又少,布罗兹castSystemMessage函数原型如下:
      long 布罗兹castSystemMessage(DWO奥迪Q7D dwFlags,LPDWO奇骏D
lpdwRecipients,UINT uiMessage,WPARAM wParam,LPARAM
lParam);该函数能够向钦赐的收信人发送一条音讯,那个接纳者能够是应用程序、可设置的驱动程序、互联网驱动程序、系统品级的装置驱动音信和她们的恣意组合。供给小心的是,要是dwFlags参数是BSF_QUE本田UR-VY并且最少三个接收者重临了BROADCAST_QUERY_DENY,则再次来到值为0,若无一点名BSF_QUEKugaY,则函数将音讯发送给全体选取者,况兼忽视其重临值。

一旦发送信息低于WM_USE奥迪Q3范围,到异步音讯队列函数(PostMessage、SendNotifyMessage卡塔 尔(英语:State of Qatar),新闻参数不该富含指针,不然的话,操作将退步。该函数将要收到线程有空子管理该音讯前回到,发送者将释放刚刚用到的内部存款和储蓄器。

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

> 0xFFFF

3. 原因深入分析

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

非新闻队列情势,直接调用窗口进度,系统及时切换来收到线程执行,发送线程锁住,知道选取线程处理完成

SendMessageTimeout

为事后系统使用保留

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}

该函数通过调用窗口进度的不二秘籍发送新闻,如若窗口归于差别线程,SendMessageTimerout将理解音讯管理完毕才重回可能钦命的逾期已经过去,假诺窗口就在这时候此刻线程,则直接调用窗口进度,并忽视time-out超时

SendNotifyMessage
如若窗口创建于归属发送音讯的线程,则调用窗口进度,并等候窗口进度管理落成该信息。借使是莫衷一是线程,则将新闻传递到窗口进度,并当即回到,不等待窗口进程的音讯管理进度。


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

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

表A-2  常用Windows消息

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

 

音讯名称

图片 22

  
首先,GetMessage从进度的主线程的音讯队列中获取八个音讯并将它复制到MSG结构,就算队列中绝非音讯,则GetMessage函数将等待一个音信的来到以往才再次来到。假使您将贰个窗口句柄作为第1个参数字传送入GetMessage,那么唯有钦定窗口的的消息能够从队列中赢得。GetMessage也得以从音信队列中过滤消息只接收音信队列中落在界定内的消息。那时候就要动用GetMessage/PeekMessage钦赐四个音信过滤器。这几个过滤器是叁个新闻标记符的界定可能是三个窗体句柄,恐怕双方同一时候钦命。当应用程序要寻觅三个后入音信队列的音讯是很有用。WM_KEYFIRST
和 WM_KEYLAST 常量用于选择全部的键盘新闻。 WM_MOUSEFIRST 和
WM_MOUSELAST 常量用于选取全体的鼠标新闻。 
 然后TranslateAccelerator判定该音信是或不是多少个按钮音讯还如果多个加快键音讯,假使是,则该函数将把几个按钮新闻转变来几个加速键音讯传递给窗口的回调函数。处理了加快键之后,函数TranslateMessage将把七个开关音讯WM_KEYDOWN和WM_KEYUP转变来叁个WM_CHAENVISION,不过要求小心的是,新闻WM_KEYDOWN,WM_KEYUP依然将传递给窗口的回调函数。     
 管理完事后,DispatchMessage函数将把此音信发送给该消息钦点的窗口中已设定的回调函数。假若新闻是WM_QUIT,则
GetMessage再次回到0,进而退出循环体。应用程序能够选拔PostQuitMessage来结束本身的音信循环。平日在主窗口的
WM_DESTROY新闻中调用。
 上面大家举三个广泛的小例子来申明那么些新闻泵的选拔:

能够看出Excel
hang在NtUserMessageCall()中,经过查询知,SendMessage()内部便是调用NtUserMessageCall()来发送新闻的。

图片 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键,若是是就打开管理。

WM_NULL 

NtUserMessageCall(HWND_BROADCAST, WM_DDE_INITIATE)

窗口进程
 窗口进程是叁个用于拍卖全数发送到这么些窗口的新闻的函数。任何八个窗口类都有叁个窗口进度。同一个类的窗口使用相似的窗口进度来响应新闻。系统一发布送消息给窗口进程将音讯数据作为参数传递给他,音讯赶到之后,根据新闻类型排序进行拍卖,此中的参数则用来分别分歧的新闻,窗口进度使用参数发生合适行为。
 二个窗口进程不平时忽视音信,假若她不管理,它会将音信传回到奉行暗中认可的拍卖。窗口进程通过调用DefWindowProc来做那几个管理。窗口进程必需return二个值作为它的信息管理结果。大许多窗口只管理小片段信息和将其余的通过DefWindowProc传递给系统做私下认可的管理。窗口进程被全数归于同二个类的窗口共享,能为分化的窗口管理新闻。上面大家来看一下实际的实例:

0x0000

表明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住

 

WM_CREATE 

 

新闻分流器
  日常的窗口进程是经过二个switch语句来贯彻的,这些工作很烦,有没有更轻易的形式呢?有,那正是新闻分流器,利用消息分流器,大家能够把switch语句分成更加小的函数,每三个音信都对应三个小函数,那样做的收益正是对音信更便于管理。
  之所以被称得上音信分流器,正是因为它能够对别的音讯进行分流。上面大家做一个函数就很掌握了:

0x0001

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

接下来大家匡正一下窗口进度:

WM_DESTROY

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

0x0002

在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));

WM_MOVE

call stack显示实乃ShellExecuteEx所调用

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

0x0003

图片 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里面还会有多个宏:FOEscortWA奥迪Q5D_WM_XXXX,大家依旧那WM_COMMAND为例,进行深入分析:

WM_SIZE

注意到下三个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))

0x0005

以此窗口所属的长河PID =
0xc54,适逢其会是excel的长河,表达ShellExecuteEx确实发送了DDE音信给excel,並且可执发送的音讯的thread正是主线程

故此实际,FO库罗德WA宝马X3D_WM_XXXX将新闻参数实行了重新组织,生成了wParam &&
lParam,然后调用了大家定义的函数。

更动叁个窗口的高低

图片 110

前面,我们分析了音讯的中坚理论和骨干的函数及用法,接下去,我们将越是研究音信传递在MFC中的达成。

WM_ACTIVATE

基于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语句。

0x0006

图片 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.在类的得以完结中步入相应的函数体;

WM_SETFOCUS

 

音信的足够
  
有了地点的那几个只是当作功底,大家接下去就做我们最熟谙、最常用的干活:增添新闻。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列表框中冒出了,假如还尚无,那就跟着往下看:)

0x0007

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

 

WM_KILLFOCUS

查看一下buff的地址:

 

0x0008

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

 

消息名称

说  明

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为正整数

0x000A

3.3 总结

  表A-3  通知新闻-开关

动用程序Enable状态纠正时产生

1> ShellExecuteEx张开test.iqy的时先创造excel进度

消息名称

说 明

BN_CLICKED

单击按钮

BN_DISABLE

按钮被禁止

BN_DOUBLECLICKED

双击按钮

BN_HILITE

加亮按钮

BN_PAINT

按钮应当重画

BN_UNHILITE

加亮应当去掉

WM_SETREDRAW

2> 然后创建二个”WorkerW”的窗口用于DDE通讯

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

0x000B

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  文告新闻-编辑框

WM_SETTEXT

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

用户点击了垂直滚动条

0x000C

好似,大家得以制造五个带窗口的程序,运营后将其挂起,这时候,纵然直接双击展开test.iqy也会hang住。

表A-6  文告新闻-列表框

应用程序发送此音讯来设置三个窗口的文件

 

消息名称

说 明

LBN_DBLCLK

用户双击了一项

LBN_ERRSPACE

列表框内存不足

LBN_KILLFOCUS

列表框正在失去输入焦点

LBN_SELCANCEL

用户选择被取消

LBN_SELCHANGE

用户选择将改变

LBN_SETFOCUS

列表框获得输入焦点

WM_GETTEXT

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

Windows音讯大全

0x000D

因为双击张开实际是用explorer.exe打开,而explorer.exe是有窗口的,能够健康的采取管理WM_DDE_INITIATE消息

  Windows是生机勃勃音讯(Message卡塔 尔(英语:State of Qatar)驱动式系统,Windows音讯提供了应用程序与应用程序之间、应用程序与Windows系统之间开展报纸发表的手法。应用程序要落实的功用由消息来触发,并靠对新闻的响应和拍卖来成功。Windows系统中有三种音信队列,大器晚成种是系统消息队列,另风度翩翩种是应用程序音信队列。Computer的具有输入设备由
Windows监察和控制,当叁个平地风波时有爆发时,Windows先将输入的新闻放入系统消息队列中,然后再将输入的消息拷贝到相应的应用程序队列中,应用程序中的新闻循环从它的音信队列中查找每四个音讯并发送给相应的窗口函数中。三个事件的发生,达到处理它的窗口函数必须经验上述进程。值得注意的是新闻的非超越性,即无论是事件的急与缓,总是按到达的前后相继排队(一些系统新闻除却),那就使得一些外部实时事件恐怕得不到那个时候的拍卖。

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

 

  由于Windows自己是由音讯使得的,举一个例证来证实这几个主题材料。张开记事本程序,该程序有多个File菜单,那么,在运作该应用程序的时候,若是顾客单击了File菜单里New命令时,那个动作将被Windows
(并不是应用程序自个儿!卡塔尔国所破获,Windows经过解析获知这些动作应该由地点所说的要命应用程序去管理,既然是那样,Windows就发送了个称呼WM_COMMAND的新闻给应用程序,该消息所满含音信告知应用程序:”顾客单击了New菜单”,应用程序获知这一音讯随后,接收对应的动作来响应它,那几个进度称为新闻管理。Windows为每二个应用程序(确切地说是每三个线程)维护了相应的音讯队列,应用程序的天职就是不停的从它的消息队列中收获新闻,解析信息和拍卖新闻,直到一条吸取名叫WM_QUIT新闻截止,这一个进度日常是由黄金年代种名字为音讯循环的程序结构来兑现的。

WM_GETTEXTLENGTH

5. 怎么win7上不会有那般的主题素材

  消息作者是作为贰个记下传递给应用程序的,那几个记录中满含了信息的种类以至任何消息。举个例子,对于单击鼠标所发生的信息以来,这么些记录中带有了单击鼠标时的坐标。这么些记录类型叫做T
M s g,它在Wi n d o w s单元中是这般评释的:

0x000E

5.1 在API Monitor中看下PostMessageW

type

收获与三个窗口有关的公文的长度(不蕴涵空字符卡塔尔国

图片 115

TMsg = packedrecord

WM_PAINT

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

hwnd: HWND / /窗口句柄

0x000F

图片 116

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

务求一个窗口重绘自个儿

能够是ShellExecuteEx内部成立的线程,所以win7上ShellExecuteEx成立了多少个线程特地用来拍卖和excel的DDE讯息通讯,那样就能够不奇怪的选用场理excel发过来的WM_DDE_INITIATE消息了

wParam: WPA CRUISER AM  // 三16个人新闻的特定附加新闻

WM_CLOSE

lParam: LPA Enclave AM  // 31人音信的一定附加消息

0x0010

time: DWO兰德CR-VD / /音信创制时的时日

当三个窗口或应用程序要关门时发送叁个数字信号

pt: TPoint / /新闻创设时的鼠标地方

WM_QUERYENDSESSION

end

0x0011

 

客商采取停止对话框或应用程序自身调用ExitWindows()函数

音讯中有怎样?

WM_QUIT

是还是不是感觉三个音信记录中的音讯像斯洛伐克语同样?假若是那样,那么看一看上边包车型客车解释:

0x0012

hwnd
三11位的窗口句柄。窗口能够是别的类型的显示屏对象,因为Win32能够尊敬大非常多可视对象的句柄(窗口、对话框、按键、编辑框等)。

用来终止程序运转或应用程序调用Postquitmessage()函数来发出此音信

message
用于区分别的音讯的常量值,这几个常量能够是Windows单元中预订义的常量,也得以是自定义的常量。

WM_QUERYOPEN

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

0x0013

lParam
平日是贰个照准内部存款和储蓄器中多少的指针。由于WParm、lParam和Pointer都是33个人的,因而,它们中间能够相互转换。

当客户窗口复苏原先的高低地方时,把此消息发送给有个别Logo

 

WM_ERASEBKGND

WM_NULL = 0

0x0014

WM_CREATE = 1

当窗口背景必得被擦除时(举例在窗口校订大时辰卡塔 尔(英语:State of Qatar)

应用程序创造三个窗口

WM_SYSCOLORCHANGE

WM_DESTROY = 2

0x0015

二个窗口被销毁

当系统颜色改换时,发送此新闻给全数一流窗口

WM_MOVE = 3

WM_ENDSESSION

移动贰个窗口

0x0016

WM_SIZE = 5

当系统经过产生WM_QUECRUISERYENDSESSION消息后,此音信发送给应用程序

变动八个窗口的深浅

WM_SHOWWINDOW

WM_ACTIVATE = 6

0x0018

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

当掩瞒或展现窗口是发送此音讯给那几个窗口

WM_SETFOCUS = 7

WM_ACTIVATEAPP

赢得焦点后

0x001C

WM_KILLFOCUS = 8

当某些窗口将被激活时,将被激活窗口和这几天活动(将要失去激活卡塔尔窗口会接到此消息,发此音讯给应用程序哪个窗口是激活的,哪个是非激活的

错失主旨

WM_FONTCHANGE

WM_ENABLE = 10

0x001D

改变enable状态

当系统的字体财富库变化时发送此音信给全数超级窗口

WM_SETREDRAW = 11

WM_TIMECHANGE

安装窗口是不是能重画

0x001E

WM_SETTEXT = 12

当系统的年月变化时发送此新闻给持有一级窗口

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

WM_CANCELMODE

WM_GETTEXT = 13

0x001F

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

出殡此新闻来废除某种正在扩充的操作

WM_GETTEXTLENGTH =14

WM_SETCURSOR

收获与一个窗口有关的文本的长度(不含有空字符卡塔尔国

0x0020

WM_PAINT = 15

若是鼠标引起光标在有些窗口中移动且鼠标输入未有被抓走时,发信息给该窗口

渴求八个窗口重画本人

WM_MOUSEACTIVATE

WM_CLOSE = 16

0x0021

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

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

WM_QUERYENDSESSION= 17

WM_CHILDACTIVATE

当客商筛选结束对话框或程序本人调用ExitWindows函数

0x0022

WM_QUIT = 18

发送此音讯给MDI子窗口当顾客点击此窗口的题目栏,或当窗口被激活、移动、改换大小

用来收场程序运营或当程序调用postquitmessage函数

WM_QUEUESYNC

WM_QUERYOPEN = 19

0x0023

当客户窗口苏醒原先的分寸地方时,把此音信发送给有些Logo

此音讯由基于Computer的教练程序发送,通过WH_JOU奥迪Q3NALPALYBACK的Hook程序分别出客商输入消息

WM_ERASEBKGND = 20

WM_GETMINMAXINFO

当窗口背景必需被擦除时(例在窗口改换大小时卡塔 尔(阿拉伯语:قطر‎

0x0024

WM_SYSCOLORCHANGE =21

当窗口要就要改成大小或任务时,发送此消息给该窗口

当系统颜色改正时,发送此音信给具有顶尖窗口

WM_PAINTICON

WM_ENDSESSION = 22

0x0026

当系统经过爆发WM_QUE奥迪Q3YENDSESSION消息后,此音讯发送给应用程序,

当窗口Logo将在被重绘时,发送此音讯给该窗口

照会它对话是不是停止

WM_ICONERASEBKGND

WM_SYSTEMERROR = 23

0x0027

WM_SHOWWINDOW = 24

在一个最小化窗口的Logo在重绘前,当Logo背景必需被重绘时,发送此音讯给该窗口

当隐藏或展示窗口是发送此音信给这一个窗口

WM_NEXTDLGCTL

WM_ACTIVATEAPP = 28

0x0028

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

发送此消息给四个会话框程序以转移主题地方

WM_FONTCHANGE = 29

WM_SPOOLERSTATUS

当系统的字体能源库变化时发送此新闻给具有拔尖窗口

0x002A

WM_TIMECHANGE = 30

当打字与印刷管理列队扩充或调整和减弱一条作业时发生此新闻

当系统的岁月改动时发送此音讯给持有拔尖窗口

WM_DRAWITEM

WM_CANCELMODE = 31

0x002B

出殡此音信来撤消某种正在开展的摸态(操作卡塔尔

当Button,ComboBox,Listbox,Menu控件的外观更改时,发送此音信给这个控件的主人

WM_SETCURSOR = 32

WM_MEASUREITEM

假若鼠标引起光标在有个别窗口中活动且鼠标输入没有被破获时,就发音信给有个别窗口

0x002C

WM_MOUSEACTIVATE =33

当Button,ComboBox,list box,ListView,Menu
项被创建时,发送此音信给控件的全数者

当光标在有些非激活的窗口中而客商正按着鼠标的某部键发送此新闻给当下窗口

WM_DELETEITEM

WM_CHILDACTIVATE =34

0x002D

出殡此新闻给MDI子窗口当客户点击此窗口的标题栏,或当窗口被激活,移动,改换大小

当ListBox 或 ComboBox被销毁或当一些项通过发送LB_DELETESTRING、LB_RESETCONTENT、
CB_DELETESTRING、CB_RESETCONTENT
消息被去除时,发送此新闻给控件的持有者

WM_QUEUESYNC = 35

WM_VKEYTOITEM

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

0x002E

暌违出顾客输入消息

二个怀有LBS_WANTKEYBOA昂科拉DINPUT风格的ListBox控件发送此消息给它的主人,以此来响应WM_KEYDOWN消息

WM_GETMINMAXINFO =36

WM_CHARTOITEM

此消息发送给窗口当它就要改换大小或岗位;

0x002F

WM_PAINTICON = 38

多少个享有LBS_WANTKEYBOA大切诺基DINPUT风格的ListBox控件发送此新闻给它的全体者,以此来响应WM_CHAR消息

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

WM_SETFONT

WM_ICONERASEBKGND =39

0x0030

此新闻发送给有个别最小化窗口,仅当它在水墨画标前它的背景必需被重画

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

WM_NEXTDLGCTL = 40

WM_GETFONT

出殡此音讯给三个会话框程序去改动大旨地点

0x0031

WM_SPOOLERSTATUS =42

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

每当打字与印刷管理列队增添或调整和减弱一条作业时发生此新闻

WM_SETHOTKEY

WM_DRAWITEM = 43

0x0032

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

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

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

WM_GETHOTKEY

WM_MEASUREITEM = 44

0x0033

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

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

发送此音信给控件的持有者

WM_QUERYDRAGICON

WM_DELETEITEM = 45

0x0037

当the list box 或 combo box 被消逝 或 当
有个别项被剔除通过LB_DELETESTRING,LB_RESETCONTENT, CB_DELETESTRING, or
CB_RESETCONTENT 消息

此音信发送给最小化窗口,当此窗口将在被拖放而它的类中并未定义Logo,应用程序就回到一个Logo或光标的句柄,当客商拖放Logo时系统呈现那么些Logo或光标

WM_VKEYTOITEM = 46

WM_COMPAREITEM

此消息有一个LBS_WANTKEYBOA瑞虎DINPUT风格的发出给它的主人来响应WM_KEYDOWN消息

0x0039

WM_CHARTOITEM = 47

出殡此音信来决断ComboBox或ListBox新扩展的项的相对地点

此音讯由三个LBS_WANTKEYBOA库罗德DINPUT风格的列表框发送给他的主人来响应WM_CHAR消息

WM_COMPACTING

WM_SETFONT = 48

0x0041

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

展现内部存款和储蓄器已经少之又少了

WM_GETFONT = 49

WM_WINDOWPOSCHANGING

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

0x0046

WM_SETHOTKEY = 50

当调用SetWindowPos()函数改变窗口的高低和地方后,发送此消息给该窗口

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

WM_POWER

WM_GETHOTKEY = 51

0x0048

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

当系统将跻身挂起状态时发送此新闻给全部进度

WM_QUERYDRAGICON =55

WM_COPYDATA

此信息发送给最小化窗口,当此窗口将在被拖放而它的类中未有概念Logo,应用程序能

0x004A

回去二个Logo或光标的句柄,当顾客拖放Logo时系统来得那几个Logo或光标

当一个应用程序传递数据给另二个应用程序时发送此音讯

WM_COMPAREITEM = 57

WM_CANCELJOURNAL

发送此新闻来剖断combobox或listbox新扩张的项的相对地点

0x004B

WM_GETOBJECT = 61

当某些顾客废除程序日志激活状态,发送此音信给应用程序

WM_COMPACTING = 65

WM_NOTIFY

展示内部存储器已经相当少了

0x004E

WM_WINDOWPOSCHANGING= 70

当某些控件的某部事件已经发生或其风度翩翩控件须求得到一些新闻时,发送此新闻给它的父窗口

发送此音讯给这贰个窗口的分寸和职位将在被改成时,来调用setwindowpos函数或此外窗口管理函数

WM_INPUTLANGCHANGEREQUEST

WM_WINDOWPOSCHANGED= 71

0x0050

出殡此音讯给那么些窗口的大小和地点已经被改成时,来调用setwindowpos函数或别的窗口管理函数

当顾客选用某种输入语言,或输入语言的热键改换

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

WM_INPUTLANGCHANGE

当系统就要进入暂停状态时发送此新闻

0x0051

WM_COPYDATA = 74

当应用程序输入语言退换后发送此音信给受影响的最拔尖窗口

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

WM_TCARD

WM_CANCELJOURNAL =75

0x0052

当某些顾客撤除程序日志激活状态,提交此音信给程序

当应用程序已经初始化Windows扶植例程时发送此音讯给应用程序

WM_NOTIFY = 78

WM_HELP

当有些控件的某部事件早就发生或以此控件需求得到部分信息时,发送此消息给它的父窗口

0x0053

WM_INPUTLANGCHANGEREQUEST= 80

当客户按下了F1,假使有个别菜单是激活的,就发送此新闻给此窗口关联的菜系,否则就发送给有一点点子的窗口,就算当前都还没难点,就把此信息发送给当前激活的窗口

当客户挑选某种输入语言,或输入语言的热键更改

WM_USERCHANGED

WM_INPUTLANGCHANGE= 81

0x0054

当平台现场已经被改变后发送此音讯给受影响的最超级窗口

当顾客已经报到或分离后发送此音信给具有的窗口,当客商登入或抽离时系统改进顾客的活龙活现设置音讯,在客户更新设置时系统立时发送此消息

WM_TCARD = 82

WM_NOTIFYFORMAT

当程序已经起始化windows帮忙例程时发送此音信给应用程序

0x0055

WM_HELP = 83

公用控件和它们的父窗口通过此音讯来判别在WM_NOTIFY音讯中是行使ANSI依然UNICODE情势的结构,使用此控件能使有些控件与它的父控件举行交互作用通讯

此音讯展现客商按下了F1,借使有些菜单是激活的,就发送此音讯个此窗口关联的菜系,否则就

WM_CONTEXTMENU

发送给极度的窗口,假若当前都不曾规范,就把此音信发送给当前激活的窗口

0x007B

WM_USERCHANGED = 84

当客商在某些窗口中式点心击右键,则发送此新闻给该窗口

当顾客已经登录或退出后发送此音信给全部的窗口,当客户登陆或抽离时系统更新客户的求实

WM_STYLECHANGING

设置新闻,在顾客更新设置时系统当下发送此音讯;

0x007C

WM_NOTIFYFORMAT =85

当将要调用SetWindowLong()函数窗口的三个或八个作风时,发送此音信给该窗口

公用控件,自定义控件和他们的父窗口通过此音信来决断控件是行使ANSI依旧UNICODE结构

WM_STYLECHANGED

在WM_NOTIFY新闻,使用此控件能使某些控件与它的父控件之间张开相互作用通讯

0x007D

WM_CONTEXTMENU =123

当调用SetWindowLong()函数退换了窗口的贰个或多少个作风后,发送此信息给该窗口

当顾客有个别窗口中式茶食击了风姿罗曼蒂克晃右键就发送此新闻给那一个窗口

WM_DISPLAYCHANGE

WM_STYLECHANGING =124

0x007E

当调用SETWINDOWLONG函数将在改换一个或多个窗口的风格时发送此音信给那多少个窗口

当显示器的分辨率纠正后发送此信息给持有的窗口

WM_STYLECHANGED =125

WM_GETICON

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

0x007F

WM_DISPLAYCHANGE =126

出殡此音信给有些窗口,再次回到与有些窗口有关联的大Logo或小Logo的句柄

当显示屏的分辨率改造后发送此音讯给持有的窗口

WM_SETICON

WM_GETICON = 127

0x0080

此音讯发送给有些窗口来回到与某些窗口有关连的大Logo或小图标的句柄;

应用程序发送此音讯让八个新的大Logo或小Logo与有些窗口关联

WM_SETICON = 128

WM_NCCREATE

前后相继发送此消息让二个新的大Logo或小Logo与某些窗口关联;

0x0081

WM_NCCREATE = 129

当某些窗口第二回被创建时,此音讯在WM_CREATE新闻被发送前发送

当有个别窗口第三回被创立时,此音信在WM_CREATE新闻发送前发送;

WM_NCDESTROY

WM_NCDESTROY = 130

0x0082

此音讯通告某些窗口,非客商区正在销毁

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

WM_NCCALCSIZE = 131

WM_NCCALCSIZE

当有些窗口的客户区域必需被核算时发送此音信

0x0083

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

当总计某些窗口的客户区大小和职位时发送此消息

WM_NCPAINT = 133

WM_NCHITTEST