至于windows操作系统之音信和新闻队列,Windows信息机制要点

by admin on 2019年1月31日

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来获取这几个值。

非队列信息
绕过了系统和线程新闻队列,非队列信息一向发送至窗口进程。系统独立发送非队列新闻来文告一个窗口,一个轩然大波影响了它。例如,当用户激活一个新窗口,系统发送给窗口
WM_ACTIVATE, WM_SETFOCUS, and
WM_SETCURSOR新闻。那一个音信布告窗口它早已被激活了,键盘输入正指向该窗口,鼠标光标已经移至了窗口边框内。当应用程序调用某些系统函数时,也会窗口非队列消息,比如,应用程序在调用SetWindowPos时,系统将发送WM_WINDOWPOSCHANGED消息。

些微新闻发送非队列音讯:BroadcastSystemMessage,
BroadcastSystemMessageEx, SendMessage, SendMessage提姆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_至于windows操作系统之音信和新闻队列,Windows信息机制要点。TOPMOST,发送WM_TIMECHANGE.你也得以因此BroadcastSystemMessage函数,并给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

home88一必发 1typedef struct tagMsg
home88一必发 2{
home88一必发 3       HWND    hwnd;       //接受该音讯的窗口句柄
home88一必发 4       UINT    message;    //新闻常量标识符,也就是我们寻常所说的信息号
home88一必发 5       WPARAM  wParam;     //32位新闻的一定附加新闻,确切含义依赖于新闻值
home88一必发 6       LPARAM  lParam;     //32位新闻的一定附加音信,确切含义看重于新闻值
home88一必发 7       DWORD   time;       //音讯成立时的时日
home88一必发 8       POINT   pt;         //新闻成立时的鼠标/光标在显示屏坐标系中的地方
home88一必发 9}MSG;
home88一必发 10

音讯相关函数:

DispatchMessage

LONG DispatchMessage(
const MSG* lpmsg
);
1.该函数将音信,通过系统派发给窗口进度
2.万一是一个定时器音讯,lParam参数不是空,

 

3 新闻队列(Message Queues) 
Windows中有两连串型的音讯队列
1) 系统新闻队列(System Message Queue) 那是一个连串唯一的Queue,设备驱动(mouse,
keyboard)会把操作输入转化成音信存在系统队列中,然后系统会把此信息放到目的窗口所在的线程的新闻队列(thread-specific
message queue)中等待处理
2) 线程新闻队列(Thread-specific Message Queue) 每一个GUI线程都会维护这么一个线程音讯队列。(这一个行列唯有在线程调用GDI函数时才会创设,默许不创建)。然后线程音讯队列中的信息会被送到相应的窗口进度(WndProc)处理.
专注:
线程音讯队列中WM_PAINT,WM_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)等, 
BroadcastSystemMessage这几个API可以对以上系统组件发送信息。

列表框控件
 LBN_DBLCLK 用户双击了一项
 LBN_ERRSPACE 列表框内存不够
 LBN_KILLFOCUS 列表框正在失去输入主题
 LBN_SELCANCEL 采纳被撤除
至于windows操作系统之音信和新闻队列,Windows信息机制要点。 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的目的是为了裁减刷新窗口的次数。
home88一必发 11

4.只要应用程序正在创制顶层窗口时调用PeekMessage,将招致窗口窗口被创造在Z-Order的末梢。你须要在PeekMessage后,显式调用SetForegroundWindow。倘若应用程序以及有一个放到窗口了,那么新窗口将被内置。

PostMessage
应用程序要用HWND_BROADCAST进行程序间的交互,音信应该得到于RegisterWindowMessage()

bool shell_execute_file(wstring file_path)
{
    SHELLEXECUTEINFOW shell_exec_info = { 0 };
    shell_exec_info.cbSize = sizeof(SHELLEXECUTEINFOW);
    shell_exec_info.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_FLAG_NO_UI;
    shell_exec_info.hwnd = NULL;
    shell_exec_info.lpVerb = NULL;
    shell_exec_info.lpFile = file_path.c_str();
    shell_exec_info.lpParameters = NULL;
    shell_exec_info.lpDirectory = NULL;
    shell_exec_info.nShow = SW_SHOW;
    shell_exec_info.hInstApp = NULL;
    bool ret = ShellExecuteExW(&shell_exec_info);
    printf("process handle is %p\n", shell_exec_info.hProcess);

    return ret;
}

