Menu
Woocommerce Menu

系统消息,但直接双击”3522vip靠谱吗test.iqy”是没有问题的

0 Comment


1. 问题

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

音信是指什么?
    
新闻系统对此一个win32前后相继来说特别至关心注重要,它是七个程序运转的动源泉。四个新闻,是系统定义的一个33位的值,他唯生机勃勃的概念了五个事变,向
Windows发出三个通报,告诉应用程序有个别事情时有爆发了。举例,单击鼠标、改造窗口尺寸、按下键盘上的二个键都会使Windows发送贰个音信给应用程序。
   
消息笔者是用作贰个记录传递给应用程序的,这几个记录中蕴藏了消息的门类以致其余音讯。举个例子,对于单击鼠标所发出的消息的话,这么些记录中包蕴了单击鼠标时的坐标。那个记录类型叫做MSG,MSG含有来自windows应用程序音信队列的新闻新闻,它在Windows中宣示如下:

关于windows操作系统之消息和消息队列

关于新闻和音信队列
不像基于MS-DOS的应用程序,基于Windows的次第是事件驱动的。他们不做任何突显调用来获取输入。而是经过等待系统传递给她们。

系统为应用程序传递全数输入到程序中的分裂窗口。每一种窗口都有二个叫作窗口进程的函数,用于拍卖全体到该窗口的输入。窗口管理进度管理输入,并将决定重临给系统。

风流倜傥经叁个顶层窗口结束响应新闻超过两秒,系统将会以为该窗口为非响应状态。在此种景象下,系统将隐形该窗口并用具备相像Z顺序,地方,尺寸和可视化属性的ghost窗口代替该窗口。这种意况下,允许客商移动它,也许退换他的尺寸,以至关闭应用程序。然后,那也是唯有能够做的动作,因为应用程序现在是不响应的。当在调治情状下,系统不会时有爆发ghost窗口。

本条段子,研讨如下主旨:
windows消息
系统以音讯的样式传递输入到窗口的管理进程。系统和应用程序均可产生新闻。系统在历次输入事件时,发生三个音信,举个例子,当用于打击,移动鼠标或然点击滚动条大器晚成类的控件。应用程序引起系统改变也会导致系统产生信息,比方四个应用程序改动了系统的字体财富池或然改换了她和睦窗口的尺寸。三个应用程序能够生出如此的消息,该新闻能够携带她的窗口直接实行任务照旧和别的应用程序的窗口实行互动。

音信分类:
系统定义信息
当系统和应用程序交互时,系统一发布送系统新闻,以调节应用程序的操作以至给程序传递输入或然其余音讯。应用程序也能够发送系统消息,应用程序平常用这一个音信来决定通过先行登记的窗口类创制的窗口的一坐一起。

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

大概上,windows新闻覆盖了二个比较宽的约束,包涵鼠标键盘,菜单,对话框输入,窗口创制管理,DDE动态数据沟通

应用程序定义的音信
应用程序能够创制新闻,其自作者窗口可以利用,也足以用来和其余进程打开相互。

音讯标志符的值应用如下:
1.系列保留了0x0000-0x03ff(即wm_user-1),应用程序无法动用那么些值用于个人音讯
2.0×0400(WM_USE路虎极光)-0x7fff能够用来个人新闻
3.比如应用程序在4.0系统上,你能够行使0x8000(wm_app)-0xbfff于个人音信
4.RegisterWindowMessage重返的值在0XC000-0XFFFF之间。这一个函数的重回值,可以制止别的进程用近似值而引起的冲突

音讯路由
利用使用二种艺术来窗口进度音信的渠道:post类音信是通过先进先出的新闻队列情势,音信队列是临时存储新闻的种类定义内部存款和储蓄器对象,以致sending类新闻直接达到窗口进度。

队列新闻1
系统在同一时候能够呈现任性数量的窗口。为了路由鼠标键盘输入到科学的窗口,系统使用了音信队列。

系统一保险证了一个种类音信队列,并为每一种GUI线程维护了而八个线程专有音信队列。为了避免为非GUI线程过多创设新闻队列,全体线程在开创时髦未音信队列。系统仅仅在线程第叁回发起某个特地顾客函数时,创立线程新闻队列;没有GUI函数调用将唤起消息队列的创制。

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

队列新闻2
此外时候,客户移动鼠标,点击按键也许敲击键盘,鼠标或许键盘驱动将退换这一个输入为新闻,并将它们放到系统音讯队列中。系统在检查评定它们的目窗口时,同不经常候从系统信息队列中移除它们。然后将他们发送到消息相关窗口的窗口创立线程。线程从它们的消息队列中抽取全体鼠标和键盘音信。线程从它们的队列中剔除音讯,并引导系统将它们发送到精确的窗口进度举行拍卖。

除了WM_PATIN,WM_TIMER,WM_QUIT消息外,系统一贯将它们发送到音信队列的结尾,以担保输入音讯的FIFO连串,仅当新闻对用中并没有其余音信之后,WM_PATIN,WM_TIMER,WM_QUIT才被向前推至窗口管理进度。再不怕,三个WM_PAINT音信将被合併为八个,分明全数顾客端无效区域到三个独门的区域。合併WM_PATINT就是为着减小窗口冲回客商区内容的次数。

从音讯队列中去除贰个新闻后,应用程序将用DispatchMessage函数direct系统一发布送那些新闻到窗口管理进度以紧密管理。DispatchMessage未有发送信息地点和岁月到窗口进程,应用程序能够通过GetmessageTime和GetMessagePos函数。

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

你也足以调用SetMessageExtraInfo来为当前新闻队列附加一个值,通过GetMessageExtraInfo来获取这几个值。

非队列信息
绕过了系统和线程音信队列,非队列音信平昔发送至窗口进度。系统特出发送非队列音信来打招呼三个窗口,三个风浪影响了它。举个例子,当顾客激活叁个新窗口,系统一发布送给窗口
WM_ACTIVATE, WM_SETFOCUS, and
WM_SETCU安德拉SO牧马人新闻。这么些新闻通告窗口它早就被激活了,键盘输入正指向该窗口,鼠标光标已经移至了窗口边框内。当应用程序调用有个别系统函数时,也会窗口非队列新闻,比如,应用程序在调用SetWindowPos时,系统将发送WM_WINDOWPOSCHANGED消息。

有一些音讯发送非队列音信:布罗兹castSystemMessage,
布罗兹castSystemMessageEx, 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_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.体系预约义音讯其实大都以这些控件音讯,文告消息,系统广播音讯等等。

表A-1  Windows信息散布

当在console中调用API
ShellExecuteEx展开”test.iqy”文件时,开掘excel会hang住,console退出后excel才会响应,但一直双击”test.iqy”是尚未难点的,风趣的是其风度翩翩情景独有在xp产生,在win7上一向不这几个难点。

2 新闻类型 
1) 系统定义新闻(System-Defined Messages)
 
在SDK中先行定义好的音信,非客户定义的,其范围在[0x0000, 0x03ff]中间,
能够分为以下三类:
1>窗口音讯(Windows Message) 
与窗口的中间运维有关,如创制窗口,绘制窗口,销毁窗口等。可以是雷同的窗口,也足以是Dialog,控件等。
如:WM_CREATE, WM_PAINT, WM_MOUSEMOVE, WM_CTLCOLOR, WM_HSCROLL…
2>命令音讯(Command Message):注意那类音讯通称为WM_COMMAND
与拍卖客户央浼有关, 如单击菜单项或工具栏或控件时, 就能够时有产生命令音讯。
WM_COMMAND, LOWO奥迪Q3D(wParam)表示菜单项,工具栏开关或控件的ID。假若是控件,
HIWO奥迪Q5D(wParam)表示控件消息类型
3> 控件文告(Notify Message) 
控件通告音信, 那是最灵敏的新闻格式, 其Message, wParam,
lParam分别为:WM_NOTIFY,
控件ID,指向NMHDRAV4的指针。NMHD奥德赛蕴涵控件通告的剧情, 能够随意扩展。
2) 程序定义音信(Application-Defined Messages) 
客户自定义的音讯, 对于其范围犹如下规定:
WM_USER: 0x0400-0x7FFF    (ex. WM_USER+10)
WM_APP(winver>4.0): 0x8000-0xBFFF (ex.WM_APP+4)
RegisterWindowMessage: 0xC000-0xFFFF

