1. 问题

1. 窗口进度 
每个窗口会有一个称作窗口进程的回调函数(WndProc),它含有三个参数,分别为:窗口句柄(Window
Handle),信息ID(Message ID),和四个音信参数(wParam,
lParam),当窗口收到音信时系统就会调用此窗口进程来拍卖新闻。(所以叫回调函数)

音讯是指什么?
    
音讯系统对于一个win32程序来说非凡重中之重,它是一个程序运行的动力来源。一个新闻,是系统定义的一个32位的值,他唯一的概念了一个事件,向
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_USER)-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来获取这几个值。

非队列信息
Windows新闻机制要点,关于windows操作系统之音讯和新闻队列。绕过了系统和线程新闻队列,非队列信息直接发送至窗口进度。系统独立发送非队列音信来打招呼一个窗口,一个事件影响了它。例如,当用户激活一个新窗口,系统发送给窗口
WM_ACTIVATE, WM_SETFOCUS, and
WM_SETCURSOR信息。那几个新闻文告窗口它已经被激活了,键盘输入正指向该窗口,鼠标光标已经移至了窗口边框内。当应用程序调用某些系统函数时,也会窗口非队列新闻,比如,应用程序在调用SetWindowPos时,系统将发送WM_WINDOWPOSCHANGED消息。

稍稍音讯发送非队列信息:布罗德(Broad)castSystemMessage,
布罗德castSystemMessageEx, SendMessage, SendMessage提姆(Tim)eout, 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或者SendMessage提姆eout。要不然,窗口进度可以经过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, LOWORD(wParam)表示菜单项,工具栏按钮或控件的ID。要是是控件,
HIWORD(wParam)表示控件音信类型
3> 控件公告(Notify Message) 
控件公告音讯, 这是最灵敏的新闻格式, 其Message, wParam,
lParam分别为:WM_NOTIFY,
控件ID,指向NMHDR的指针。NMHDR包涵控件通告的内容, 能够随心所欲扩展。
2) 程序定义音信(Application-Defined Messages) 
用户自定义的音讯, 对于其范围有如下规定:
WM_USER: 0x0400-0x7FFF    (ex. WM_USER+10)
WM_APP(winver>4.0): 0x8000-0xBFFF (ex.WM_APP+4)
RegisterWindowMessage: 0xC000-0xFFFF

澳门金沙国际 1typedef struct tagMsg
澳门金沙国际 2{
澳门金沙国际 3       HWND    hwnd;       //接受该音讯的窗口句柄
澳门金沙国际 4       UINT    message;    //音讯常量标识符,也就是大家平时所说的新闻号
澳门金沙国际 5       WPARAM  wParam;     //32位音信的特定附加信息,确切含义依赖于消息值
澳门金沙国际 6       LPARAM  lParam;     //32位信息的特定附加音讯,确切含义信赖于音信值
澳门金沙国际 7       DWORD   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_TIMER只有在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
32位的窗口句柄。窗口可以是其它类型的显示器对象,因为Win32力所能及保险半数以上可视对象的句柄(窗口、对话框、按钮、编辑框等)。
    
message用于区分其他信息的常量值,那个常量可以是Windows单元中预约义的常量,也能够是自定义的常量。新闻标识符以常量命名的不二法门提出音信的含义。当窗口进程接受到新闻之后,他就会使用新闻标识符来决定哪些处理音讯。例如、WM_PAINT告诉窗口进程窗体客户区被改变了需求重绘。符号常量指定系统新闻属于的花色,其前缀指明了处精晓释音讯的窗体的档次。
     wParam 经常是一个与音讯有关的常量值,也可能是窗口或控件的句柄。
     lParam
平时是一个对准内存中数据的指针。由于WParam、lParam和Pointer都是32位的,因而,它们中间可以互相转换。

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

DWORD GetMessagePos(void);

复出环境:XP sp3 / Office 2007(其他office版本应该也可以,没有测试)

5 PostMessage(PostThreadMessage), SendMessage 
PostMessage:把音信放到指定窗口所在的线程信息队列中后即时赶回。
PostThreadMessage:把音信放到指定线程的新闻队列中后立时重返。
SendMessage:直接把音信送到窗口进度处理,处理完了才重回。

新闻标识符的值
    
系统保留信息标识符的值在0x0000在0x03ff(WM_USER-1)范围。这一个值被系统定义新闻使用。应用程序不可以选取那么些值给自己的音讯。应用程序音信从WM_USER(0X0400)到0X7FFF,或0XC000到0XFFFF;WM_USER到
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_KEYBOARD 表面信息来源于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_ERRSPACE 组合框内存不足
 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或SendMessage提姆eout来防止现身死锁。

编辑框控件
 EN_CHANGE 编辑框中的文本己更新
 EN_ERRSPACE 编辑框内存不足
 EN_HSCROLL 用户点击了水平滚动条
 EN_KILLFOCUS 编辑框正在失去输入大旨
 EN_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_ERRSPACE 列表框内存不够
 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_CHAR等新闻,还有部分其他的新闻,例如:WM_PAINT、
WM_TIMER和WM_QUIT。当鼠标、键盘事件被触发后,相应的鼠标或键盘驱动程序就会把那一个事件转换成相应的新闻,然后输送到系统新闻队列,由
Windows系统去开展处理。Windows系统则在优良的机遇,从系统音讯队列中取出一个信息,根据前边大家所说的MSG信息结构确定新闻是要被送往卓殊窗口,然后把取出的音讯送往创建窗口的线程的对应队列,上面的事体就该由线程新闻队列操心了,Windows先导忙自己的政工去了。线程看到自己的音信队列中有音讯,就从队列中取出来,通过操作系统发送到合适的窗口进度去处理。
    
一般来讲,系统连接将音信Post在信息队列的尾声。那样有限协理窗口以先进先出的相继接受音讯。然则,WM_PAINT是一个见仁见智,同一个窗口的三个WM_PAINT被合并成一个 WM_PAINT 消息,
合并所有的无效区域到一个无效区域。合并WM_PAIN的目标是为了减弱刷新窗口的次数。
澳门金沙国际 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;
}