home88一必发 12
   
非队列新闻将会绕过系统队列和音信队列,间接将信息发送到窗口进度,。系统发送非队列音讯通告窗口,系统发送音讯布告窗口。例如,当用户激活一个窗口系统发送WM_ACTIVATE,
WM_SETFOCUS, and
WM_SETCURSOR。那几个新闻布告窗口它被激活了。非队列音信也得以由当应用程序调用系统函数爆发。例如,当程序调用SetWindowPos系统发送WM_WINDOWPOSCHANGED新闻。一些函数也发送非队列新闻,例如上面我们要谈到的函数。
     
新闻的出殡
    
通晓了上边的这个基础理论之后,大家就可以开展一下粗略的新闻发送与接收。
     把一个音讯发送到窗口有3种办法:发送、寄送和播音。
    
发送消息的函数有SendMessage、SendMessageCallback、SendNotifyMessage、
SendMessage提姆eout;寄送信息的函数首要有PostMessage、PostThreadMessage、
PostQuitMessage;广播信息的函数我知道的唯有BroadcastSystemMessage、
布罗德castSystemMessageEx。
     SendMessage的原型如下:LRESULT SendMessage(HWND hWnd,UINT
Msg,WPARAM wParam,LPARAM
lParam),那么些函数重如若向一个或多个窗口发送一条音讯,一贯等到新闻被拍卖未来才会回来。不过必要留意的是,如若收到音讯的窗口是同一个应用程序的一有些,那么那一个窗口的窗口函数就被看作一个子程序及时被调用;如若接受新闻的窗口是被别的的线程所创办的,那么窗口系统就切换来相应的线程并且调用相应的窗口函数,那条信息不会被放进目的应用程序队列中。函数的再次回到值是由接收新闻的窗口的窗口函数重返,再次回到的值取决于被发送的音信。
     PostMessage的原型如下:BOOL PostMessage(HWND hWnd,UINT Msg,WPARAM
wParam,LPARAM
lParam),该函数把一条新闻放置到创制hWnd窗口的线程的音信队列中,该函数不等新闻被拍卖就应声将控制再次回到。需求留意的是,如果hWnd参数为
HWND_BROADCAST,那么,音讯将被寄送给系统中的所有的重合窗口和弹出窗口,可是子窗口不会收到该音信;假使hWnd参数为NULL,则该函数类似于将dwThreadID参数设置成当下线程的标志来调用PostThreadMEssage函数。
  从地方的那2个具有代表性的函数,我们可以看来信息的出殡格局和寄送格局的界别所在:被发送的音讯是还是不是会被立即处理,函数是不是及时回去。被发送的信息会被马上处理,处理完成后函数才会回到;被寄送的音信不会被当即处理,他被置于一个先进先出的行列中,平昔等到应用程序空线的时候才会被拍卖,不过函数放置音讯后旋即赶回。
home88一必发 13
  实际上,发送新闻到一个窗口处理进度和直接调用窗口处理进程之间并从未太大的分裂,他们平昔的唯一不同就在于你可以要求操作系统截获所有被发送的音信,可是不可能收获对窗口处理进程的平素调用。
  以寄送措施发送的消息平常是与用户输入事件相对应的,因为这个事件不是更加急迫,可以开展缓慢的缓冲处理,例如鼠标、键盘音讯会被寄送,而按钮等音信则会被发送。
  广播信息用得相比少,BroadcastSystemMessage函数原型如下:
      long BroadcastSystemMessage(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马克斯);该函数用来取得与hWnd参数所指定的窗口相关的且wMsgFilterMin和wMsgFilter马克斯参数所付出的音信值范围内的新闻。需求小心的是,假设hWnd为NULL,则GetMessage获取属于调用该函数应用程序的任一窗口的新闻,借使wMsgFilterMin和wMsgFilter马克斯都是0,则GetMessage就再次来到所有可取得的音信。函数获取之后将去除音讯队列中的除