3522vip靠谱吗 1typedef struct tagMsg
3522vip靠谱吗 2{
3522vip靠谱吗 3       HWND    hwnd;       //采用该新闻的窗口句柄
3522vip靠谱吗 4       UINT    message;    //音信常量标志符,也正是我们平时所说的消息号
3522vip靠谱吗 5       WPARAM  wParam;     //叁十几人音信的特定附加音讯,确切含义重视于音信值
3522vip靠谱吗 6       LPARAM  lParam;     //三十四位新闻的一定附加音信,确切含义依赖于音讯值
3522vip靠谱吗 7       DWOKugaD   time;       //新闻创立时的时日
3522vip靠谱吗 8       POINT   pt;         //新闻成立时的鼠标/光标在荧屏坐标系中的地方
3522vip靠谱吗 9}MSG;
3522vip靠谱吗 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_TIMEENVISION唯有在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
叁14人的窗口句柄。窗口能够是此外项指标显示屏对象,因为Win32可见爱惜大多数可视对象的句柄(窗口、对话框、开关、编辑框等)。
    
message用于区分别的音信的常量值,这么些常量能够是Windows单元中预订义的常量,也能够是自定义的常量。音讯标志符以常量命名的情势建议新闻的含义。当窗口进度接纳到新闻之后,他就能够使用音信标记符来决定哪些管理音信。比方、WM_PAINT告诉窗口进程窗体客商区被改变了必要重绘。符号常量钦点系统音信属于的花色,其前缀指明了拍卖解释消息的窗体的连串。
     wParam 日常是三个与消息有关的常量值,也大概是窗口或控件的句柄。
     lParam
日常是三个指向性内部存款和储蓄器中数量的指针。由于WParam、lParam和Pointer都以三19个人的,由此,它们之间能够相互调换。

该函数将收获和hWnd恐怕其子窗口相关的音信。

DWORD GetMessagePos(void);

0 ~ WM_USER – 1

复出景况:XP sp3 / Office 贰零零陆(别的office版本应该也得以,没有测验)

5 PostMessage(PostThreadMessage), SendMessage 
PostMessage:把消息放到内定窗口所在的线程音信队列中后立即回去。
PostThreadMessage:把音信放到钦点线程的音信队列中后旋即赶回。
SendMessage:直接把信息送到窗口进程管理,处理完了才回到。

消息标记符的值
    
系统一保险留音信标志符的值在0x0000在0x03ff(WM_USEQashqai-1)范围。这个值被系统定义音讯使用。应用程序无法使用这一个值给和睦的信息。应用程序音信从WM_USER(0X0400)到0X7FFF,或0XC000到0XFFFF;WM_USE路虎极光到
0X7FFF范围的新闻由应用程序本人行使;0XC000到0XFFFF范围的音讯用来和任何应用程序通讯,大家顺便说一下享有标识性的消息值:
     WM_NULL—0x0000    空消息。
     0x0001—-0x0087    首要是窗口新闻。
     0x00A0—-0x00A9    非客商区音信 
     0x0100—-0x0108    键盘新闻
     0x0111—-0x0126    菜单音信
     0x0132—-0x0138    颜色调节音信
     0x0200—-0x020A    鼠标新闻
     0x0211—-0x0213    菜单循环新闻
     0x0220—-0x0230    多文书档案新闻
     0x03E0—-0x03E8    DDE消息
     0x0400              WM_USER
     0x8000              WM_APP
     0x0400—-0x7FFF    应用程序自定义私有音讯

该函数重回新闻x,y坐标,在多种monitor下,也有负值。

GetMessageQueueReadyTimeStamp

系统音讯

6 GetMessage, PeekMessage 
PeekMessage会立刻重返能够保存音信
GetMessage在有音信时回来会去除音信

消息有哪三种?
   其实,windows中的新闻固然超多,可是项目并不散乱,大意上有3种:窗口新闻、命令新闻和控件文告音讯。
    
窗口消息差十分的少是系统中最棒广泛的音信,它是指由操作系统和操纵别的窗口的窗口所使用的新闻。举例CreateWindow、DestroyWindow和MoveWindow等都会激发窗口语资源信息息,还恐怕有大家在地点聊起的单击鼠标所发出的消息也是生机勃勃种窗口音讯。
    
命令新闻,那是风流倜傥种特殊的窗口语资源消息息,他用来拍卖从多个窗口发送到另一个窗口的客户诉求,譬如按下三个按键,他就能够向主窗口发送二个发令音讯。
    
控件布告音讯,是指那样黄金年代种新闻,三个窗口内的子控件发生了部分事务,须求通告父窗口。文告新闻只适用于专门的事业的窗口控件如按键、列表框、组合框、编辑框,以至Windows公共控件如树状视图、列表视图等。举个例子,单击或双击叁个控件、在控件中甄选一些文本、操作控件的滚动条都会时有产生文告音信。她就像于命令新闻,当用户与控件窗口交互时,那么控件布告信息就能够从控件窗口发送到它的主窗口。不过这种音信的留存实际不是为着管理顾客命令,而是为了让主窗口能够改造控件,举例加载、展现数据。举例按下二个开关,他向父窗口发送的消息也能够看成是几个控件布告新闻;单击鼠标所发出的音信能够由主窗口一贯管理,然后提交控件窗口处理。
   
当中窗口音讯及控件通告音信至关心敬性格很顽强在艰难险阻或巨大压力面前不屈要由窗口类即直接或直接由CWND类派生类管理。绝对窗口语资源信息息及控件公告音信来讲,命令音信的拍卖对象节制就广得多,它不仅可以够由窗口类管理,还足以由文书档案类,文书档案模板类及选取类所拍卖。
   
由于控件布告音讯很要紧的,人们用的也正如多,不过实际的意义往往令初行家昏头昏脑,所以我主宰把广泛的多少个列出来供我们参谋:
按扭控件
BN_CLICKED        客户单击了开关
 BN_DISABLE 按钮被明确命令制止
 BN_DOUBLECLICKED  客商双击了开关
 BN_HILITE  用/户加亮了按键
 BN_PAINT  按键应当重画
 BN_UNHILITE 加亮应当去掉

获得线程近些日子一次准备管理二个消息的系统时间(GetTickCount)

GetMessageSource
MSGSRC_SOFTWARE_POST表面键盘新闻来源software(postmessage标识为software).
MSGSRC_HARDWARE_KEYBOA奔驰M级D 表面音信来源keyboard. MSGSRC_UNKNOWN

WM_USER ~ 0x7FFF

1> 解压iqy_test.zip

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

组合框控件
 CBN_CLOSEUP 组合框的列表框被关闭
 CBN_DBLCLK 客户双击了叁个字符串
 CBN_DROPDOWN 组合框的列表框被拉出
 CBN_EDITCHANGE 客户改善了编辑框中的文本
 CBN_EDITUPDATE 编辑框内的公文就要履新
 CBN_E智跑OdysseySPACE 组合框内部存款和储蓄器不足
 CBN_KILLFOCUS 组合框失去输入主旨
 CBN_SELCHANGE 在组合框中选择了豆蔻梢头项
 CBN_SELENDCANCEL 客户的选料相应被撤除
 CBN_SELENDOK 顾客的抉择是合法的
 CBN_SETFOCUS 组合框获得输入焦点

音讯来源未知

DWORD GetQueueStatus(
UINT flags
);
在音讯队列中的音讯的体系
flags为要检查实验的音信类型。

自定义窗口类整数音信

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

8(音信死锁( Message Deadlocks) 
假如有线程A和B, 今后有以下下步骤
1) 线程A SendMessage给线程B, A等待新闻在线程B中拍卖后重返
2) 线程B收到了线程A发来的音讯,并举办拍卖, 在管理进程中,B也向线程A
SendMessgae,然后等待从A重返。
因为那个时候, 线程A正等待从线程B重回, 不可能管理B发来的音信,
从而导致了/线程A,B互相等待, 产生死锁。多少个线程也能够形成环形死锁。
能够运用 SendNotifyMessage或SendMessageTimeout来避免现身死锁。

编辑框控件
 EN_CHANGE 编辑框中的文本己更新
 EN_EEnclaveLacrosseSPACE 编辑框内存不足
 EN_HSCROLL 客商点击了水平滚动条
 EN_KILLFOCUS 编辑框正在失去输入主题
 EN_MAXTEXT 插入的内容被截断
 EN_SETFOCUS 编辑框获得输入核心
 EN_UPDATE 编辑框中的文本将在更新
 EN_VSCROLL 顾客点击了僵直滚动条信息含义

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

InSendMessage

WM_APP ~ 0xBFFF

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