澳门金沙国际 12
   
非队列新闻将会绕过系统队列和音讯队列,直接将音讯发送到窗口过程,。系统发送非队列新闻布告窗口,系统发送音讯通告窗口。例如,当用户激活一个窗口系统发送WM_ACTIVATE,
WM_SETFOCUS, and
WM_SETCURSOR。那一个音信文告窗口它被激活了。非队列新闻也可以由当应用程序调用系统函数爆发。例如,当程序调用SetWindowPos系统发送WM_WINDOWPOSCHANGED音讯。一些函数也发送非队列信息,例如上边我们要谈到的函数。
     
新闻的发送
    
通晓了上面的那一个基础理论之后,我们就足以开展一下概括的新闻发送与接受。
     把一个音讯发送到窗口有3种艺术:发送、寄送和播发。
    
发送音讯的函数有SendMessage、SendMessageCallback、SendNotifyMessage、
SendMessage提姆(Tim)eout;寄送音讯的函数首要有PostMessage、PostThreadMessage、
PostQuitMessage;广播音讯的函数我明白的只有布罗德(Broad)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(DWORD dwFlags,LPDWORD
lpdwRecipients,UINT uiMessage,WPARAM wParam,LPARAM
lParam);该函数可以向指定的接收者发送一条音讯,这一个接收者可以是应用程序、可安装的驱动程序、网络驱动程序、系统级其他装置驱动信息和她俩的自由组合。要求注意的是,如若dwFlags参数是BSF_QUERY并且至少一个接收者重返了BROADCAST_QUERY_DENY,则重返值为0,要是没有点名BSF_QUERY,则函数将信息发送给所有接收者,并且忽略其再次来到值。

假如发送音讯低于WM_USER范围,到异步音讯队列函数(PostMessage、SendNotifyMessage),音信参数不该蕴涵指针,不然的话,操作将失利。该函数将在收取线程有机会处理该音信前重回,发送者将释放刚刚用到的内存。

PostQuitMessage

 