WM_PAINT音讯之外的别的音信,至于WM_PAINT则唯有在其处理将来才被去除。
   PeekMessage原型如下:BOOL PeekMessage(LPMSG lpMsg,HWND hWnd,UINT
wMsgFilterMin,UINT wMsgFilterMax,UINT
wRemoveMsg);该函数用于查看应用程序的音信队列,如若内部有音信就将其放入lpMsg所指的结构中,可是,与GetMessage不一样的是,PeekMessage函数不会等到有音讯放入队列时才回去。同样,如若hWnd为NULL,则PeekMessage获取属于调用该函数应用程序的任一窗口的音信,就算hWnd=-1,那么函数只回去把hWnd参数为NULL的PostAppMessage函数送去的信息。如若wMsgFilterMin和wMsgFilter马克斯都是0,则PeekMessage就回来所有可得到的信息。函数获取之后将视最终一个参数来决定是不是删除信息队列中的除
WM_PAINT消息之外的其余新闻,至于WM_PAINT则只有在其处理未来才被删去。
   WaitMessage原型如下:BOOL
WaitMessage();当一个应用程序无事可做时,该函数就将控制权交给其它的应用程序,同时将该应用程序挂起,直到一个新的音讯被放入应用程序的队列之中才回去。

该函数只是简短申明被呼吁终止的线程将会停止。接收WM_QUIT的线程,应该告一段落音讯循环,并将控制权交给系统。重临给系统的淡出值,一定是WM_QUIT的wParam参数

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

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


RegisterWindowMessage
同一字符串,注册的值,在任何连串中是唯一的


SendMessage

3. 缘故分析

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

非音讯队列情势,直接调用窗口进程,系统当下切换来收到线程执行,发送线程锁住,知道接收线程处理已毕

SendMessageTimeout

3.1 excel hang在哪里?

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

该函数通过调用窗口进程的法子发送信息,如果窗口属于分歧线程,SendMessage提姆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住的地点

 

home88一必发 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()来发送音信的。

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

查阅参数知excel调用NtUserMessageCall()类似如下:

  那里大家承受所有的键盘音讯,所以就用WM_KEYFIRST 和
WM_KEYLAST作为参数。最终一个参数可以是PM_NOREMOVE 或者
PM_REMOVE,表示新闻音信是还是不是应当从音信队列中删除。                 
   所以那段小代码就是判定是不是按下了Esc键,假设是就开展拍卖。

NtUserMessageCall(HWND_BROADCAST, WM_DDE_INITIATE)

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

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

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

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

 

 

音讯分流器
  平时的窗口进程是经过一个switch语句来落成的,这些事情很烦,有没有更省事的点子吗?有,那就是音信分流器,利用音讯分流器,大家可以把switch语句分成更小的函数,每一个消息都对应一个小函数,那样做的补益就是对消息更便于管理。
  之所以被称为新闻分流器,就是因为它可以对别的消息举行分流。上面大家做一个函数就很了解了:

3.2 为了验证3.1.1的猜测,用API Monitor一下ShellExecuteEx

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

3.2.1
根据微软的文档可见,发送DDE音讯除了WM_DDE_INITIATE和WM_DDE_ACK之外用的都是PostMessage

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

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

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

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

home88一必发 102

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

call stack呈现的确是ShellExecuteEx所调用

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

home88一必发 105

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

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

好了,事情到了这一步,应该全套都晴朗了。
然而,大家发现在windowsx.h里面还有一个宏:FORWARD_WM_XXXX,大家如故那WM_COMMAND为例,举办辨析:

留神到下一个API GetWindowThreadProcessId ( 0x00310172 , 0x0012fb70
),刚好是得到那个窗口的pid和tid,查看下参数窗口:

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

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