9 BroadcastSystemMessage 
我们平常所接触到的消息都是发送给窗口的,其实,
新闻的收信人可以是美妙绝伦的,它能够是应用程序(applications),
可设置驱动(installable drivers),互联网设施(network drivers),
系统级设备驱动(system-level device drivers)等, 
BroadcastSystemMessage那么些API能够对以上系统组件发送音信。

列表框控件
 LBN_DBLCLK 顾客双击了风流倜傥项
 LBN_ECR-VCRUISERSPACE 列表框内部存款和储蓄器远远不足
 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_CHA锐界等消息,还会有局地任何的新闻,比方:WM_PAINT、
WM_TIMER和WM_QUIT。当鼠标、键盘事件被触发后,相应的鼠标或键盘驱动程序就能把这个事件调换到相应的新闻,然后输送到系统音信队列,由
Windows系统去实行拍卖。Windows系统则在万分的空子,从系统音信队列中抽出叁个新闻,依照前边大家所说的MSG新闻结构分明消息是要被送往极其窗口,然后把收取的音信送往创立窗口的线程的打点队列,上边包车型客车业务就该由线程新闻队列操心了,Windows起先忙自身的事情去了。线程见到自个儿的音信队列中有消息,就从队列中抽出来,通过操作系统一发布送到合适的窗口进度去管理。
    
经常来说,系统连接将新闻Post在音讯队列的尾声。那样保障窗口以先进先出的逐风度翩翩选用音信。但是,WM_PAINT是二个不等,同多少个窗口的多少个WM_PAINT被合併成三个 WM_PAINT 消息,
合併全体的无用区域到多个无效区域。合併WM_PAIN的目标是为了减削刷新窗口的次数。
3522vip靠谱吗 11

4.生龙活虎旦应用程序正在创立顶层窗口时调用PeekMessage,将变成窗口窗口被创造在Z-Order的末尾。你须要在PeekMessage后,显式调用SetForegroundWindow。假若应用程序以至有八个停放窗口了,那么新窗口将被放置。

PostMessage
应用程序要用HWND_BROADCAST实行程序间的相互,音讯应该取得于RegisterWindowMessage()

0xC000 ~ 0xFFFF

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

    return ret;
}

3522vip靠谱吗 12
   
非队列消息将会绕过系统队列和消息队列,直接将音讯发送到窗口进度,。系统一发布送非队列音讯布告窗口,系统一发布送音讯通告窗口。比如,当客户激活多少个窗口系统一发布送WM_ACTIVATE,
WM_SETFOCUS, and
WM_SETCU哈弗SOEnclave。这一个消息布告窗口它被激活了。非队列新闻也足以由当应用程序调用系统函数产生。举例,当程序调用SetWindowPos系统一发布送WM_WINDOWPOSCHANGED新闻。一些函数也发送非队列音讯,比方下边大家要聊起的函数。
     
消息的发送
    
精通了上面的这几个基础理论之后,我们就足以拓宽一下粗略的消息发送与选择。
     把三个音信发送到窗口有3种情势:发送、寄送和广播。
    
发送信息的函数有SendMessage、SendMessageCallback、SendNotifyMessage、
SendMessageTimeout;寄送音信的函数首要有PostMessage、PostThreadMessage、
PostQuitMessage;广播消息的函数我通晓的唯有布罗兹castSystemMessage、
布罗德castSystemMessageEx。
     SendMessage的原型如下:LRESULT SendMessage(HWND hWnd,UINT
Msg,WPARAM wParam,LPARAM
lParam),这几个函数首假若向贰个或多少个窗口发送一条音讯,一贯等到新闻被拍卖以往才会回来。然而须求在乎的是,若是收到音讯的窗口是同两个应用程序的风度翩翩局地,那么这么些窗口的窗口函数就被当作贰个子程序及时被调用;借使选用新闻的窗口是被别的的线程所创办的,那么窗口系统就切换成对应的线程况且调用相应的窗口函数,那条音讯不会被放进指标应用程序队列中。函数的再次来到值是由接受信息的窗口的窗口函数再次来到,重返的值决意于被发送的新闻。
     PostMessage的原型如下:BOOL PostMessage(HWND hWnd,UINT Msg,WPARAM
wParam,LPARAM
lParam),该函数把一条信息放置到开创hWnd窗口的线程的音信队列中,该函数不等音信被拍卖就立即将决定重回。必要潜心的是,要是hWnd参数为
HWND_BROADCAST,那么,音信将被寄送给系统中的全体的重叠窗口和弹出窗口,可是子窗口不会采纳该新闻;如若hWnd参数为NULL,则该函数相似于将dwThreadID参数设置成当下线程的标记来调用PostThreadMEssage函数。
  从地点的这2个颇有代表性的函数,我们能够看见信息的出殡方式和寄送方式的差别所在:被发送的音讯是或不是会被立马管理,函数是还是不是及时回到。被发送的新闻会被登时管理,管理完成后函数才会回来;被寄送的音信不会被立刻管理,他被放置三个先进先出的行列中,一贯等到应用程序空线的时候才会被拍卖,可是函数放置新闻后任何时候回去。
3522vip靠谱吗 13
  实际上,发送消息到多个窗口管理进程和一直调用窗口管理进程之间并未有太大的差异,他们径直的当世无双分裂就在于你能够须求操作系统截获全体被发送的信息,可是不可以收获对窗口管理进度的直接调用。
  以寄送点子发送的新闻经常是与客商输入事件相对应的,因为这个事件不是不行急不可待,能够开展缓慢的缓冲管理,比方鼠标、键盘新闻会被寄送,而开关等信息则会被发送。
  广播音信用得少之又少,BroadcastSystemMessage函数原型如下:
      long 布罗兹castSystemMessage(DWOTucsonD dwFlags,LPDWO奥迪R8D
lpdwRecipients,UINT uiMessage,WPARAM wParam,LPARAM
lParam);该函数能够向钦赐的收信人发送一条音讯,这一个选用者可以是应用程序、可安装的驱动程序、互连网驱动程序、系统品级的器材驱动音信和他们的随机组合。供给注意的是,借使dwFlags参数是BSF_QUECRUISERY并且起码二个选用者重返了BROADCAST_QUERY_DENY,则重临值为0,若无一点点名BSF_QUEOdysseyY,则函数将消息发送给全部采用者,並且忽视其重回值。

假诺发送新闻低于WM_USE凯雷德范围,到异步消息队列函数(PostMessage、SendNotifyMessage),消息参数不应有包涵指针,不然的话,操作将失败。该函数就要吸收接纳线程有机会管理该新闻前回来,发送者将释放刚刚用到的内部存款和储蓄器。

PostQuitMessage

应用程序字符串音讯

 

音讯的接纳
 音信的收到主要有3个函数:GetMessage、PeekMessage、WaitMessage。
  GetMessage原型如下:BOOL GetMessage(LPMSG lpMsg,HWND hWnd,UINT
wMsgFilterMin,UINT
wMsgFilter马克斯);该函数用来得到与hWnd参数所内定的窗口相关的且wMsgFilterMin和wMsgFilter马克斯参数所付出的音信值范围内的消息。须要在意的是,固然hWnd为NULL,则GetMessage获取属于调用该函数应用程序的任生龙活虎窗口的音信,尽管wMsgFilterMin和wMsgFilter马克斯都是0,则GetMessage就回去全数可得到的新闻。函数获取之后将去除新闻队列中的除
WM_PAINT新闻之外的此外新闻,至于WM_PAINT则唯有在其拍卖未来才被去除。
   PeekMessage原型如下:BOOL PeekMessage(LPMSG lpMsg,HWND hWnd,UINT
wMsgFilterMin,UINT wMsgFilter马克斯,UINT
wRemoveMsg);该函数用于查看应用程序的新闻队列,倘使内部有音讯就将其放入lpMsg所指的布局中,可是,与GetMessage分歧的是,PeekMessage函数不会等到有音信归入队列时才回去。相仿,若是hWnd为NULL,则PeekMessage获取属于调用该函数应用程序的任风度翩翩窗口的音讯,假若hWnd=-1,那么函数只回去把hWnd参数为NULL的PostAppMessage函数送去的新闻。假使wMsgFilterMin和wMsgFilter马克斯都以0,则PeekMessage就回来全体可获得的新闻。函数获取之后将视最后一个参数来支配是或不是删除音信队列中的除
WM_PAINT新闻之外的别的新闻,至于WM_PAINT则独有在其处理现在才被去除。
   WaitMessage原型如下:BOOL