音信的接受
 音信的吸收重要有3个函数:GetMessage、PeekMessage、WaitMessage。
  GetMessage原型如下:BOOL GetMessage(LPMSG lpMsg,HWND hWnd,UINT
wMsgFilterMin,UINT
wMsgFilter马克斯(Max));该函数用来获取与hWnd参数所指定的窗口相关的且wMsgFilterMin和wMsgFilter马克斯(Max)参数所提交的信息值范围内的信息。需求留意的是,借使hWnd为NULL,则GetMessage获取属于调用该函数应用程序的任一窗口的音信,借使wMsgFilterMin和wMsgFilter马克斯都是0,则GetMessage就回去所有可获取的音信。函数获取之后将去除音信队列中的除
WM_PAINT音讯之外的任何新闻,至于WM_PAINT则唯有在其拍卖将来才被删去。
   PeekMessage原型如下:BOOL PeekMessage(LPMSG lpMsg,HWND hWnd,UINT
wMsgFilterMin,UINT wMsgFilter马克斯(Max),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在哪里?

澳门金沙国际 14while(GetMessage(&msg, NULL, 0, 0))
澳门金沙国际 15{
澳门金沙国际 16       if(!TranslateAccelerator(msg.hWnd, hAccelTable, &msg))
澳门金沙国际 17      { 
澳门金沙国际 18            TranslateMessage(&msg);
澳门金沙国际 19            DispatchMessage(&msg);
澳门金沙国际 20       }
澳门金沙国际 21}

该函数通过调用窗口进度的办法发送信息,倘若窗口属于分裂线程,SendMessage提姆(Tim)erout将领悟新闻处理已毕才回到或者指定的过期已经死亡,倘诺窗口就在时下线程,则向来调用窗口进程,并忽略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住的地点

 

澳门金沙国际 22

  
首先,GetMessage从进程的主线程的音信队列中收获一个音讯并将它复制到MSG结构,如果队列中从不信息,则GetMessage函数将拭目以待一个新闻的到来以后才回来。要是你将一个窗口句柄作为首个参数传入GetMessage,那么惟有指定窗口的的消息能够从队列中收获。GetMessage也足以从新闻队列中过滤新闻只接受音讯队列中落在限制内的新闻。这时候就要拔取GetMessage/PeekMessage指定一个音信过滤器。那几个过滤器是一个新闻标识符的界定或者是一个窗体句柄,或者两者同时指定。当应用程序要寻找一个后入新闻队列的音讯是很有用。WM_KEYFIRST
和 WM_KEYLAST 常量用于接受所有的键盘音信。 WM_MOUSEFIRST 和
WM_MOUSELAST 常量用于接受所有的鼠标信息。 
 然后TranslateAccelerator判断该新闻是否一个按键新闻还假若一个加快键信息,假设是,则该函数将把多少个按键音信转换成一个加快键音信传递给窗口的回调函数。处理了加快键之后,函数TranslateMessage将把七个按键新闻WM_KEYDOWN和WM_KEYUP转换成一个
WM_CHAR,不过要求专注的是,信息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键,就算是就进展处理。

NtUserMessageCall(HWND_BROADCAST, WM_DDE_INITIATE)

窗口进程
 窗口进程是一个用以拍卖所有发送到这么些窗口的音讯的函数。任何一个窗口类都有一个窗口过程。同一个类的窗口使用同样的窗口进度来响应信息。系统发送音讯给窗口进度将新闻数据作为参数传递给他,音讯赶到之后,根据信息类型排序进行拍卖,其中的参数则用来区分分歧的信息,窗口进程使用参数发生合适行为。
 一个窗口进度不日常忽略音信,如果她不处理,它会将音讯传回到执行默许的拍卖。窗口进程通过调用DefWindowProc来做这些处理。窗口进度必须
return一个值作为它的音讯处理结果。一大半窗口只处理小一些新闻和将其它的通过DefWindowProc传递给系统做默认的处理。窗口进度被有着属于同一个类的窗口共享,能为差别的窗口处理音讯。下边大家来看一下具体的实例:

表明excel给所有顶层窗口发送一个WM_DDE_INITIATE新闻,不过有窗口没有response

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

透过可以狐疑是出于console进度在和excel用DDE新闻通讯时,console没有响应excel发送的DDE信息,导致excel
hang住

 

 

新闻分流器
  平常的窗口进度是由此一个switch语句来落到实处的,这几个业务很烦,有没有更省事的点子吧?有,那就是新闻分流器,利用新闻分流器,大家得以把switch语句分成更小的函数,每一个音信都对应一个小函数,那样做的补益就是对新闻更易于管理。
  之所以被称为新闻分流器,就是因为它可以对任何新闻举行疏散。上面大家做一个函数就很明亮了:

3.2 为了验证3.1.1的臆度,用API Monitor一下ShellExecuteEx

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

3.2.1
依照微软的文档可见,发送DDE信息除了WM_DDE_INITIATE和WM_DDE_ACK之外用的都是PostMessage

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

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

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

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

澳门金沙国际 102

澳门金沙国际 103   #define HANDLE_MSG(hwnd,msg,fn) \
澳门金沙国际 104             switch(msg): return HANDLE_##msg((hwnd),(wParam),(lParam),(fn));

call stack呈现的确是ShellExecuteEx所调用

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

澳门金沙国际 105

澳门金沙国际 106   #define HANDLE_WM_COMMAND(hwnd,wParam,lParam,fn)\ 
澳门金沙国际 107             ((fn)((hwnd),(int)(LOWORD(wParam)),(HWND)(lParam),(UINT)HIWORD(wParam)),0L);

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

好了,事情到了这一步,应该全套都晴朗了。
可是,大家发现在windowsx.h里面还有一个宏:FORWARD_WM_XXXX,我们如故那WM_COMMAND为例,进行解析:

在意到下一个API GetWindowThreadProcessId ( 0x00310172 , 0x0012fb70
),刚好是赢得这些窗口的pid和tid,查看下参数窗口:

澳门金沙国际 108   #define FORWARD_WM_COMMAND(hwnd, id, hwndCtl, codeNotify, fn) \
澳门金沙国际 109     (void)(fn)((hwnd), WM_COMMAND, MAKEWPARAM((UINT)(id),(UINT)(codeNotify)), (LPARAM)(HWND)(hwndCtl))

本条窗口所属的长河PID =
0xc54,正好是excel的进程,表达ShellExecuteEx确实发送了DDE信息给excel,而且可执发送的新闻的thread就是主线程

因而其实,FORWARD_WM_XXXX将音讯参数举行了重新社团,生成了wParam &&
lParam,然后调用了大家定义的函数。

澳门金沙国际 110

面前,大家解析了新闻的主干理论和中央的函数及用法,接下去,大家将尤其探究音信传递在MFC中的完成。

按照DDE的音信参数,可见wParam就是发送音信的窗口,其句柄为2425190 =
0x250166,反向查询知那是ShellExecuteEx创造的”WorkerW”窗口

MFC信息的处理落成格局
  初看MFC中的种种音讯,以及在头脑中逐步的C++的震慑,我们恐怕很当然的就会想到利用C++的三大特点之一:虚拟机制来已毕音讯的传递,不过透过分析,大家看到事情并不是想我们想象的那样,在MFC中音信是经过一种所谓的音信映射机制来拍卖的。
  为何吧?在潘爱民先生翻译的《Visual
C++技术内幕》(第4版)中付出了详细的案由表明,我再简单的讲一次。在CWnd类中大概有110个音讯,还有别的的MFC的类呢,算起来音讯孝庄文皇后多了,在C++中对先后中用到的每一个派生类都要有一个vtable,每一个虚函数在vtable中都要占有一个4字节高低的进口地址,那样一来,对于每个特定项目标窗口或控件,应用程序都要求一个440KB大小的表来帮助虚拟信息控件函数。
  要是说上边的窗口或控件可以勉强落成的话,那么对于菜单命令音信及按钮命令新闻吧?因为不一致的应用程序有例外的菜系和按钮,大家怎么处理呢?在MFC
库的那种音信映射系统就幸免了运用大的vtable,并且可以在拍卖正常Windows音讯的同时处理千丝万缕的应用程序的一声令下新闻。
  说白了,MFC中的音讯机制其实质是一张高大的音信及其处理函数的次第对应表,然后加上分析处理那张表的利用框架之中的局地主次代码.那样就可以幸免在SDK编程中用到的累赘的CASE语句。

澳门金沙国际 111

MFC的音信映射的基类CCmdTarget
  假如您想让您的控件可以进行音讯映射,就不能不从CCmdTarget类中派生。CCmdTarget类是MFC处理命令信息的基础、主旨。MFC为此类设计了过多成员函数和有些分子数量,基本上是为了化解音讯映射问题的,所有响应音信或事件的类都从它派生,例如:应用程序类、框架类、文档类、视图类和各式各个的控件类等等,还有好多。
不过这几个类里面有2个函数对新闻映射格外首要,一个是静态成员函数DispatchCmdMsg,另一个是虚函数OnCmdMsg。
DispatchCmdMsg专门供MFC内部采取,用来散发Windows新闻。OnCmdMsg用来传递和殡葬新闻、更新用户界面对象的动静。
CCmdTarget对OnCmdMsg的默许完结:在此时此刻下令目标(this所指)的类和基类的音讯映射数组里搜索指定命令音讯的新闻处理函数。
  那里运用虚拟函数GetMessageMap获得传令目标类的音讯映射入口数组_messageEntries,然后在数组里匹配命令消息ID相同、控制文告代码也同等的消息映射条目。其中GetMessageMap是虚拟函数,所以可以肯定当前命令目的的确切类。
万一找到了一个非凡的新闻映射条目,则采纳DispachCmdMsg调用那一个处理函数;
若果没有找到,则选用_GetBaseMessageMap得到基类的新闻映射数组,查找,直到找到或探寻了装有的基类(到CCmdTarget)为止;
假设最终没有找到,则赶回FASLE。
  每个从CCmdTarget派生的授命目标类都可以覆盖OnCmdMsg,利用它来确定是还是不是足以处理某条命令,假若不能,就通过调用下一限令目的的
OnCmdMsg,把该命令送给下一个下令目标处理。经常,派生类覆盖OnCmdMsg时,要调用基类的被遮住的OnCmdMsg。
  在MFC框架中,一些MFC命令目的类掩盖了OnCmdMsg,如框架窗口类掩盖了该函数,完结了MFC的正规命令新闻发送路径。必要的话,应用程序也可以覆盖OnCmdMsg,改变一个或七个类中的发送规定,完成与业内框架发送规定不相同的发送路径。例如,在以下情状可以作那样的处理:在要打断发送顺序的类中把命令传给一个非MFC默许对象;在新的非默许对象中或在可能要传播命令的授命目的中。

澳门金沙国际 112

信息映射的情节
   
通过ClassWizard为大家转移的代码,我们可以看来,消息映射基本上分为2半数以上:
   
在头文件(.h)中有一个宏DECLARE_MESSAGE_MAP(),他被放在了类的结尾,是一个public属性的;与之相应的是在促成部分(.cpp)伸张了一章新闻映射表,内容如下:
    BEGIN_MESSAGE_MAP(当前类, 当前类的基类)
       //{{AFX_MSG_MAP(CMainFrame)
         新闻的进口项
       //}}AFX_MSG_MAP
   END_MESSAGE_MAP()
  
但是仅是那两项还远不足以完结一条音讯,要是一个音信工作,必须有以下3个部分去同盟:
1.在类的概念中加入相应的函数注脚;
2.在类的音讯映射表中插足相应的新闻映射入口项;
3.在类的贯彻中投入相应的函数体;

 

音讯的增进
  
有了上边的那些只是用作基础,大家接下去就做我们最熟识、最常用的劳作:添加音讯。MFC新闻的足够主要有2种方式:自动/手动,大家就以这2种方法为例,说一下怎么添加新闻。
   1、利用Class Wizard落成自动抬高
      在菜单中接纳View–>Class
Wizard,也可以用单击鼠标右键,选拔Class Wizard,同样可以激活Class
Wizard。采纳Message Map标签,从Class
name组合框中甄选我们想要添加信息的类。在Object
IDs列表框中,拔取类的称号。此时,
Messages列表框展现此类的大部(若不是所有的话)可重载成员函数和窗口信息。类重载彰显在列表的上部,以实际虚构成员函数的轻重写字母来表示。其余为窗口音讯,以大写字母出现,描述了实际窗口所能响应的音讯ID。选中我们向添加的音讯,单击Add
Function按钮,Class Wizard自动将该音讯添加进去。
     
有时候,我们想要添加的音信本应有出现在Message列表中,然而就是找不到,怎么做?不要心急,大家可以利用Class
Wizard上Class Info标签以恢宏音信列表。在该页中,找到Message
Filter组合框,通过它能够更改首页中Messages列表框中的选项。那里,大家选拔Window,从而显示所有的窗口音讯,一把状态下,你想要添加的信息就足以在Message列表框中出现了,即使还没有,那就接着往下看:)

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