从而其实,FORWARD_WM_XXXX将音信参数举办了双重协会,生成了wParam &&
lParam,然后调用了俺们定义的函数。

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

home88一必发 111

MFC的新闻映射的基类CCmdTarget
  假设你想让您的控件可以举办信息映射,就务须从CCmdTarget类中派生。CCmdTarget类是MFC处理命令信息的根基、宗旨。MFC为此类设计了众多成员函数和一部分分子数量,基本上是为了化解消息映射难点的,所有响应音讯或事件的类都从它派生,例如:应用程序类、框架类、文档类、视图类和五光十色的控件类等等,还有不少。
但是这几个类里面有2个函数对新闻映射卓殊重大,一个是静态成员函数DispatchCmdMsg,另一个是虚函数OnCmdMsg。
DispatchCmdMsg专门供MFC内部使用,用来散发Windows音信。OnCmdMsg用来传递和发送信息、更新用户界面对象的事态。
CCmdTarget对OnCmdMsg的默许完结:在现阶段命令目的(this所指)的类和基类的新闻映射数组里搜寻指定命令信息的新闻处理函数。
  那里运用虚拟函数GetMessageMap获得命令目的类的音讯映射入口数组_messageEntries,然后在数组里匹配命令消息ID相同、控制文告代码也同样的音讯映射条目。其中GetMessageMap是虚拟函数,所以能够肯定当前命令目的的确切类。
若果找到了一个匹配的新闻映射条目,则应用DispachCmdMsg调用那个处理函数;
借使没有找到,则采取_GetBaseMessageMap得到基类的音讯映射数组,查找,直到找到或探寻了具有的基类(到CCmdTarget)甘休;
倘诺最后没有找到,则赶回FASLE。
  每个从CCmdTarget派生的下令目标类都得以覆盖OnCmdMsg,利用它来确定是或不是可以拍卖某条命令,倘使不能够,就经过调用下一下令目标的
OnCmdMsg,把该命令送给下一个命令目的处理。经常,派生类覆盖OnCmdMsg时,要调用基类的被遮盖的OnCmdMsg。
  在MFC框架中,一些MFC命令目的类掩盖了OnCmdMsg,如框架窗口类掩盖了该函数,完毕了MFC的规范命令信息发送路径。需求的话,应用程序也得以覆盖OnCmdMsg,改变一个或多少个类中的发送规定,完结与规范框架发送规定不相同的出殡路径。例如,在偏下意况可以作那样的处理:在要打断发送顺序的类中把命令传给一个非MFC默许对象;在新的非默许对象中或在可能要传播命令的命令目的中。

home88一必发 112

音讯映射的始末
   
通过ClassWizard为大家转变的代码,大家得以见到,信息映射基本上分为2多数:
   
在头文件(.h)中有一个宏DECLARE_MESSAGE_MAP(),他被放在了类的末段,是一个public属性的;与之相应的是在完毕部分(.cpp)扩展了一章音讯映射表,内容如下:
    BEGIN_MESSAGE_MAP(当前类, 当前类的基类)
       //{{AFX_MSG_MAP(CMainFrame)
         新闻的入口项
       //}}AFX_MSG_MAP
   END_MESSAGE_MAP()
  
不过仅是那两项还远不足以完毕一条新闻,倘使一个信息工作,必须有以下3个部分去合营:
1.在类的定义中进入相应的函数注解;
2.在类的音信映射表中加入相应的音信映射入口项;
3.在类的达成中出席相应的函数体;

 

音信的拉长
  
有了上边的那几个只是作为基础,大家接下去就做大家最熟稔、最常用的做事:添加音讯。MFC音信的丰盛紧要有2种艺术:自动/手动,大家就以那2种格局为例,说一下怎么样添加新闻。
   1、利用Class Wizard完成机关抬高
      在菜单中选拔View–>Class