WaitMessage();当贰个应用程序无事可做时,该函数就将调节权交给其它的应用程序,同一时候将该应用程序挂起,直到三个新的消息被归入应用程序的行列之中才回去。

该函数只是轻易申明被号令终止的线程将会停下。采用WM_QUIT的线程,应该截至音讯循环,并将调控权交给系统。重返给系统的淡出值,一定是WM_QUIT的wParam参数

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

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


RegisterWindowMessage
同一字符串,注册的值,在全路种类中是唯生机勃勃的


SendMessage

> 0xFFFF

3. 缘故分析

音信的处理
  接下去大家谈一下音信的管理,首先大家来看一下VC中的新闻泵:

非音信队列方式,间接调用窗口进度,系统当下切换成选取线程实践,发送线程锁住,知道接收线程管理完成

SendMessageTimeout

为现在系统采用保留

3.1 excel hang在哪里?

3522vip靠谱吗 14while(GetMessage(&msg, NULL, 0, 0))
3522vip靠谱吗 15{
3522vip靠谱吗 16       if(!TranslateAccelerator(msg.hWnd, hAccelTable, &msg))
3522vip靠谱吗 17      { 
3522vip靠谱吗 18            TranslateMessage(&msg);
3522vip靠谱吗 19            DispatchMessage(&msg);
3522vip靠谱吗 20       }
3522vip靠谱吗 21}

该函数通过调用窗口过程的办法发送音信,若是窗口属于区别线程,SendMessageTimerout将驾驭新闻管理完成才回到可能内定的过期已经玉陨香消,借使窗口就在时下线程,则间接调用窗口进程,并忽视time-out超时

SendNotifyMessage
若果窗口创设于属于发送音讯的线程,则调用窗口进程,并等候窗口过程管理实现该音讯。假设是莫衷一是线程,则将信息传递到窗口进程,并马上回去,不等待窗口进程的音信管理进度。


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

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

表A-2  常用Windows消息

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

 

音讯名称

3522vip靠谱吗 22

  
首先,GetMessage从进度的主线程的新闻队列中获得三个信息并将它复制到MSG结构,假使队列中尚无音讯,则GetMessage函数将拭目以俟几个音讯的赶到以往才回到。假如你将一个窗口句柄作为第三个参数字传送入GetMessage,那么独有钦点窗口的的消息可以从队列中获取。GetMessage也足以从音讯队列中过滤消息只采纳音信队列中落在限制内的新闻。那个时候就要动用GetMessage/PeekMessage钦命一个消息过滤器。那些过滤器是贰个音信标记符的界定或然是三个窗体句柄,大概双方相同的时候钦赐。当应用程序要物色一个后入新闻队列的消息是很有用。WM_KEYFIRST
和 WM_KEYLAST 常量用于接纳全体的键盘新闻。 WM_MOUSEFIRST 和
WM_MOUSELAST 常量用于选择全数的鼠标音讯。 
 然后TranslateAccelerator判别该音讯是否三个按钮音信还若是二个加快键音讯,要是是,则该函数将把多少个按钮新闻调换到三个加快键新闻传递给窗口的回调函数。管理了加快键之后,函数TranslateMessage将把多少个开关音信WM_KEYDOWN和WM_KEYUP调换到一个WM_CHA景逸SUV,不过须求留意的是,音讯WM_KEYDOWN,WM_KEYUP照旧将传递给窗口的回调函数。     
 处理完之后,DispatchMessage函数将把此音讯发送给该新闻钦点的窗口中已设定的回调函数。即便新闻是WM_QUIT,则
GetMessage重返0,进而退出循环体。应用程序可以选取PostQuitMessage来停止本人的音讯循环。平日在主窗口的
WM_DESTROY消息中调用。
 下边大家举叁个广泛的小例子来证明这一个音讯泵的施用:

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

3522vip靠谱吗 23if (::PeekMessage(&msg, m_hWnd, WM_KEYFIRST,WM_KEYLAST, PM_REMOVE))
3522vip靠谱吗 24{
3522vip靠谱吗 25          if (msg.message == WM_KEYDOWN && msg.wParam == VK_ESCAPE)...
3522vip靠谱吗 26}
3522vip靠谱吗 27

说  明

查阅参数知excel调用NtUserMessageCall()相仿如下:

  这里大家接收全体的键盘音讯,所以就用WM_KEYFIRST 和
WM_KEYLAST作为参数。最终二个参数能够是PM_NOREMOVE 或者
PM_REMOVE,表示新闻新闻是不是合宜从音信队列中删除。                 
   所以这段小代码正是推断是或不是按下了Esc键,倘使是就张开始拍片卖。

WM_NULL 

NtUserMessageCall(HWND_BROADCAST, WM_DDE_INITIATE)

窗口进程
 窗口进程是多少个用来拍卖全体发送到那么些窗口的消息的函数。任何三个窗口类都有三个窗口进度。同一个类的窗口使用相似的窗口进程来响应音信。系统一发布送音讯给窗口进度将新闻数据作为参数字传送递给他,音信赶到之后,按照音讯类型排序实行管理,当中的参数则用来分别分歧的音信,窗口进度使用参数发生合适行为。
 多少个窗口进度不平日忽视音讯,假若他不管理,它会将音讯传回到实践私下认可的拍卖。窗口进度通过调用DefWindowProc来做这么些管理。窗口进程必得return一个值作为它的新闻管理结果。大繁多窗口只管理小部分音讯和将别的的经过DefWindowProc传递给系统做私下认可的拍卖。窗口进程被全部属于同三个类的窗口分享,能为不相同的窗口管理音信。下边我们来看一下现实的实例:

0x0000

表明excel给具有顶层窗口发送贰个WM_DDE_INITIATE新闻,不过有窗口未有response

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

空音信,此音信将被收取窗口忽视

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

 

WM_CREATE 

 

音信分流器
  平日的窗口进度是经过贰个switch语句来兑现的,那几个工作很烦,有未有更简便易行的点子吧?有,那便是音信分流器,利用新闻分流器,大家可以把switch语句分成越来越小的函数,每二个消息都对应二个小函数,那样做的补益便是对音信更便于管理。
  之所以被称呼新闻分流器,正是因为它能够对别的音信实行疏散。下边大家做贰个函数就很通晓了:

0x0001

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

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

应用程序成立多少个窗口

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

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

WM_DESTROY

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

0x0002

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

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

二个窗口被毁灭

3522vip靠谱吗 102

3522vip靠谱吗 103   #define HANDLE_MSG(hwnd,msg,fn) \
3522vip靠谱吗 104             switch(msg): return HANDLE_##msg((hwnd),(wParam),(lParam),(fn));

WM_MOVE

call stack彰显实在是ShellExecuteEx所调用

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

0x0003

3522vip靠谱吗 105

3522vip靠谱吗 106   #define HANDLE_WM_COMMAND(hwnd,wParam,lParam,fn)\ 
3522vip靠谱吗 107             ((fn)((hwnd),(int)(LOWORD(wParam)),(HWND)(lParam),(UINT)HIWORD(wParam)),0L);

活动贰个窗口

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

好了,事情到了这一步,应该全套都晴朗了。
而是,大家发以往windowsx.h里面还会有叁个宏:FOQashqaiWA冠道D_WM_XXXX,大家依然那WM_COMMAND为例,进行拆解分析:

WM_SIZE

小心到下二个API GetWindowThreadProcessId ( 0x00310172 , 0x0012fb70
),刚好是获取那个窗口的pid和tid,查看下参数窗口:

3522vip靠谱吗 108   #define FORWARD_WM_COMMAND(hwnd, id, hwndCtl, codeNotify, fn) \
3522vip靠谱吗 109     (void)(fn)((hwnd), WM_COMMAND, MAKEWPARAM((UINT)(id),(UINT)(codeNotify)), (LPARAM)(HWND)(hwndCtl))

0x0005

其风流倜傥窗口所属的经过PID =
0xc54,正好是excel的历程,表达ShellExecuteEx确实发送了DDE新闻给excel,何况可执发送的音信的thread便是主线程

为此实际,FO逍客WAENVISIOND_WM_XXXX将消息参数进行了双重新整合织,生成了wParam &&
lParam,然后调用了大家定义的函数。

改变八个窗口的大小

3522vip靠谱吗 110

方今,我们剖析了音讯的大旨境论和中央的函数及用法,接下去,我们将更加的研讨音讯传递在MFC中的完成。

WM_ACTIVATE

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