澳门金沙国际,   2、手动地增加新闻处理函数
   
假使在Messages列表框中照旧看不到大家想要的音信,那么该新闻可能是被系统忽略掉或者是您协调创办的,在这种气象下,就非得团结手工添加。依据我们面前所说的新闻工作的3个部件,大家各类举办处理:
      1) 在类的.
h文件中增进处理函数的扬言,紧接在//}}AFX_MSG行之后加盟表明,注意:一定要以afx_msg开头。
     日常,添加处理函数申明的最好的地点是源代码中Class
Wizard维护的表上边,可是在它标志其领域的{{}}括弧外面。那么些括弧中的任何东西都将会被Class
Wizard销毁。
      2)
接着,在用户类的.cpp文件中找到//}}AFX_MSG_MAP行,紧接在它之后加入信息入口项。同样,也是位于{
{} }的外界
      3) 最终,在该文件中添加音信处理函数的实业。

澳门金沙国际 113

 

翻开一下buff的地点:

 

澳门金沙国际 114

消息范围

说 明

0 ~ WM_USER – 1

系统消息

WM_USER ~ 0x7FFF

自定义窗口类整数消息

WM_APP ~ 0xBFFF

应用程序自定义消息

0xC000 ~ 0xFFFF

应用程序字符串消息