Wizard,也可以用单击鼠标右键,采纳Class Wizard,同样可以激活Class
Wizard。选用Message Map标签,从Class
name组合框中接纳大家想要添加音讯的类。在Object
IDs列表框中,选拔类的称呼。此时,
Messages列表框展现此类的多数(若不是整整的话)可重载成员函数和窗口音信。类重载呈现在列表的上部,以实际虚构成员函数的大小写字母来表示。其余为窗口音信,以大写字母出现,描述了实在窗口所能响应的新闻ID。选中大家向添加的音信,单击Add
Function按钮,Class Wizard自动将该音讯添加进去。
     
有时候,大家想要添加的消息本应该出现在Message列表中,但是就是找不到,怎么做?不要心急,大家得以行使Class
Wizard上Class Info标签以恢宏新闻列表。在该页中,找到Message
Filter组合框,通过它可以变更首页中Messages列表框中的选项。那里,大家选拔Window,从而显示所有的窗口信息,一把状态下,你想要添加的信息就可以在Message列表框中现身了,如若还从未,那就随之往下看:)

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

   home88一必发,2、手动地加上音讯处理函数
   
若是在Messages列表框中如故看不到大家想要的新闻,那么该音讯可能是被系统忽略掉或者是你协调成立的,在那种情况下,就亟须团结手工添加。依照大家面前所说的信息工作的3个部件,我们各种进行处理:
      1) 在类的.
h文件中添加处理函数的申明,紧接在//}}AFX_MSG行之后加盟申明,注意:一定要以afx_msg开头。
     日常,添加处理函数注脚的最好的地点是源代码中Class
Wizard维护的表上面,然而在它标志其领域的{{}}括弧外面。这么些括弧中的任何东西都将会被Class
Wizard销毁。
      2)
接着,在用户类的.cpp文件中找到//}}AFX_MSG_MAP行,紧接在它之后出席信息入口项。同样,也是放在{
{} }的外场
      3) 最终,在该公文中添加新闻处理函数的实业。

home88一必发 113

 

翻看一下buff的地址:

 

home88一必发 114

消息范围

说 明

0 ~ WM_USER – 1

系统消息

WM_USER ~ 0x7FFF

自定义窗口类整数消息

WM_APP ~ 0xBFFF

应用程序自定义消息

0xC000 ~ 0xFFFF

应用程序字符串消息

> 0xFFFF

为以后系统应用保留

恰恰就是开拓test.iqy的一声令下,表明ShellExecuteEx就是先成立了excel的历程,然后发送test.iqy的公文命令给excel打开。

表A-2  常用Windows消息

 

消息名称

说  明

WM_NULL 

0x0000

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

WM_CREATE 

0x0001

应用程序创建一个窗口

WM_DESTROY

0x0002

一个窗口被销毁

WM_MOVE

0x0003

移动一个窗口

WM_SIZE

0x0005

改变一个窗口的大小

WM_ACTIVATE

0x0006

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

WM_SETFOCUS

0x0007

获得焦点后

WM_KILLFOCUS

0x0008

失去焦点

WM_ENABLE

0x000A

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

WM_SETREDRAW

0x000B

设置窗口是否能重画

WM_SETTEXT

0x000C

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

WM_GETTEXT

0x000D

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

WM_GETTEXTLENGTH

0x000E

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

WM_PAINT

0x000F

要求一个窗口重绘自己

WM_CLOSE

0x0010

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

WM_QUERYENDSESSION

0x0011

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

WM_QUIT

0x0012

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

WM_QUERYOPEN

0x0013

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

WM_ERASEBKGND

0x0014

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

WM_SYSCOLORCHANGE

0x0015

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

WM_ENDSESSION

0x0016

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

WM_SHOWWINDOW

0x0018

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

WM_ACTIVATEAPP

0x001C

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

WM_FONTCHANGE

0x001D

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

WM_TIMECHANGE

0x001E

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

WM_CANCELMODE

0x001F

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

WM_SETCURSOR

0x0020

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

WM_MOUSEACTIVATE

0x0021

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

WM_CHILDACTIVATE

0x0022

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

WM_QUEUESYNC

0x0023

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

WM_GETMINMAXINFO

0x0024

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

WM_PAINTICON

0x0026

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

WM_ICONERASEBKGND

0x0027

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