MFC新闻的处理达成方式
  初看MFC中的各样新闻,以致在头脑中稳步的C++的影响,我们或者很自然的就能够想到利用C++的三大特征之风流倜傥:设想机制来兑现新闻的传递,可是透过深入分析,我们见到专业而不是想大家想像的那样,在MFC中国国投息是因自此生可畏种所谓的新闻映射机制来管理的。
  为啥呢?在潘爱中华民族解放先锋生翻译的《Visual
C++技术内部原因》(第4版)中提交了详尽的开始和结果表达,我再一句话来讲一次。在CWnd类中山大学约有112个新闻,还应该有别的的MFC的类呢,算起来音讯太多了,在C++中对程序中用到的每二个派生类都要有一个vtable,每八个虚函数在vtable中都要侵占三个4字节大小的输入地址,那样一来,对于各个特定项目标窗口或控件,应用程序都急需贰个440KB大小的表来辅助设想新闻控件函数。
  假如说上面的窗口或控件可以勉强实现的话,那么对于菜单命令音讯及开关命令音讯呢?因为差异的应用程序有两样的菜系和开关,大家怎么管理呢?在MFC
库的这种消息映射系统就制止了选取大的vtable,何况能够在拍卖平常Windows新闻的还要管理百端待举的应用程序的通令新闻。
  说白了,MFC中的音信机制其实质是一张高大的新闻及其管理函数的生龙活虎黄金年代对应表,然后加上深入分析管理那张表的采纳框架之中的部分顺序代码.那样就足防止止在SDK编制程序中用到的冗杂的CASE语句。

0x0006

3522vip靠谱吗 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暗中同意对象;在新的非默许对象中或在或者要传播命令的一声令下目的中。

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

3522vip靠谱吗 112

新闻映射的内容
   
通过ClassWizard为大家转换的代码,大家得以看见,音讯映射基本上分为2多数:
   
在头文件(.h)中有一个宏DECLARE_MESSAGE_MAP(),他被放在了类的最终,是二个public属性的;与之相应的是在促成都部队分(.cpp)扩展了风华正茂章新闻映射表,内容如下:
    BEGIN_MESSAGE_MAP(当前类, 当前类的基类)
       //{{AFX_MSG_MAP(CMainFrame)
         新闻的进口项
       //}}AFX_MSG_MAP
   END_MESSAGE_MAP()
  
不过仅是这两项还远不足以完结一条新闻,假诺八个新闻职业,必需有以下3个部分去同盟:
1.在类的概念中加入相应的函数表明;
2.在类的音信映射表中投入相应的音信映射入口项;
3.在类的兑现中参与相应的函数体;

WM_SETFOCUS

 

音讯的丰盛
  
有了上边包车型地铁那些只是充任基础,大家接下去就做大家最通晓、最常用的专门的学业:加多音信。MFC新闻的足够首要有2种艺术:自动/手动,我们就以那2种方法为例,说一下如何增加新闻。
   1、利用Class Wizard达成全自动抬高
      在菜单中选用View–>Class
Wizard,也能够用单击鼠标右键,选择Class Wizard,相近能够激活Class
Wizard。选取Message Map标签,从Class
name组合框中选拔大家想要加多音讯的类。在Object
IDs列表框中,选拔类的称谓。那时,
Messages列表框呈现此类的绝大超级多(若不是成套的话)可重载成员函数和窗口新闻。类重载突显在列表的上部,以实际杜撰成员函数的分寸写字母来表示。别的为窗口语资源音信息,以大写字母现身,描述了事实上窗口所能响应的音讯ID。选中大家向增多的音讯,单击Add
Function按键,Class Wizard自动将该音讯加多进去。
     
一时候,大家想要增加的信息本应有出未来Message列表中,不过就是找不到,如何是好?不要焦灼,大家得以选用Class
Wizard上Class Info标签以扩展音讯列表。在该页中,找到Message
Filter组合框,通过它可以转移首页中Messages列表框中的选项。这里,我们选择Window,从而呈现全部的窗口新闻,大器晚成把情状下,你想要加多的消息就能够在Message列表框中冒出了,若是还并没有,那就跟着往下看:)

0x0007

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

   2、手动地增进新闻管理函数
   
纵然在Messages列表框中依然看不到大家想要的音信,那么该音讯只怕是被系统忽视掉或然是您和煦创建的,在这里种意况下,就一定要自个儿手工业增加。依据大家日前所说的新闻职业的3个部件,大家各样进行管理:
      1) 在类的.
h文件中增进管理函数的证明,紧接在//}}AFX_MSG行之后走入注脚,注意:应当要以afx_msg开头。
     经常,加多管理函数注解的最棒的地点是源代码中Class
Wizard维护的表上面,可是在它标识其世界的{{}}括弧外面。那几个括弧中的任李新发西都将会被Class
Wizard销毁。
      2)
接着,在客户类的.cpp文件中找到//}}AFX_MSG_MAP行,紧接在它之后参与音信入口项。相符,也是放在{
{} }的外场
      3) 最终,在该公文中增添音讯管理函数的实体。

获得主题后

3522vip靠谱吗 113

 

WM_KILLFOCUS

查看一下buff之处:

 

0x0008

3522vip靠谱吗 114

消息范围

说 明

0 ~ WM_USER – 1

系统消息

WM_USER ~ 0x7FFF

自定义窗口类整数消息

WM_APP ~ 0xBFFF

应用程序自定义消息

0xC000 ~ 0xFFFF

应用程序字符串消息

> 0xFFFF

为以后系统应用保留

失掉主旨

刚刚正是展开test.iqy的授命,表达ShellExecuteEx便是先创建了excel的长河,然后发送test.iqy的文书命令给excel张开。

表A-2  常用Windows消息

WM_ENABLE

 

消息名称

说  明

WM_NULL 

0x0000

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

WM_CREATE 

0x0001

应用程序创建一个窗口

WM_DESTROY

0x0002

一个窗口被销毁

WM_MOVE

0x0003

移动一个窗口

WM_SIZE

0x0005

改变一个窗口的大小

WM_ACTIVATE

0x0006

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

WM_SETFOCUS

0x0007

获得焦点后

WM_KILLFOCUS

0x0008

失去焦点

WM_ENABLE

0x000A

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

WM_SETREDRAW

0x000B

设置窗口是否能重画

WM_SETTEXT

0x000C

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

WM_GETTEXT

0x000D

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

WM_GETTEXTLENGTH

0x000E

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

WM_PAINT

0x000F

要求一个窗口重绘自己

WM_CLOSE

0x0010

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

WM_QUERYENDSESSION

0x0011

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

WM_QUIT

0x0012

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

WM_QUERYOPEN

0x0013

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

WM_ERASEBKGND

0x0014

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

WM_SYSCOLORCHANGE

0x0015

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

WM_ENDSESSION

0x0016

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

WM_SHOWWINDOW

0x0018

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

WM_ACTIVATEAPP

0x001C

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

WM_FONTCHANGE

0x001D

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

WM_TIMECHANGE

0x001E

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

WM_CANCELMODE

0x001F

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

WM_SETCURSOR

0x0020

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

WM_MOUSEACTIVATE

0x0021

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

WM_CHILDACTIVATE

0x0022

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

WM_QUEUESYNC

0x0023

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

WM_GETMINMAXINFO

0x0024

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

WM_PAINTICON

0x0026

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

WM_ICONERASEBKGND

0x0027

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

WM_NEXTDLGCTL

0x0028

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

WM_SPOOLERSTATUS

0x002A

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

WM_DRAWITEM

0x002B

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

WM_MEASUREITEM

0x002C

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

WM_DELETEITEM

0x002D

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

WM_VKEYTOITEM

0x002E

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

WM_CHARTOITEM

0x002F

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

WM_SETFONT

0x0030

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

WM_GETFONT

0x0031

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

WM_SETHOTKEY

0x0032

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

WM_GETHOTKEY

0x0033

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

WM_QUERYDRAGICON

0x0037

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

WM_COMPAREITEM

0x0039

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

WM_COMPACTING

0x0041

显示内存已经很少了

WM_WINDOWPOSCHANGING

0x0046

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

WM_POWER

0x0048

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

WM_COPYDATA

0x004A

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

WM_CANCELJOURNAL

0x004B

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

WM_NOTIFY

0x004E

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

WM_INPUTLANGCHANGEREQUEST

0x0050

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

WM_INPUTLANGCHANGE

0x0051

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

WM_TCARD

0x0052

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

WM_HELP

0x0053

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

WM_USERCHANGED

0x0054

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