> 0xFFFF

为以后系统应用保留

正巧就是开拓test.iqy的指令,表明ShellExecuteEx就是先创立了excel的长河,然后发送test.iqy的公文命令给excel打开。

表A-2  常用Windows消息

 

消息名称

说  明

WM_NULL 

0x0000

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

WM_CREATE 

0x0001

应用程序创建一个窗口

WM_DESTROY

0x0002

一个窗口被销毁

WM_MOVE

0x0003

移动一个窗口

WM_SIZE

0x0005

改变一个窗口的大小

WM_ACTIVATE

0x0006

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

WM_SETFOCUS

0x0007

获得焦点后

WM_KILLFOCUS

0x0008

失去焦点

WM_ENABLE

0x000A

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

WM_SETREDRAW

0x000B

设置窗口是否能重画

WM_SETTEXT

0x000C

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

WM_GETTEXT

0x000D

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

WM_GETTEXTLENGTH

0x000E

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

WM_PAINT

0x000F

要求一个窗口重绘自己

WM_CLOSE

0x0010

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

WM_QUERYENDSESSION

0x0011

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

WM_QUIT

0x0012

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

WM_QUERYOPEN

0x0013

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

WM_ERASEBKGND

0x0014

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

WM_SYSCOLORCHANGE

0x0015

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

WM_ENDSESSION

0x0016

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

WM_SHOWWINDOW

0x0018

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

WM_ACTIVATEAPP

0x001C

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

WM_FONTCHANGE

0x001D

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

WM_TIMECHANGE

0x001E

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

WM_CANCELMODE

0x001F

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

WM_SETCURSOR

0x0020

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

WM_MOUSEACTIVATE

0x0021

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

WM_CHILDACTIVATE

0x0022

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