WM_NEXTDLGCTL

0x0028

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

WM_SPOOLERSTATUS

0x002A

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

WM_DRAWITEM

0x002B

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

WM_MEASUREITEM

0x002C

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

WM_DELETEITEM

0x002D

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

WM_VKEYTOITEM

0x002E

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

WM_CHARTOITEM

0x002F

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

WM_SETFONT

0x0030

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

WM_GETFONT

0x0031

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

WM_SETHOTKEY

0x0032

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

WM_GETHOTKEY

0x0033

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

WM_QUERYDRAGICON

0x0037

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

WM_COMPAREITEM

0x0039

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

WM_COMPACTING

0x0041

显示内存已经很少了

WM_WINDOWPOSCHANGING

0x0046

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

WM_POWER

0x0048

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

WM_COPYDATA

0x004A

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

WM_CANCELJOURNAL

0x004B

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

WM_NOTIFY

0x004E

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

WM_INPUTLANGCHANGEREQUEST

0x0050

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

WM_INPUTLANGCHANGE

0x0051

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

WM_TCARD

0x0052

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

WM_HELP

0x0053

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

WM_USERCHANGED

0x0054

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

WM_NOTIFYFORMAT

0x0055

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

WM_CONTEXTMENU

0x007B

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

WM_STYLECHANGING

0x007C

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

WM_STYLECHANGED

0x007D

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

WM_DISPLAYCHANGE

0x007E

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

WM_GETICON

0x007F

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

WM_SETICON

0x0080

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

WM_NCCREATE

0x0081

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

WM_NCDESTROY

0x0082

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

WM_NCCALCSIZE

0x0083

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

WM_NCHITTEST

0x0084

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

WM_NCPAINT

0x0085

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

WM_NCACTIVATE

0x0086

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

WM_NCMOUSEMOVE

0x00A0

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

WM_NCLBUTTONDOWN

0x00A1

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

WM_NCLBUTTONUP

0x00A2

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

WM_NCLBUTTONDBLCLK

0x00A3

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

WM_NCRBUTTONDOWN

0x00A4

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

WM_NCRBUTTONUP

0x00A5

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

WM_NCRBUTTONDBLCLK

0x00A6

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

WM_NCMBUTTONDOWN

0x00A7

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

WM_NCMBUTTONUP

0x00A8

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

WM_NCMBUTTONDBLCL

0x00A9

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

WM_KEYDOWN

0x0100

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

WM_KEYUP

0x0101

释放一个非系统键

WM_CHAR

0x0102

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

WM_DEADCHAR

0x0103

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

WM_SYSKEYDOWN

0x0104

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

WM_SYSKEYUP

0x0105

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

WM_SYSCHAR

0x0106

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

WM_SYSDEADCHAR

0x0107

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

WM_INITDIALOG

0x0110

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

WM_COMMAND

0x0111

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

WM_SYSCOMMAND

0x0112

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

WM_TIMER

0x0113

发生了定时器事件

WM_HSCROLL

0x0114

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

WM_VSCROLL

0x0115

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

WM_INITMENU

0x0116

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

WM_INITMENUPOPUP

0x0117

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

WM_MENUSELECT

0x011F

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

WM_MENUCHAR

0x0120

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

WM_ENTERIDLE

0x0121

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

WM_MENURBUTTONUP

0x0122

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

WM_MENUDRAG

0x0123

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

WM_MENUGETOBJECT

0x0124

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

WM_UNINITMENUPOPUP

0x0125

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

WM_MENUCOMMAND

0x0126

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

WM_CHANGEUISTATE

0x0127

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

WM_UPDATEUISTATE

0x0128

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

WM_QUERYUISTATE

0x0129

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

WM_CTLCOLORMSGBOX

0x0132

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

WM_CTLCOLOREDIT

0x0133

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

WM_CTLCOLORLISTBOX

0x0134

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

WM_CTLCOLORBTN

0x0135

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

WM_CTLCOLORDLG

0x0136

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

WM_CTLCOLORSCROLLBAR

0x0137

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