WM_NOTIFYFORMAT

0x0055

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

WM_CONTEXTMENU

0x007B

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

WM_STYLECHANGING

0x007C

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

WM_STYLECHANGED

0x007D

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

WM_DISPLAYCHANGE

0x007E

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

WM_GETICON

0x007F

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

WM_SETICON

0x0080

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

WM_NCCREATE

0x0081

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

WM_NCDESTROY

0x0082

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

WM_NCCALCSIZE

0x0083

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

WM_NCHITTEST

0x0084

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

WM_NCPAINT

0x0085

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

WM_NCACTIVATE

0x0086

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

WM_NCMOUSEMOVE

0x00A0

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

WM_NCLBUTTONDOWN

0x00A1

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

WM_NCLBUTTONUP

0x00A2

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

WM_NCLBUTTONDBLCLK

0x00A3

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

WM_NCRBUTTONDOWN

0x00A4

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

WM_NCRBUTTONUP

0x00A5

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

WM_NCRBUTTONDBLCLK

0x00A6

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

WM_NCMBUTTONDOWN

0x00A7

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

WM_NCMBUTTONUP

0x00A8

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

WM_NCMBUTTONDBLCL

0x00A9

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

WM_KEYDOWN

0x0100

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

WM_KEYUP

0x0101

释放一个非系统键

WM_CHAR

0x0102

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

WM_DEADCHAR

0x0103

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

WM_SYSKEYDOWN

0x0104

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

WM_SYSKEYUP

0x0105

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

WM_SYSCHAR

0x0106

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

WM_SYSDEADCHAR

0x0107

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

WM_INITDIALOG

0x0110

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

WM_COMMAND

0x0111

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

WM_SYSCOMMAND

0x0112

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

WM_TIMER

0x0113

发生了定时器事件

WM_HSCROLL

0x0114

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

WM_VSCROLL

0x0115

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

WM_INITMENU

0x0116

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

WM_INITMENUPOPUP

0x0117

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

WM_MENUSELECT

0x011F

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

WM_MENUCHAR

0x0120

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

WM_ENTERIDLE

0x0121

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

WM_MENURBUTTONUP

0x0122

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

WM_MENUDRAG

0x0123

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

WM_MENUGETOBJECT

0x0124

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

WM_UNINITMENUPOPUP

0x0125

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

WM_MENUCOMMAND

0x0126

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

WM_CHANGEUISTATE

0x0127

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

WM_UPDATEUISTATE

0x0128

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

WM_QUERYUISTATE

0x0129

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

WM_CTLCOLORMSGBOX

0x0132

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

WM_CTLCOLOREDIT

0x0133

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

WM_CTLCOLORLISTBOX

0x0134

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

WM_CTLCOLORBTN

0x0135

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

WM_CTLCOLORDLG

0x0136

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

WM_CTLCOLORSCROLLBAR

0x0137

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

WM_CTLCOLORSTATIC

0x0138

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

WM_MOUSEMOVE

0x0200

鼠标移动

WM_LBUTTONDOWN

0x0201

按下鼠标左键

WM_LBUTTONUP

0x0202

释放鼠标左键

WM_LBUTTONDBLCLK

0x0203

双击鼠标左键

WM_RBUTTONDOWN

0x0204

按下鼠标右键

WM_RBUTTONUP

0x0205

释放鼠标右键

WM_RBUTTONDBLCLK

0x0206

双击鼠标右键

WM_MBUTTONDOWN

0x0207

按下鼠标中键

WM_MBUTTONUP

0x0208

释放鼠标中键

WM_MBUTTONDBLCLK

0x0209

双击鼠标中键

WM_MOUSEWHEEL

0x020A

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

WM_PARENTNOTIFY

0x0210

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

WM_ENTERMENULOOP

0x0211

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

WM_EXITMENULOOP

0x0212

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

WM_SIZING

0x0214

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

WM_CAPTURECHANGED

0x0215

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

WM_MOVING

0x0216

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

WM_POWERBROADCAST

0x0218

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

WM_DEVICECHANGE

0x0219

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

WM_MDICREATE

0x0220

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

WM_MDIDESTROY

0x0221

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

WM_MDIACTIVATE

0x0222

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

WM_MDIRESTORE

0x0223

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

WM_MDINEXT

0x0224

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

WM_MDIMAXIMIZE

0x0225

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

WM_MDITILE

0x0226

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

WM_MDICASCADE

0x0227

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

WM_MDIICONARRANGE

0x0228

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

WM_MDIGETACTIVE

0x0229

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

WM_MDISETMENU

0x0230

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

WM_ENTERSIZEMOVE

0x0231

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

WM_EXITSIZEMOVE

0x0232

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

WM_DROPFILES

0x0233

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

WM_MDIREFRESHMENU

0x0234

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

WM_MOUSEHOVER

0x02A1

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

WM_MOUSELEAVE

0x02A3

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

WM_CUT

0x0300

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

WM_COPY

0x0301

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

WM_PASTE 

0x0302

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

WM_CLEAR

0x0303

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

WM_UNDO

0x0304

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

WM_DESTROYCLIPBOARD

0x0307

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

WM_DRAWCLIPBOARD

0x0308

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

WM_PAINTCLIPBOARD

0x0309

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

WM_VSCROLLCLIPBOARD

0x030A

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

WM_SIZECLIPBOARD

0x030B

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

WM_ASKCBFORMATNAME

0x030C

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

WM_CHANGECBCHAIN

0x030D

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

WM_HSCROLLCLIPBOARD

0x030E

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

WM_QUERYNEWPALETTE

0x030F

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

WM_PALETTEISCHANGING

0x0310

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

WM_PALETTECHANGED

0x0311

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

来改变系统调色板

WM_HOTKEY

0x0312

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

WM_PRINT

0x0317

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

WM_PRINTCLIENT

0x0318

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

WM_APP

0x8000

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

WM_USER

0x0400

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

0x000A

3.3 总结

  表A-3  公告消息-开关

利用程序Enable状态更改时发生

1> ShellExecuteEx张开test.iqy的时先创设excel进程

消息名称

说 明

BN_CLICKED

单击按钮

BN_DISABLE

按钮被禁止

BN_DOUBLECLICKED

双击按钮

BN_HILITE

加亮按钮

BN_PAINT

按钮应当重画

BN_UNHILITE

加亮应当去掉

WM_SETREDRAW

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

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

0x000B

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

消息名称

说 明

CBN_CLOSEUP

组合框的列表框被关闭

CBN_DBLCLK

用户双击了一个字符串

CBN_DROPDOWN

组合框的列表框被拉下

CBN_EDITCHANGE

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

CBN_EDITUPDATE

组合框内的文本即将更新

CBN_ERRSPACE

组合框内存不足

CBN_KILLFOCUS

组合框失去输入焦点

CBN_SELCHANGE

在组合框中选择了一项

CBN_SELENDCANCEL

用户的选择将被忽略

CBN_SELENDOK

用户的选择将被执行

CBN_SETFOCUS

组合框获得输入焦点

设置窗口是不是能重画

4> ShellExecuteEx推行实现,但并不destroy “WorkerW”窗口

表A-5  通知新闻-编辑框

WM_SETTEXT

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

消息名称

说 明

EN_CHANGE

编辑框中的文本己更新

EN_ERRSPACE

编辑框内存不足

EN_HSCROLL

用户点击了水平滚动条

EN_KILLFOCUS

编辑框失去输入焦点

EN_MAXTEXT

插入的内容被截断

EN_SETFOCUS

编辑框获得输入焦点

EN_UPDATE

编辑框中的文本将要更新

EN_VSCROLL

用户点击了垂直滚动条

0x000C

看似,大家能够创立贰个带窗口的次第,运转后将其挂起,这时候,固然直接双击打开test.iqy也会hang住。

表A-6  通告音信-列表框

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

 

消息名称

说 明

LBN_DBLCLK

用户双击了一项

LBN_ERRSPACE

列表框内存不足

LBN_KILLFOCUS

列表框正在失去输入焦点

LBN_SELCANCEL

用户选择被取消

LBN_SELCHANGE

用户选择将改变

LBN_SETFOCUS

列表框获得输入焦点

WM_GETTEXT

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

Windows消息大全

0x000D

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

  Windows是生机勃勃音信(Message)驱动式系统,Windows新闻提供了应用程序与应用程序之间、应用程序与Windows系统之间展开报导的手法。应用程序要落到实处的机能由音讯来触发,并靠对新闻的响应和管理来达成。Windows系统中有二种新闻队列,后生可畏种是系统新闻队列,另意气风发种是应用程序音讯队列。Computer的装有输入设备由