WM_QUEUESYNC

0x0023

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

WM_GETMINMAXINFO

0x0024

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

WM_PAINTICON

0x0026

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

WM_ICONERASEBKGND

0x0027

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

WM_NEXTDLGCTL

0x0028

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

WM_SPOOLERSTATUS

0x002A

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

WM_DRAWITEM

0x002B

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

WM_MEASUREITEM

0x002C

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

WM_DELETEITEM

0x002D

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

WM_VKEYTOITEM

0x002E

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

WM_CHARTOITEM

0x002F

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

WM_SETFONT

0x0030

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

WM_GETFONT

0x0031

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

WM_SETHOTKEY

0x0032

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

WM_GETHOTKEY

0x0033

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

WM_QUERYDRAGICON

0x0037

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

WM_COMPAREITEM

0x0039

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

WM_COMPACTING

0x0041

显示内存已经很少了

WM_WINDOWPOSCHANGING

0x0046

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

WM_POWER

0x0048

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

WM_COPYDATA

0x004A

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

WM_CANCELJOURNAL

0x004B

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

WM_NOTIFY

0x004E

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

WM_INPUTLANGCHANGEREQUEST

0x0050

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

WM_INPUTLANGCHANGE

0x0051

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

WM_TCARD

0x0052

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

WM_HELP

0x0053

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

WM_USERCHANGED

0x0054

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

WM_NOTIFYFORMAT

0x0055

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

WM_CONTEXTMENU

0x007B

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

WM_STYLECHANGING

0x007C

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

WM_STYLECHANGED

0x007D

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

WM_DISPLAYCHANGE

0x007E

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

WM_GETICON

0x007F

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

WM_SETICON

0x0080

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

WM_NCCREATE

0x0081

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

WM_NCDESTROY

0x0082

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

WM_NCCALCSIZE

0x0083

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

WM_NCHITTEST

0x0084

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

WM_NCPAINT

0x0085

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

WM_NCACTIVATE

0x0086

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

WM_NCMOUSEMOVE

0x00A0

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

WM_NCLBUTTONDOWN

0x00A1

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

WM_NCLBUTTONUP

0x00A2

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

WM_NCLBUTTONDBLCLK

0x00A3

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

WM_NCRBUTTONDOWN

0x00A4

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

WM_NCRBUTTONUP

0x00A5

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

WM_NCRBUTTONDBLCLK

0x00A6

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

WM_NCMBUTTONDOWN

0x00A7

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

WM_NCMBUTTONUP

0x00A8

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

WM_NCMBUTTONDBLCL

0x00A9

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

WM_KEYDOWN

0x0100

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

WM_KEYUP

0x0101

释放一个非系统键

WM_CHAR

0x0102

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

WM_DEADCHAR

0x0103

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

WM_SYSKEYDOWN

0x0104

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

WM_SYSKEYUP

0x0105

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

WM_SYSCHAR

0x0106

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

WM_SYSDEADCHAR

0x0107

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

WM_INITDIALOG

0x0110

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

WM_COMMAND

0x0111

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

WM_SYSCOMMAND

0x0112

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

WM_TIMER

0x0113

发生了定时器事件

WM_HSCROLL

0x0114

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

WM_VSCROLL

0x0115

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

WM_INITMENU

0x0116

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

WM_INITMENUPOPUP

0x0117

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

WM_MENUSELECT

0x011F

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

WM_MENUCHAR

0x0120

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

WM_ENTERIDLE

0x0121

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

WM_MENURBUTTONUP

0x0122

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

WM_MENUDRAG

0x0123

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

WM_MENUGETOBJECT

0x0124

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

WM_UNINITMENUPOPUP

0x0125

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

WM_MENUCOMMAND

0x0126

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

WM_CHANGEUISTATE

0x0127

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

WM_UPDATEUISTATE

0x0128

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

WM_QUERYUISTATE

0x0129

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

WM_CTLCOLORMSGBOX

0x0132

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

WM_CTLCOLOREDIT

0x0133

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

WM_CTLCOLORLISTBOX

0x0134

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

WM_CTLCOLORBTN

0x0135

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

WM_CTLCOLORDLG

0x0136

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

WM_CTLCOLORSCROLLBAR

0x0137

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

WM_CTLCOLORSTATIC

0x0138

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

WM_MOUSEMOVE

0x0200

鼠标移动

WM_LBUTTONDOWN

0x0201

按下鼠标左键

WM_LBUTTONUP

0x0202

释放鼠标左键

WM_LBUTTONDBLCLK

0x0203

双击鼠标左键

WM_RBUTTONDOWN

0x0204

按下鼠标右键

WM_RBUTTONUP

0x0205

释放鼠标右键

WM_RBUTTONDBLCLK

0x0206

双击鼠标右键

WM_MBUTTONDOWN

0x0207

按下鼠标中键

WM_MBUTTONUP

0x0208