WM_CTLCOLORSTATIC

0x0138

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

WM_MOUSEMOVE

0x0200

鼠标移动

WM_LBUTTONDOWN

0x0201

按下鼠标左键

WM_LBUTTONUP

0x0202

释放鼠标左键

WM_LBUTTONDBLCLK

0x0203

双击鼠标左键

WM_RBUTTONDOWN

0x0204

按下鼠标右键

WM_RBUTTONUP

0x0205

释放鼠标右键

WM_RBUTTONDBLCLK

0x0206

双击鼠标右键

WM_MBUTTONDOWN

0x0207

按下鼠标中键

WM_MBUTTONUP

0x0208

释放鼠标中键

WM_MBUTTONDBLCLK

0x0209

双击鼠标中键

WM_MOUSEWHEEL

0x020A

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

WM_PARENTNOTIFY

0x0210

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

WM_ENTERMENULOOP

0x0211

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

WM_EXITMENULOOP

0x0212

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

WM_SIZING

0x0214

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

WM_CAPTURECHANGED

0x0215

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

WM_MOVING

0x0216

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

WM_POWERBROADCAST

0x0218

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

WM_DEVICECHANGE

0x0219

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

WM_MDICREATE

0x0220

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

WM_MDIDESTROY

0x0221

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

WM_MDIACTIVATE

0x0222

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

WM_MDIRESTORE

0x0223

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

WM_MDINEXT

0x0224

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

WM_MDIMAXIMIZE

0x0225

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

WM_MDITILE

0x0226

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

WM_MDICASCADE

0x0227

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

WM_MDIICONARRANGE

0x0228

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

WM_MDIGETACTIVE

0x0229

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

WM_MDISETMENU

0x0230

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

WM_ENTERSIZEMOVE

0x0231

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

WM_EXITSIZEMOVE

0x0232

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

WM_DROPFILES

0x0233

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

WM_MDIREFRESHMENU

0x0234

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

WM_MOUSEHOVER

0x02A1

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

WM_MOUSELEAVE

0x02A3

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

WM_CUT

0x0300

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

WM_COPY

0x0301

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

WM_PASTE 

0x0302

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

WM_CLEAR

0x0303

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

WM_UNDO

0x0304

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

WM_DESTROYCLIPBOARD

0x0307

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

WM_DRAWCLIPBOARD

0x0308

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

WM_PAINTCLIPBOARD

0x0309

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

WM_VSCROLLCLIPBOARD

0x030A

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

WM_SIZECLIPBOARD

0x030B

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

WM_ASKCBFORMATNAME

0x030C

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

WM_CHANGECBCHAIN

0x030D

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

WM_HSCROLLCLIPBOARD

0x030E

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

WM_QUERYNEWPALETTE

0x030F

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

WM_PALETTEISCHANGING

0x0310

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

WM_PALETTECHANGED

0x0311

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

来改变系统调色板

WM_HOTKEY

0x0312

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

WM_PRINT

0x0317

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

WM_PRINTCLIENT

0x0318

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

WM_APP

0x8000

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

WM_USER

0x0400

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

3.3 总结

  表A-3  文告新闻-按钮

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

消息名称

说 明

BN_CLICKED

单击按钮

BN_DISABLE

按钮被禁止

BN_DOUBLECLICKED

双击按钮

BN_HILITE

加亮按钮

BN_PAINT

按钮应当重画

BN_UNHILITE

加亮应当去掉

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

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

3> Post WM_DDE_EXECUTE给excel,告知打开test.iqy的吩咐

消息名称

说 明

CBN_CLOSEUP

组合框的列表框被关闭

CBN_DBLCLK

用户双击了一个字符串

CBN_DROPDOWN

组合框的列表框被拉下

CBN_EDITCHANGE

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

CBN_EDITUPDATE

组合框内的文本即将更新

CBN_ERRSPACE

组合框内存不足

CBN_KILLFOCUS

组合框失去输入焦点

CBN_SELCHANGE

在组合框中选择了一项

CBN_SELENDCANCEL

用户的选择将被忽略