Windows监控,当三个事件发生时,Windows先将输入的新闻放入系统新闻队列中,然后再将输入的消息拷贝到相应的应用程序队列中,应用程序中的消息循环从它的音讯队列中找找每种音讯并发送给相应的窗口函数中。一个事变的产生,达到管理它的窗口函数必得经历上述进程。值得注意的是消息的非超过性,即无论事件的急与缓,总是按达到的程序排队(一些种类音讯除此而外),那就使得一些外界实时事件大概得不到立刻的管理。

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

 

  由于Windows本人是由新闻使得的,举三个例子来评释那几个难点。展开记事本程序,该程序有贰个File菜单,那么,在运作该应用程序的时候,若是顾客单击了File菜单里New命令时,那个动作将被Windows
(而不是应用程序本人!)所擒获,Windows经过解析获知那些动作应该由地方所说的百般应用程序去管理,既然是那般,Windows就发送了个叫做WM_COMMAND的音讯给应用程序,该音信所含有新闻告知应用程序:”顾客单击了New菜单”,应用程序得悉那大器晚成新闻之后,选择对应的动作来响应它,这么些历程称为音信管理。Windows为每贰个应用程序(确切地说是每贰个线程)维护了相应的音讯队列,应用程序的天职便是不停的从它的消息队列中收获消息,剖析音信和拍卖音讯,直到一条吸收名称为WM_QUIT新闻甘休,那个历程平时是由生机勃勃种名字为新闻循环的程序结构来兑现的。

WM_GETTEXTLENGTH

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

  音讯我是用作二个记录传递给应用程序的,这几个记录中隐含了新闻的档期的顺序以致任何音信。举个例子,对于单击鼠标所发生的消息以来,那么些记录中含有了单击鼠标时的坐标。那些记录类型叫做T
M s g,它在Wi n d o w s单元中是这么注明的:

0x000E

5.1 在API Monitor中看下PostMessageW

type

赢得与八个窗口有关的文件的长短(不带有空字符)

3522vip靠谱吗 115

TMsg = packedrecord

WM_PAINT

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

hwnd: HWND / /窗口句柄

0x000F

3522vip靠谱吗 116

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

须求八个窗口重绘本身

能够是ShellExecuteEx内部创设的线程,所以win7上ShellExecuteEx创立了四个线程特地用来拍卖和excel的DDE消息通讯,那样就会平日的收四管理excel发过来的WM_DDE_INITIATE消息了

wParam: WPA LX570 AM  // 三十人音讯的一定附加音讯

WM_CLOSE

lParam: LPA Odyssey AM  // 30位音信的一定附加消息

0x0010

time: DWO昂CoraD / /音信创立时的光阴

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

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

WM_QUERYENDSESSION

end

0x0011

 

顾客筛选结束对话框或应用程序自身调用ExitWindows()函数

信息中有何样?

WM_QUIT

是否认为二个消息记录中的音信像俄语同样?假设是如此,那么看黄金年代看上面包车型大巴阐述:

0x0012

hwnd
叁11位的窗口句柄。窗口能够是任何类型的显示器对象,因为Win32可以预知维护大多数可视对象的句柄(窗口、对话框、开关、编辑框等)。

用来终止程序运营或应用程序调用Postquitmessage()函数来发出此新闻

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

WM_QUERYOPEN

wParam 日常是二个与音讯有关的常量值,也或然是窗口或控件的句柄。

0x0013

lParam
平日是二个对准内部存款和储蓄器中数据的指针。由于WParm、lParam和Pointer都以叁拾贰人的,因而,它们中间能够相互转变。

当客户窗口复苏原先的高低地方时,把此新闻发送给有些Logo

 

WM_ERASEBKGND

WM_NULL = 0

0x0014

WM_CREATE = 1

当窗口背景必需被擦除时(比方在窗口改动大小时)

应用程序创设贰个窗口

WM_SYSCOLORCHANGE

WM_DESTROY = 2

0x0015

多少个窗口被销毁

当系统颜色更动时,发送此新闻给持有顶尖窗口

WM_MOVE = 3

WM_ENDSESSION

移动贰个窗口

0x0016

WM_SIZE = 5

当系统经过爆发WM_QUECR-VYENDSESSION信息后,此音讯发送给应用程序

改换一个窗口的尺寸

WM_SHOWWINDOW

WM_ACTIVATE = 6

0x0018

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

当隐蔽或呈现窗口是出殡和下葬此音信给这几个窗口

WM_SETFOCUS = 7

WM_ACTIVATEAPP

得到宗旨后

0x001C

WM_KILLFOCUS = 8

当有些窗口将被激活时,将被激活窗口和当前运动(将在失去激活)窗口会接到此音讯,发此音讯给应用程序哪个窗口是激活的,哪个是非激活的

错失核心

WM_FONTCHANGE

WM_ENABLE = 10

0x001D

改变enable状态

当系统的书体财富库变化时发送此消息给持有超级窗口

WM_SETREDRAW = 11

WM_TIMECHANGE

设置窗口是或不是能重画

0x001E

WM_SETTEXT = 12

当系统的小时变化时发送此音讯给全部一级窗口

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

WM_CANCELMODE

WM_GETTEXT = 13

0x001F

应用程序发送此新闻来复制对应窗口的文书到缓冲区

出殡此新闻来撤除某种正在张开的操作

WM_GETTEXTLENGTH =14

WM_SETCURSOR

获得与三个窗口有关的文件的长度(不带有空字符)

0x0020

WM_PAINT = 15

比方鼠标引起光标在有个别窗口中移动且鼠标输入未有被抓获时,发音讯给该窗口

渴求五个窗口重画本身

WM_MOUSEACTIVATE

WM_CLOSE = 16

0x0021

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

当光标在某个非激活的窗口中而客商正按着鼠标的某些键发送此消息给当下窗口

WM_QUERYENDSESSION= 17

WM_CHILDACTIVATE

当顾客筛选甘休对话框或程序自身调用ExitWindows函数

0x0022

WM_QUIT = 18

出殡此音信给MDI子窗口当顾客点击此窗口的标题栏,或当窗口被激活、移动、改变大小

用来终结程序运维或当程序调用postquitmessage函数

WM_QUEUESYNC

WM_QUERYOPEN = 19

0x0023

当顾客窗口恢复生机原先的大大小小地方时,把此音讯发送给有个别图标

此新闻由基于Computer的教练程序发送,通过WH_JOU卡宴NALPALYBACK的Hook程序分别出顾客输入音讯

WM_ERASEBKGND = 20

WM_GETMINMAXINFO

当窗口背景必需被擦除时(例在窗口变越来越大小时)

0x0024

WM_SYSCOLORCHANGE =21

当窗口要就要改动大小或岗位时,发送此音信给该窗口

当系统颜色校订时,发送此消息给持有超级窗口

WM_PAINTICON

WM_ENDSESSION = 22

0x0026

当系统经过发生WM_QUE奥迪Q7YENDSESSION音讯后,此音讯发送给应用程序,

当窗口Logo就要被重绘时,发送此消息给该窗口

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

WM_ICONERASEBKGND

WM_SYSTEMERROR = 23

0x0027

WM_SHOWWINDOW = 24

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

当隐讳或展现窗口是出殡和下葬此音讯给这些窗口

WM_NEXTDLGCTL

WM_ACTIVATEAPP = 28

0x0028

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

发送此音信给三个会话框程序以转移主旨地点

WM_FONTCHANGE = 29

WM_SPOOLERSTATUS

当系统的书体财富库变化时发送此新闻给持有顶尖窗口

0x002A

WM_TIMECHANGE = 30

当打字与印刷管理列队扩大或减少一条作业时发生此新闻

当系统的时光转移时发送此音信给全部拔尖窗口

WM_DRAWITEM

WM_CANCELMODE = 31

0x002B

发送此音讯来废除某种正在张开的摸态(操作)

当Button,ComboBox,Listbox,Menu控件的外观改造时,发送此新闻给那么些控件的主人

WM_SETCURSOR = 32

WM_MEASUREITEM

设若鼠标引起光标在有个别窗口中移动且鼠标输入未有被擒获时,就发音信给有些窗口

0x002C

WM_MOUSEACTIVATE =33

当Button,ComboBox,list box,ListView,Menu
项被创设时,发送此音信给控件的持有者

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

WM_DELETEITEM

WM_CHILDACTIVATE =34