释放鼠标中键

WM_MBUTTONDBLCLK

0x0209

双击鼠标中键

WM_MOUSEWHEEL

0x020A

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

WM_PARENTNOTIFY

0x0210

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

WM_ENTERMENULOOP

0x0211

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

WM_EXITMENULOOP

0x0212

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

WM_SIZING

0x0214

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

WM_CAPTURECHANGED

0x0215

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

WM_MOVING

0x0216

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

WM_POWERBROADCAST

0x0218

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

WM_DEVICECHANGE

0x0219

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

WM_MDICREATE

0x0220

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

WM_MDIDESTROY

0x0221

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

WM_MDIACTIVATE

0x0222

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

WM_MDIRESTORE

0x0223

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

WM_MDINEXT

0x0224

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

WM_MDIMAXIMIZE

0x0225

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

WM_MDITILE

0x0226

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

WM_MDICASCADE

0x0227

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

WM_MDIICONARRANGE

0x0228

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

WM_MDIGETACTIVE

0x0229

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

WM_MDISETMENU

0x0230

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

WM_ENTERSIZEMOVE

0x0231

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

WM_EXITSIZEMOVE

0x0232

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

WM_DROPFILES

0x0233

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

WM_MDIREFRESHMENU

0x0234

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

WM_MOUSEHOVER

0x02A1

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

WM_MOUSELEAVE

0x02A3

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

WM_CUT

0x0300

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

WM_COPY

0x0301

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

WM_PASTE 

0x0302

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

WM_CLEAR

0x0303

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

WM_UNDO

0x0304

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

WM_DESTROYCLIPBOARD

0x0307

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

WM_DRAWCLIPBOARD

0x0308

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

WM_PAINTCLIPBOARD

0x0309

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

WM_VSCROLLCLIPBOARD

0x030A

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

WM_SIZECLIPBOARD

0x030B

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

WM_ASKCBFORMATNAME

0x030C

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

WM_CHANGECBCHAIN

0x030D

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

WM_HSCROLLCLIPBOARD

0x030E

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

WM_QUERYNEWPALETTE

0x030F

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

WM_PALETTEISCHANGING

0x0310

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

WM_PALETTECHANGED

0x0311

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

来改变系统调色板

WM_HOTKEY

0x0312

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

WM_PRINT

0x0317

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

WM_PRINTCLIENT

0x0318

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

WM_APP

0x8000

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

WM_USER

0x0400

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

3.3 总结

  表A-3  公告音信-按钮

1> ShellExecuteEx打开test.iqy的时先创制excel进度

消息名称

说 明

BN_CLICKED

单击按钮

BN_DISABLE

按钮被禁止

BN_DOUBLECLICKED

双击按钮

BN_HILITE

加亮按钮

BN_PAINT

按钮应当重画

BN_UNHILITE

加亮应当去掉

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

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

3> Post WM_DDE_EXECUTE给excel,告知打开test.iqy的命令

消息名称

说 明

CBN_CLOSEUP

组合框的列表框被关闭

CBN_DBLCLK

用户双击了一个字符串

CBN_DROPDOWN

组合框的列表框被拉下

CBN_EDITCHANGE

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

CBN_EDITUPDATE

组合框内的文本即将更新

CBN_ERRSPACE

组合框内存不足

CBN_KILLFOCUS

组合框失去输入焦点

CBN_SELCHANGE

在组合框中选择了一项

CBN_SELENDCANCEL

用户的选择将被忽略

CBN_SELENDOK

用户的选择将被执行

CBN_SETFOCUS

组合框获得输入焦点

4> ShellExecuteEx执行落成,但并不destroy “WorkerW”窗口

表A-5  文告音讯-编辑框

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

消息名称

说 明

EN_CHANGE

编辑框中的文本己更新

EN_ERRSPACE

编辑框内存不足

EN_HSCROLL

用户点击了水平滚动条

EN_KILLFOCUS

编辑框失去输入焦点

EN_MAXTEXT

插入的内容被截断

EN_SETFOCUS

编辑框获得输入焦点

EN_UPDATE

编辑框中的文本将要更新

EN_VSCROLL

用户点击了垂直滚动条

接近,大家得以创设一个带窗口的程序,启动后将其挂起,那时,即便直接双击打开test.iqy也会hang住。

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

 

消息名称

说 明

LBN_DBLCLK

用户双击了一项

LBN_ERRSPACE

列表框内存不足

LBN_KILLFOCUS

列表框正在失去输入焦点

LBN_SELCANCEL

用户选择被取消

LBN_SELCHANGE

用户选择将改变

LBN_SETFOCUS

列表框获得输入焦点

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

Windows新闻大全