CBN_SELENDOK

用户的选择将被执行

CBN_SETFOCUS

组合框获得输入焦点

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

表A-5  公告音信-编辑框

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

消息名称

说 明

EN_CHANGE

编辑框中的文本己更新

EN_ERRSPACE

编辑框内存不足

EN_HSCROLL

用户点击了水平滚动条

EN_KILLFOCUS

编辑框失去输入焦点

EN_MAXTEXT

插入的内容被截断

EN_SETFOCUS

编辑框获得输入焦点

EN_UPDATE

编辑框中的文本将要更新

EN_VSCROLL

用户点击了垂直滚动条

好像,我们得以创建一个带窗口的先后,启动后将其挂起,那时,即使直接双击打开test.iqy也会hang住。

表A-6  布告音讯-列表框

 

消息名称

说 明

LBN_DBLCLK

用户双击了一项

LBN_ERRSPACE

列表框内存不足

LBN_KILLFOCUS

列表框正在失去输入焦点

LBN_SELCANCEL

用户选择被取消

LBN_SELCHANGE

用户选择将改变

LBN_SETFOCUS

列表框获得输入焦点

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

Windows新闻大全

因为双击打开实际是用explorer.exe打开,而explorer.exe是有窗口的,可以健康的收纳处理WM_DDE_INITIATE消息

  Windows是一音信(Message)驱动式系统,Windows信息提供了应用程序与应用程序之间、应用程序与Windows系统之间展开报纸发表的招数。应用程序要完毕的机能由新闻来触发,并靠对新闻的响应和处理来形成。Windows系统中有三种音讯队列,一种是系统音信队列,另一种是应用程序新闻队列。统计机的持有输入设备由
Windows监控,当一个事变暴发时,Windows先将输入的音讯放入系统新闻队列中,然后再将输入的音信拷贝到相应的应用程序队列中,应用程序中的新闻循环从它的音信队列中搜寻每一个信息并发送给相应的窗口函数中。一个轩然大波的爆发,到达处理它的窗口函数必须经历上述进程。值得注意的是音讯的非领先性,即无论是事件的急与缓,总是按到达的顺序排队(一些系统新闻除外),那就使得一些表面实时事件或者得不到当下的处理。

 

  由于Windows本身是由音讯使得的,举一个例子来证实这几个难点。打开记事本程序,该程序有一个File菜单,那么,在运作该应用程序的时候,假使用户单击了File菜单里New命令时,那一个动作将被Windows
(而不是应用程序本身!)所捕获,Windows经过分析得知这些动作应该由地点所说的这些应用程序去处理,既然是那样,Windows就发送了个名叫WM_COMMAND的音讯给应用程序,该消息所蕴藏消息告诉应用程序:”用户单击了New菜单”,应用程序得知这一新闻之后,采用对应的动作来响应它,这几个进程称为新闻处理。Windows为每一个应用程序(确切地就是每一个线程)维护了对应的新闻队列,应用程序的职务就是不停的从它的音讯队列中拿走信息,分析音信和处理音信,直到一条吸收名为WM_QUIT信息为止,那个进度一般是由一种叫做新闻循环的程序结构来促成的。

5. 为啥win7上不会有诸如此类的难点

  音讯我是用作一个记录传递给应用程序的,那些记录中包蕴了音信的项目以及其它新闻。例如,对于单击鼠标所发生的消息以来,那一个记录中蕴藏了单击鼠标时的坐标。这几个记录类型叫做T
M s g,它在Wi n d o w s单元中是如此表明的:

5.1 在API Monitor中看下PostMessageW

type

home88一必发 115

TMsg = packedrecord

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

hwnd: HWND / /窗口句柄

home88一必发 116

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

可见是ShellExecuteEx内部创造的线程,所以win7上ShellExecuteEx创制了一个线程专门用来拍卖和excel的DDE新闻通讯,那样就能健康的采纳处理excel发过来的WM_DDE_INITIATE消息了

wParam: WPA 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列表框获得输入宗旨

 

转载:

发表评论

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

网站地图xml地图