0x002D

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

当ListBox 或 ComboBox被衰亡或当有些项通过发送LB_DELETESTRING、LB_RESETCONTENT、
CB_DELETESTRING、CB_RESETCONTENT
音信被删除时,发送此新闻给控件的持有者

WM_QUEUESYNC = 35

WM_VKEYTOITEM

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

0x002E

暌违出客商输入音信

贰个有着LBS_WANTKEYBOA宝马X3DINPUT风格的ListBox控件发送此消息给它的持有者,以此来响应WM_KEYDOWN消息

WM_GETMINMAXINFO =36

WM_CHARTOITEM

此新闻发送给窗口当它将在修改大小或地点;

0x002F

WM_PAINTICON = 38

二个装有LBS_WANTKEYBOAENVISIONDINPUT风格的ListBox控件发送此音讯给它的全数者,以此来响应WM_CHAR消息

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

WM_SETFONT

WM_ICONERASEBKGND =39

0x0030

此消息发送给有个别最小化窗口,仅当它在摄影标前它的背景必得被重画

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

WM_NEXTDLGCTL = 40

WM_GETFONT

发送此信息给四个对话框程序去修改核心地点

0x0031

WM_SPOOLERSTATUS =42

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

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

WM_SETHOTKEY

WM_DRAWITEM = 43

0x0032

当button,combobox,listbox,menu的可视外观更换时发送

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

此音信给这么些空件的主人

WM_GETHOTKEY

WM_MEASUREITEM = 44

0x0033

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

应用程序发送此音信来剖断热键与有些窗口是或不是有关联

发送此消息给控件的主人

WM_QUERYDRAGICON

WM_DELETEITEM = 45

0x0037

当the list box 或 combo box 被死灭 或 当
有些项被删去通过LB_DELETESTRING,LB_RESETCONTENT, CB_DELETESTRING, or
CB_RESETCONTENT 消息

此音信发送给最小化窗口,当此窗口将要被拖放而它的类中尚无概念图标,应用程序就回去一个图标或光标的句柄,当客商拖放Logo时系统展现那些图标或光标

WM_VKEYTOITEM = 46

WM_COMPAREITEM

此信息有二个LBS_WANTKEYBOATiguanDINPUT风格的发出给它的持有者来响应WM_KEYDOWN消息

0x0039

WM_CHARTOITEM = 47

出殡此新闻来决断ComboBox或ListBox新增的项的对峙地方

此音讯由三个LBS_WANTKEYBOA索罗德DINPUT风格的列表框发送给她的持有者来响应WM_CHAR消息

WM_COMPACTING

WM_SETFONT = 48

0x0041

当绘制文本时前后相继发送此音信获得控件要用的颜色

显示内部存款和储蓄器已经相当少了

WM_GETFONT = 49

WM_WINDOWPOSCHANGING

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

0x0046

WM_SETHOTKEY = 50

当调用SetWindowPos()函数退换窗口的轻重和职位后,发送此音信给该窗口

应用程序发送此音信让五个窗口与多少个热键相关连

WM_POWER

WM_GETHOTKEY = 51

0x0048

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

当系统将跻身挂起状态时发送此音讯给持有进程

WM_QUERYDRAGICON =55

WM_COPYDATA

此新闻发送给最小化窗口,当此窗口就要被拖放而它的类中未有概念Logo,应用程序能

0x004A

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

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

WM_COMPAREITEM = 57

WM_CANCELJOURNAL

出殡此音信来剖断combobox或listbox新增的项的相对地方

0x004B

WM_GETOBJECT = 61

当某些客商撤除程序日志激活状态,发送此新闻给应用程序

WM_COMPACTING = 65

WM_NOTIFY

体现内部存储器已经超少了

0x004E

WM_WINDOWPOSCHANGING= 70

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

发送此音讯给那一个窗口的轻重和职责就要被转移时,来调用setwindowpos函数或其余窗口管理函数

WM_INPUTLANGCHANGEREQUEST

WM_WINDOWPOSCHANGED= 71

0x0050

出殡此音信给这些窗口的高低和职位已经被更改时,来调用setwindowpos函数或其它窗口管理函数

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

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

WM_INPUTLANGCHANGE

当系统就要步入暂停状态时发送此消息

0x0051

WM_COPYDATA = 74

当应用程序输入语言退换后发送此新闻给受影响的最一流窗口

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

WM_TCARD

WM_CANCELJOURNAL =75

0x0052

当某些客商撤废程序日志激活状态,提交此消息给程序

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

WM_NOTIFY = 78

WM_HELP

当有个别控件的某部事件已经发生或以此控件供给获得部分音信时,发送此音信给它的父窗口

0x0053

WM_INPUTLANGCHANGEREQUEST= 80

当客户按下了F1,如若有个别菜单是激活的,就发送此音讯给此窗口关联的菜系,不然就发送给有规范的窗口,假使当前都并未有规范,就把此消息发送给当前激活的窗口

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

WM_USERCHANGED

WM_INPUTLANGCHANGE= 81

0x0054

当平台现场风华正茂度被更正后发送此信息给受影响的最一级窗口

当客商已经报到或退出后发送此音讯给具备的窗口,当客户登陆或分离时系统修改客商的求实设置音信,在顾客更新设置时系统及时发送此音讯

WM_TCARD = 82

WM_NOTIFYFORMAT

当程序已经初叶化windows协助例程时发送此消息给应用程序

0x0055

WM_HELP = 83

公用控件和它们的父窗口通过此消息来推断在WM_NOTIFY新闻中是应用ANSI照旧UNICODE格局的结构,使用此控件能使有些控件与它的父控件进行相互通信

此新闻展现顾客按下了F1,即便某些菜单是激活的,就发送此新闻个此窗口关联的美食指南,不然就

WM_CONTEXTMENU

发送给有规范的窗口,倘若当前都并没反常,就把此新闻发送给当前激活的窗口

0x007B

WM_USERCHANGED = 84

当客户在有些窗口中式茶食击右键,则发送此音讯给该窗口

当客户已经登陆或分离后发送此音讯给持有的窗口,当客户登陆或退出时系统立异客商的现实

WM_STYLECHANGING

安装新闻,在客商更新设置时系统及时发送此新闻;

0x007C

WM_NOTIFYFORMAT =85

当将在调用SetWindowLong()函数窗口的一个或多少个作风时,发送此新闻给该窗口

公用控件,自定义控件和她们的父窗口通过此音讯来推断控件是利用ANSI依然UNICODE结构

WM_STYLECHANGED

在WM_NOTIFY音讯,使用此控件能使有些控件与它的父控件之间开展交互通讯

0x007D

WM_CONTEXTMENU =123

当调用SetWindowLong()函数退换了窗口的一个或五个作风后,发送此新闻给该窗口

当客户某些窗口中式茶食击了弹指间右键就发送此新闻给那么些窗口

WM_DISPLAYCHANGE

WM_STYLECHANGING =124

0x007E

当调用SETWINDOWLONG函数将在修改贰个或五个窗口的品格时发送此音讯给那三个窗口

当显示屏的分辨率退换后发送此音讯给具有的窗口

WM_STYLECHANGED =125

WM_GETICON

当调用SETWINDOWLONG函数三个或五个 窗口的风骨后发送此消息给这几个窗口

0x007F

WM_DISPLAYCHANGE =126

发送此音信给有些窗口,重返与某些窗口有提到的大Logo或小Logo的句柄

当显示器的分辨率改良后发送此新闻给全部的窗口

WM_SETICON

WM_GETICON = 127

0x0080

此消息发送给有个别窗口来回到与某些窗口有关连的大Logo或小Logo的句柄;

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

WM_SETICON = 128

WM_NCCREATE

次第发送此消息让二个新的大Logo或小Logo与某些窗口关联;

0x0081

WM_NCCREATE = 129

当某些窗口第一次被创立时,此音讯在WM_CREATE音信被发送前发送

当某些窗口第四回被创建时,此消息在WM_CREATE信息发送前发送;

WM_NCDESTROY

WM_NCDESTROY = 130

0x0082

此音信布告某些窗口,非顾客区正在销毁

此新闻公告有些窗口,正在销毁非顾客区

WM_NCCALCSIZE = 131

WM_NCCALCSIZE

当有些窗口的客商区域必需被核实时发送此新闻

0x0083

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

当总计有些窗口的顾客区大小和职分时发送此新闻

WM_NCPAINT = 133

WM_NCHITTEST

发表评论

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

相关文章

网站地图xml地图