因为双击打开实际是用explorer.exe打开,而explorer.exe是有窗口的,可以正常的收随地理WM_DDE_INITIATE消息

  Windows是一新闻(Message)驱动式系统,Windows信息提供了应用程序与应用程序之间、应用程序与Windows系统之间开展报道的手法。应用程序要促成的成效由信息来触发,并靠对新闻的响应和处理来成功。Windows系统中有二种新闻队列,一种是系统音信队列,另一种是应用程序信息队列。统计机的具备输入设备由
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

澳门金沙国际 115

TMsg = packedrecord

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

hwnd: HWND / /窗口句柄

澳门金沙国际 116

message: UINT / /信息常量标识符

可以是ShellExecuteEx内部创设的线程,所以win7上ShellExecuteEx制造了一个线程专门用来拍卖和excel的DDE信息通讯,那样就能正常的选择处理excel发过来的WM_DDE_INITIATE消息了

wParam: WPA R AM  // 32位音讯的特定附加音信

lParam: LPA R AM  // 32位消息的特定附加新闻

time: DWORD / /音信创设时的年华

pt: TPoint / /音讯创制时的鼠标地方

end

 

音讯中有怎样?

是不是觉得一个音信记录中的新闻像意大利语一样?倘若是那般,那么看一看上面的解释:

hwnd
32位的窗口句柄。窗口可以是其他类型的显示屏对象,因为Win32力所能及有限援救半数以上可视对象的句柄(窗口、对话框、按钮、编辑框等)。

message
用于区分其余音讯的常量值,那几个常量可以是Windows单元中预约义的常量,也得以是自定义的常量。

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

lParam
平时是一个针对性内存中数据的指针。由于WParm、lParam和Pointer都是32位的,因而,它们中间可以相互转换。

 

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

当用户窗口苏醒原先的大大小小地方时,把此新闻发送给某个图标

WM_ERASEBKGND = 20

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

WM_SYSCOLORCHANGE =21

当系统颜色改变时,发送此新闻给所有一级窗口

WM_ENDSESSION = 22

当系统经过爆发WM_QUERYENDSESSION音讯后,此新闻发送给应用程序,

文告它对话是还是不是终止

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

此信息由基于统计机的陶冶程序发送,通过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_WANTKEYBOARDINPUT风格的发出给它的持有者来响应WM_KEYDOWN消息

WM_CHARTOITEM = 47

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

WM_SETFONT = 48

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

WM_GETFONT = 49

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

WM_SETHOTKEY = 50

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

WM_GETHOTKEY = 51

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

WM_QUERYDRAGICON =55

此音讯发送给最小化窗口,当此窗口将要被拖放而它的类中绝非概念图标,应用程序能

重回一个图标或光标的句柄,当用户拖放图标时系统呈现那些图标或光标

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

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

WM_SETICON = 128

次第发送此音讯让一个新的大图标或小图标与某个窗口关联;

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_TIMER = 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

当调用ENPTYCLIPBOARD函数时 发送此新闻给剪贴板的所有者

WM_DRAWCLIPBOARD =776

当剪贴板的情节变更时发送此新闻给剪贴板观望链的首个窗口;它同意用剪贴板观望窗口来

展示剪贴板的新情节;

WM_PAINTCLIPBOARD =777

当剪贴板包括CF_OWNERDIPLAY格式的数目同时剪贴板观察窗口的客户区须求重画;

WM_VSCROLLCLIPBOARD= 778

WM_SIZECLIPBOARD =779

当剪贴板包蕴CF_OWNERDIPLAY格式的数据同时剪贴板观望窗口的客户区域的轻重已经改成是此新闻通过剪贴板观望窗口发送给剪贴板的所有者;

WM_ASKCBFORMATNAME= 780

因此剪贴板观望窗口发送此音讯给剪贴板的持有者来呼吁一个CF_OWNERDISPLAY格式的剪贴板的名字

WM_CHANGECBCHAIN =781

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

WM_HSCROLLCLIPBOARD= 782

此新闻通过一个剪贴板寓目窗口发送给剪贴板的主人;它爆发在当剪贴板包括CFOWNERDISPALY格式的数码同时有个事件在剪贴板观看窗的品位滚动条上;所有者应滚动剪贴板图象并立异滚动条的值;

WM_QUERYNEWPALETTE= 783

此信息发送给将要收到大旨的窗口,此音讯能使窗口在收受宗旨时同时有机遇已毕他的逻辑调色板

WM_PALETTEISCHANGING=784

当一个应用程序正要促成它的逻辑调色板时发此音信布告所有的应用程序

WM_PALETTECHANGED =785

此音信在一个有所主题的窗口完毕它的逻辑调色板后发送此音讯给持有顶尖并交汇的窗口,以此

来改变系统调色板

WM_HOTKEY = 786

当用户按下由REGISTERHOTKEY函数注册的热键时交因而音信

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 R 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 R R 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 R R S PA CE编辑框内存不足

E N _ H S C R 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 R O L L用户点击了僵直滚动条消息含义

列表框

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

L B N _ E R R 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列表框获得输入主旨

 

转载:

相关文章