全球彩票平台_全球彩票注册平台|官网下载地址

热门关键词: 全球彩票平台,全球彩票注册平台,全球彩官网下载地址

常用新闻大全,关于windows操作系统之新闻和消息

1. 问题

1. 窗口进程 
各样窗口会有一个名字为窗口进度的回调函数(WndProc),它包涵多少个参数,分别为:窗口句柄(Window Handle),新闻ID(Message ID),和四个音信参数(wParam, lParam),当窗口收到音讯时系统就能够调用此窗口进度来拍卖音信。(所以叫回调函数卡塔 尔(英语:State of Qatar)

音信是指什么?
     消息系统对于一个win32程序来讲拾叁分首要,它是多个程序运转的重力来源。一个音信,是系统定义的二个三10个人的值,他唯豆蔻梢头的概念了贰个事件,向 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.0x0400(WM_USEHaval)-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
常用新闻大全,关于windows操作系统之新闻和消息队列。别的时候,客商移动鼠标,点击开关或然敲击键盘,鼠标也许键盘驱动将改造那几个输入为音信,并将它们放到系统音讯队列中。系统在检查实验它们的目窗口时,同偶尔间从系统音讯队列中移除它们。然后将她们发送到音讯相关窗口的窗口成立线程。线程从它们的音讯队列中抽取全部鼠标和键盘音讯。线程从它们的队列中去除新闻,并引导系统将它们发送到正确的窗口进程进展管理。

除了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_SETCUENCORESOGL450消息。那个音讯文告窗口它早已被激活了,键盘输入正指向该窗口,鼠标光标已经移至了窗口边框内。当应用程序调用某个系统函数时,也会窗口非队列消息,例如,应用程序在调用SetWindowPos时,系统将发送WM_WINDOWPOSCHANGED消息。

些Wechat息发送非队列消息:布罗兹castSystemMessage, 布罗兹castSystemMessageEx, SendMessage, SendMessageTimeout, and SendNotifyMessage.

音信处理
四线程应用程序,会在每一种创建了窗口的线程富含一个新闻队列。

MSG msg;
BOOL bRet;

while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0)
{
if (bRet == -1)
{
// handle the error and possibly exit
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
叁个应用程序能够透过调用PostQuitMessage来截至其自己的音信循环,响应应用程序主窗口的WM_DESTROY音讯,就相比出色。

PostMessage发送三个NULL窗口句柄的消息,该新闻将会被放在如今线程音讯队列中,应用程序必需管理这么些消息。PostMessage也可以通过HWND_TOPMOST 句柄来给具有顶层窗口发送音信。

PostMessage平昔能够得逞发送消息,平日是叁个荒诞的假诺,比方新闻队列是满的。一个应用程序应该核实PostMessage的再次回到值。借使失利了,须要重新发送新闻。

SendMessage日常客户老爹和儿子窗口之间的相互。

SendMessageCallback函数发送贰个音讯,并随时回到,窗口进度在管理完这些新闻后,系统将调用钦命的回调函数。该回调函数的实际,请看SendAsyncProc

不常,你只怕想向具备顶层窗口发送音讯。比如,应用程序改变了时光,能够因此SendMessage,并制定HWND_TOPMOST,发送WM_TIMECHANGE.你也能够透过布罗兹castSystemMessage函数,并给lpdwRecipients参数拟订BSN_APPLICATIONS

消息死锁
1.SendMessage会等待窗口进程管理完结后才重回,假使窗口进程当时所在线程振作调整权扬弃,那么僵深夜死锁。
2.假如选用线程附加到了和发送线程同三个音讯队列,也将促成应用程序死锁的出殡

瞩目,正在接纳音讯的线程,不应该显得甩掉调控权;调用上边函数将唤起线程隐秘吐弃调节权。
DialogBox
?DialogBoxIndirect
?DialogBoxIndirectParam
?DialogBoxParam
?GetMessage
?MessageBox
?PeekMessage
?SendMessage

为了防止地下死锁,思索采取SendNotifyMessage大概SendMessageTimeout。要不然,窗口进程能够透过InSendMessage恐怕InSendMessageEx检查实验其收到到的音讯是或不是来自其余线程.在拍卖七个音讯时,在调用上边列表中别的函数前,窗口进度应该调用InSendMessage(Ex).假若回去TRUE,窗口过程必需在yeild前,调用ReplyMessage函数。

系统广播消息-略

总结:
1.消息分为系统定义音信和客户自定义音讯,其ID值皆有和好的约束。
2.各个线程暗中同意是绝非音信队列的,线程唯有在首先次调用客户接口时(譬喻创制窗口卡塔尔,系统才为其成立音信队列。
3.类别本中国人民保险公司险一个类别新闻队列,然后还为每一种GUI线程线程维护一个线程专门消息队列。
4.鼠标、键盘等驱动,首先将事件转变为音信放置在系统新闻队列中,然后系统又经过窗口来鲜明将其放入到哪些线程信息队列中。
5.线程新闻循环收取音信,实行拍卖,将音讯再派发给系统,系统调用音信对应的窗口进度。
6.PostMessage不一定成功,比如队列是满的。
7.制止音讯死锁,例如收受音讯的窗口进程,在弃权前,须求检查实验新闻是或不是发自此外线程。不然其余线程将长日子等待。其实本身深感这里无法成为死锁嘛,毕竟依然可能再实施的,只是时长而已。
8.内需专心wm_paint,wm_timer,wm_quit等特种音信
9.连串预订义新闻其实大都以这个控件消息,布告信息,系统广播音信等等。

表A-1  Windows音信散播

当在console中调用API ShellExecuteEx展开"test.iqy"文件时,发掘excel会hang住,console退出后excel才会响应,但一向双击"test.iqy"是不曾难点的,有趣的是那一个状态独有在xp发生,在win7上还未有那些标题。

2 新闻类型 
1) 系统定义消息(System-Defined Messages)
 
在SDK中刚开始阶段定义好的新闻,非客户定义的,其范围在[0x0000, 0x03ff]里面, 能够分成以下三类:
1>窗口新闻(Windows Message) 
与窗口的里边运营有关,如创制窗口,绘制窗口,销毁窗口等。能够是相近的窗口,也能够是Dialog,控件等。
如:WM_CREATE, WM_PAINT, WM_MOUSEMOVE, WM_CTLCOLOR, WM_HSCROLL...
2>命令新闻(Command Message):注意这类音信通称为WM_COMMAND
与处理客商需要有关, 如单击菜单项或工具栏或控件时, 就能爆发命令新闻。
WM_COMMAND, LOWO路虎极光D(wParam)表示菜单项,工具栏开关或控件的ID。如若是控件, HIWO奔驰M级D(wParam)表示控件音讯类型
3> 控件布告(Notify Message) 
控件公告音讯, 那是最灵敏的新闻格式, 其Message, wParam, lParam分别为:WM_NOTIFY, 控件ID,指向NMHD牧马人的指针。NMHD纳瓦拉包罗控件通告的剧情, 能够轻巧扩张。
2) 程序定义音讯(Application-Defined Messages) 
客户自定义的新闻, 对于其范围犹如下规定:
WM_USER: 0x0400-0x7FFF    (ex. WM_USER 10)
WM_APP(winver>4.0): 0x8000-0xBFFF (ex.WM_APP 4)
RegisterWindowMessage: 0xC000-0xFFFF

图片 1typedef struct tagMsg
图片 2{
图片 3       HWND    hwnd;       //选用该音讯的窗口句柄
图片 4       UINT    message;    //音讯常量标识符,也正是大家经常所说的新闻号
图片 5       WPARAM  wParam;     //三十一位新闻的特定附加消息,确切含义信任于新闻值
图片 6       LPARAM  lParam;     //叁十四位新闻的特定附加音讯,确切含义正视于音讯值
图片 7       DWOENCORED   time;       //音信成立时的时刻
图片 8       POINT   pt;         //新闻成立时的鼠标/光标在荧屏坐标系中之处
图片 9}MSG;
图片 10

常用新闻大全,关于windows操作系统之新闻和消息队列。消息相关函数:

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 30位的窗口句柄。窗口能够是任何类型的显示器对象,因为Win32可见维护大比非常多可视对象的句柄(窗口、对话框、开关、编辑框等)。
     message用于区分其余音信的常量值,这几个常量能够是Windows单元中预订义的常量,也足以是自定义的常量。信息标记符以常量命名的形式提出信息的意义。当窗口进度选用到音信之后,他就能够选拔音讯标志符来决定哪些处理音信。比如、WM_PAINT告诉窗口进程窗体顾客区被改成了特需重绘。符号常量钦赐系统信息归于的连串,其前缀指明了处明白释新闻的窗体的种类。
     wParam 通常是多个与音讯有关的常量值,也或然是窗口或控件的句柄。
     lParam 日常是多个照准内部存款和储蓄器中多少的指针。由于WParam、lParam和Pointer都以33人的,因而,它们中间能够相互转变。

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

DWORD GetMessagePos(void);

0 ~ WM_USER – 1

复发情况:XP sp3 / Office 二零零六(别的office版本应该也足以,未有测验卡塔 尔(阿拉伯语:قطر‎

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

消息标志符的值
     系统一保险留音信标记符的值在0x0000在0x03ff(WM_USETiggo-1)范围。那一个值被系统定义音信使用。应用程序不可能动用那么些值给和煦的音讯。应用程序消息从WM_USER(0X0400)到0X7FFF,或0XC000到0XFFFF;WM_USE奥迪Q5到 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_KEYBOAKugaD 表面音讯来自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哈弗MuranoSPACE 组合框内部存款和储蓄器不足
 CBN_KILLFOCUS 组合框失去输入大旨
 CBN_SELCHANGE 在组合框中选用了意气风发项
 CBN_SELENDCANCEL 顾客的抉择应该被撤回
 CBN_SELENDOK 客商的挑精拣肥是合法的
 CBN_SETFOCUS 组合框获得输入主旨

音信来源未知

DWORD GetQueueStatus(
UINT flags
);
在消息队列中的音讯的类型
flags为要检测的音讯类型。

自定义窗口类整数新闻

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

8(音讯死锁( Message Deadlocks) 
黄金时代经有线程A和B, 今后有以下下步骤
1) 线程A SendMessage给线程B, A等待音讯在线程B中拍卖后归来
2) 线程B收到了线程A发来的新闻,并开展管理, 在管理进程中,B也向线程A SendMessgae,然后等待从A再次回到。
因为这个时候, 线程A正等待从线程B重临, 无法管理B发来的消息, 进而招致了/线程A,B相互等待, 变成死锁。几个线程也得以产生环形死锁。
能够运用 SendNotifyMessage或SendMessageTimeout来幸免现身死锁。

编辑框控件
 EN_CHANGE 编辑框中的文本己更新
 EN_E中华V福睿斯SPACE 编辑框内部存款和储蓄器不足
 EN_HSCROLL 客户点击了水平滚动条
 EN_KILLFOCUS 编辑框正在失去输入主旨
 EN_MAXTEXT 插入的原委被截断
 EN_SETFOCUS 编辑框获得输入主旨
 EN_UPDATE 编辑框中的文本将在更新
 EN_VSCROLL 顾客点击了垂直滚动条消息含义

重返值得高字节表示近些日子在新闻队列中的新闻类型。低字节表示从上次GetQueueStatus,GetMessage也许PeekMessage后被投入队列的音讯类型。

InSendMessage

WM_APP ~ 0xBFFF

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

9 BroadcastSystemMessage 
小编们平常所接触到的音信都以发送给窗口的,其实, 音讯的收信人可以是不可胜举的,它能够是应用程序(applications), 可设置驱动(installable drivers),互联网设施(network drivers), 系统级设备驱动(system-level device drivers)等, 
布罗兹castSystemMessage这一个API能够对上述系统组件发送信息。

列表框控件
 LBN_DBLCLK 客商双击了大器晚成项
 LBN_E本田CR-VEvoqueSPACE 列表框内部存款和储蓄器相当不够
 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的目标是为了减削刷新窗口的次数。
图片 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 %pn", shell_exec_info.hProcess);

    return ret;
}

图片 12
    非队列音信将会绕过系统队列和消息队列,直接将音信发送到窗口进度,。系统一发布送非队列音信布告窗口,系统一发布送音讯通告窗口。举例,当用户激活二个窗口系统一发布送WM_ACTIVATE, WM_SETFOCUS, and WM_SETCUCRUISERSORAV4。这几个音信布告窗口它被激活了。非队列音信也足以由当应用程序调用系统函数发生。譬如,当程序调用SetWindowPos系统发送WM_WINDOWPOSCHANGED音信。一些函数也发送非队列音讯,比如上边大家要谈到的函数。
     
音信的发送
     精晓了上边包车型客车这么些底蕴理论之后,大家就足以开展一下简易的音信发送与吸取。
     把二个音信发送到窗口有3种艺术:发送、寄送和播发。
     发送新闻的函数有SendMessage、SendMessageCallback、SendNotifyMessage、 SendMessage提姆eout;寄送消息的函数首要有PostMessage、PostThreadMessage、 PostQuitMessage;广播消息的函数笔者通晓的唯有布罗兹castSystemMessage、 布罗兹castSystemMessageEx。
     SendMessage的原型如下:LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam),那一个函数首即使向叁个或多个窗口发送一条音信,一直等到信息被管理未来才会回去。可是供给小心的是,假若接到消息的窗口是同二个应用程序的黄金时代部分,那么那几个窗口的窗口函数就被看做一个子顺序及时被调用;即使接纳新闻的窗口是被别的的线程所创办的,那么窗口系统就切换成对应的线程况且调用相应的窗口函数,那条新闻不会被放进目的应用程序队列中。函数的重返值是由接纳音讯的窗口的窗口函数再次回到,重返的值决意于被发送的新闻。
     PostMessage的原型如下:BOOL PostMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam),该函数把一条消息放置到创立hWnd窗口的线程的新闻队列中,该函数不等信息被管理就立马将调整重回。须求注意的是,若是hWnd参数为 HWND_BROADCAST,那么,音信将被寄送给系统中的全部的交汇窗口和弹出窗口,然而子窗口不会选择该音信;若是hWnd参数为NULL,则该函数相似于将dwThreadID参数设置成当下线程的标志来调用PostThreadMEssage函数。
  从地点的那2个有着代表性的函数,大家能够看出信息的发送形式和寄送情势的界别所在:被发送的新闻是或不是会被当下管理,函数是不是及时回去。被发送的音信会被及时管理,管理完毕后函数才会回到;被寄送的新闻不会被立时管理,他被放置二个先进先出的体系中,一直等到应用程序空线的时候才会被拍卖,可是函数放置消息后当即赶回。
图片 13
  实际上,发送新闻到三个窗口处理进程和直接调用窗口管理进度之间并从未太大的界别,他们直白的有一无二不同就在于你能够要求操作系统截获全部被发送的音信,然而不可以看到收获对窗口管理进程的第一手调用。
  以寄送点子发送的音讯平日是与顾客输入事件相对应的,因为那些事件不是老大殷切,能够展开缓慢的缓冲管理,举个例子鼠标、键盘新闻会被寄送,而按键等音信则会被发送。
  广播音讯用得超少,布罗兹castSystemMessage函数原型如下:
      long 布罗兹castSystemMessage(DWO奇骏D dwFlags,LPDWOLX570D lpdwRecipients,UINT uiMessage,WPARAM wParam,LPARAM lParam);该函数可以向钦命的选取者发送一条新闻,这个选用者能够是应用程序、可安装的驱动程序、互连网驱动程序、系统品级的装置驱动音信和他们的容易组合。供给小心的是,即使dwFlags参数是BSF_QUEEscortY并且起码四个选择者再次来到了BROADCAST_QUERY_DENY,则返回值为0,若无一点名BSF_QUEENVISIONY,则函数将新闻发送给全数接纳者,并且忽视其重回值。

若果发送音信低于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 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

> 0xFFFF

3. 原因深入分析

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

非音讯队列方式,直接调用窗口进程,系统当下切换来收到线程推行,发送线程锁住,知道接收线程管理完结

SendMessageTimeout

为未来系统利用保留

3.1 excel hang在哪里?

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

该函数通过调用窗口进程的方法发送消息,假若窗口归属差别线程,SendMessageTimerout将精通新闻管理达成才回去只怕钦点的超时已经过去,要是窗口就在近日线程,则直接调用窗口进度,并忽视time-out超时

SendNotifyMessage
假设窗口创设于归于发送新闻的线程,则调用窗口进程,并等待窗口进度管理落成该新闻。借使是分裂线程,则将音讯传递到窗口进程,并马上回去,不等待窗口进度的音讯管理进度。

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

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

表A-2  常用Windows消息

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

 

音信名称

图片 22

   首先,GetMessage从进程的主线程的音讯队列中得到几个音讯并将它复制到MSG结构,假若队列中并未信息,则GetMessage函数将翘首以待贰个新闻的到来以往才回来。如果您将一个窗口句柄作为第叁个参数字传送入GetMessage,那么独有钦命窗口的的新闻可以从队列中拿到。GetMessage也得以从音信队列中过滤音讯只接受信息队列中落在界定内的新闻。那个时候将要动用GetMessage/PeekMessage钦点二个消息过滤器。那些过滤器是一个音讯标志符的界定只怕是叁个窗体句柄,或然双方同临时间钦命。当应用程序要搜索三个后入新闻队列的新闻是很有用。WM_KEYFIRST 和 WM_KEYLAST 常量用于选用全数的键盘新闻。 WM_MOUSEFIRST 和 WM_MOUSELAST 常量用于选拔全部的鼠标音讯。 
 然后TranslateAccelerator决断该新闻是还是不是二个按钮音讯还假若八个加快键音讯,假诺是,则该函数将把多少个开关音信调换来三个加快键音讯传递给窗口的回调函数。管理了加快键之后,函数TranslateMessage将把多少个按钮音讯WM_KEYDOWN和WM_KEYUP转变到七个WM_CHAENVISION,然则须要在乎的是,音讯WM_KEYDOWN,WM_KEYUP仍旧将传递给窗口的回调函数。     
 管理完之后,DispatchMessage函数将把此音讯发送给该音讯钦命的窗口中已设定的回调函数。如若音讯是WM_QUIT,则 GetMessage再次回到0,进而退出循环体。应用程序能够利用PostQuitMessage来甘休自身的音讯循环。平常在主窗口的 WM_DESTROY音讯中调用。
 上面大家举二个大面积的小例子来证实这一个信息泵的应用:

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

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

说  明

查看参数知excel调用NtUserMessageCall()相近如下:

  这里大家担任全部的键盘音讯,所以就用WM_KEYFIRST 和 WM_KEYLAST作为参数。最终一个参数能够是PM_NOREMOVE 或者 PM_REMOVE,表示音信音信是还是不是相应从信息队列中除去。                 
   所以这段小代码正是判定是或不是按下了Esc键,假诺是就進展管理。

WM_NULL 

NtUserMessageCall(HWND_BROADCAST, WM_DDE_INITIATE)

窗口进程
 窗口进度是五个用来拍卖全体发送到那么些窗口的消息的函数。任何四个窗口类都有一个窗口进度。同一个类的窗口使用相仿的窗口进程来响应音信。系统发送新闻给窗口进程将信息数据作为参数字传送递给她,新闻赶到之后,遵照音讯类型排序实行管理,个中的参数则用来不相同不一样的新闻,窗口进度使用参数产生合适行为。
 一个窗口进度不通常忽视音讯,倘若她不管理,它会将新闻传回到施行默许的管理。窗口进程通过调用DefWindowProc来做那个管理。窗口进度必得return一个值作为它的音信管理结果。大非常多窗口只管理小片段消息和将别的的经过DefWindowProc传递给系统做暗中认可的处理。窗口过程被全数归属同叁个类的窗口分享,能为区别的窗口处理音讯。上边大家来看一下切实的实例:

0x0000

表明excel给全部顶层窗口发送一个WM_DDE_INITIATE音信,但是有窗口未有response

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

空新闻,此信息将被吸收窗口忽视

通过能够狐疑是出于console进度在和excel用DDE信息通讯时,console未有响应excel发送的DDE音信,引致excel hang住

 

WM_CREATE 

 

音讯分流器
  日常的窗口进度是透过多个switch语句来兑现的,那些工作很烦,有没有更简便的措施呢?有,那正是新闻分流器,利用新闻分流器,我们得以把switch语句分成更加小的函数,每叁个音信都对应五个小函数,那样做的受益正是对新闻更易于管理。
  之所以被堪称音信分流器,便是因为它能够对别的音讯举行疏散。上边大家做一个函数就很精晓了:

0x0001

3.2 为了验证3.1.1的质疑,用API Monitor一下ShellExecuteEx

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

应用程序创立多个窗口

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

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

WM_DESTROY

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

0x0002

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

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

一个窗口被销毁

图片 102

图片 103   #define HANDLE_MSG(hwnd,msg,fn) 
图片 104             switch(msg): return HANDLE_##msg((hwnd),(wParam),(lParam),(fn));

WM_MOVE

call stack显示实乃ShellExecuteEx所调用

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

0x0003

图片 105

图片 106   #define HANDLE_WM_COMMAND(hwnd,wParam,lParam,fn) 
图片 107             ((fn)((hwnd),(int)(LOWORD(wParam)),(HWND)(lParam),(UINT)HIWORD(wParam)),0L);

活动贰个窗口

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

好了,事情到了这一步,应该全套都晴朗了。
唯独,大家发今后windowsx.h里面还会有二个宏:FO宝马X5WAWranglerD_WM_XXXX,大家照旧那WM_COMMAND为例,实行分析:

WM_SIZE

瞩目到下三个API GetWindowThreadProcessId ( 0x00310172 , 0x0012fb70 ),赶巧是获得这么些窗口的pid和tid,查看下参数窗口:

图片 108   #define FORWARD_WM_COMMAND(hwnd, id, hwndCtl, codeNotify, fn) 
图片 109     (void)(fn)((hwnd), WM_COMMAND, MAKEWPARAM((UINT)(id),(UINT)(codeNotify)), (LPARAM)(HWND)(hwndCtl))

0x0005

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

为此其实,FOEnclaveWAWranglerD_WM_XXXX将音讯参数实行了重复布局,生成了wParam && lParam,然后调用了我们定义的函数。

变动二个窗口的大大小小

图片 110

日前,大家剖析了新闻的主干理论和主题的函数及用法,接下去,大家将非常商量音讯传递在MFC中的完结。

WM_ACTIVATE

依附DDE的新闻参数,可以预知wParam正是出殡和安葬消息的窗口,其句柄为2425190 = 0x250166,反向查询知那是ShellExecuteEx创设的”WorkerW”窗口

MFC音信的拍卖完毕情势
  初看MFC中的各个音信,甚至在脑力中稳步的C 的震慑,大家兴许很当然的就能够想到利用C 的三大特点之风度翩翩:设想机制来兑现音信的传递,不过透过分析,大家看出事情实际不是想大家想像的那么,在MFC中国国投息是透过大器晚成种所谓的音信映射机制来管理的。
  为啥吧?在潘爱中华民族解放先锋生翻译的《Visual C 能力内部原因》(第4版卡塔尔中付出了详尽的原因说明,作者再一句话来讲一遍。在CWnd类中大约有112个音讯,还大概有其余的MFC的类呢,算起来音信太多了,在C 中对前后相继中用到的每三个派生类都要有三个vtable,每二个虚函数在vtable中都要占领二个4字节大小的进口地址,那样一来,对于各类特定项指标窗口或控件,应用程序都亟需一个440KB大小的表来扶助虚拟音讯控件函数。
  借使说上边包车型客车窗口或控件能够勉强实现的话,那么对于菜单命令新闻及开关命令新闻吧?因为不一样的应用程序有例外的美食指南和按键,大家怎么处理呢?在MFC 库的这种新闻映射系统就幸免了应用大的vtable,并且能够在拍卖不奇怪Windows音讯的还要管理百废待举的应用程序的通令音信。
  说白了,MFC中的新闻机制其实质是一张高大的音讯及其管理函数的大器晚成风度翩翩对应表,然后加上解析管理那张表的行使框架之中的生机勃勃对前后相继代码.那样就足以制止在SDK编制程序中用到的繁缛的CASE语句。

0x0006

图片 111

MFC的音讯映射的基类CCmdTarget
  倘令你想令你的控件能够举行音信映射,就务须从CCmdTarget类中派生。CCmdTarget类是MFC管理命令音信的底子、主题。MFC为此类设计了成百上千分子函数和一些成员数量,基本上是为了缓和消息映射难点的,全体响应消息或事件的类都从它派生,举例:应用程序类、框架类、文书档案类、视图类和精彩纷呈的控件类等等,还应该有众多。
不过那一个类里面有2个函数对消息映射非常首要,贰个是静态成员函数DispatchCmdMsg,另八个是虚函数OnCmdMsg。
DispatchCmdMsg特意供MFC内部采取,用来散发Windows音信。OnCmdMsg用来传递和出殡和下葬消息、更新顾客界直面象的情事。
CCmdTarget对OnCmdMsg的暗中同意落成:在当下命令目的(this所指)的类和基类的新闻映射数组里探究钦点命令消息的新闻管理函数。
  这里运用设想函数GetMessageMap获得传令指标类的消息映射入口数组_messageEntries,然后在数组里相称命令音信ID相近、调节公告代码也同等的音信映射条约。在那之中GetMessageMap是设想函数,所以可以断定当前下令指标的确切类。
如若找到了三个相配的消息映射条目款项,则采用DispachCmdMsg调用那个管理函数;
如若未有找到,则选用_GetBaseMessageMap获得基类的音讯映射数组,查找,直到找到或探寻了具有的基类(到CCmdTarget卡塔 尔(英语:State of Qatar)截止;
比如最后未有找到,则赶回FASLE。
  每一种从CCmdTarget派生的吩咐指标类都得以覆盖OnCmdMsg,利用它来显著是还是不是足以拍卖某条命令,假若无法,就透过调用下一命令目的的 OnCmdMsg,把该命令送给下三个指令指标管理。日常,派生类覆盖OnCmdMsg时,要调用基类的被遮掩的OnCmdMsg。
  在MFC框架中,一些MFC命令目的类隐瞒了OnCmdMsg,如框架窗口类掩瞒了该函数,完毕了MFC的科班命令新闻发送路线。须要的话,应用程序也足以覆盖OnCmdMsg,改造三个或三个类中的发送规定,达成与正式框架发送规定分裂的出殡和下葬路线。比方,在偏下情状能够作那样的管理:在要打断发送顺序的类中把命令传给叁个非MFC暗许对象;在新的非暗许对象中或在或许要传播命令的一声令下目的中。

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

图片 112

音信映射的剧情
    通过ClassWizard为大家转移的代码,大家得以见到,新闻映射基本上分为2相当多:
    在头文件(.h)中有二个宏DECLARE_MESSAGE_MAP(),他被放在了类的终极,是三个public属性的;与之对应的是在促成都部队分(.cpp)扩充了生机勃勃章消息映射表,内容如下:
    BEGIN_MESSAGE_MAP(当前类, 当前类的基类)
       //{{AFX_MSG_MAP(CMainFrame)
         新闻的输入项
       //}}AFX_MSG_MAP
   END_MESSAGE_MAP()
   可是仅是这两项还远不足以达成一条新闻,假若一个音讯工作,必得有以下3个部分去合营:
1.在类的定义中步入相应的函数评释;
2.在类的音讯映射表中步向相应的音信映射入口项;
3.在类的兑现中参预相应的函数体;

WM_SETFOCUS

 

消息的增进
   有了下边包车型地铁那么些只是作为根底,大家接下去就做大家最纯熟、最常用的工作:加多信息。MFC音信的增加首要有2种形式:自动/手动,我们就以那2种方法为例,说一下哪些加多音讯。
   1、利用Class Wizard完结自动抬高
      在菜单中选拔View-->Class Wizard,也足以用单击鼠标右键,选取Class Wizard,同样能够激活Class Wizard。接收Message Map标签,从Class name组合框中选用大家想要增多新闻的类。在Object IDs列表框中,选拔类的称谓。那时, Messages列表框显示此类的超多(若不是成套的话)可重载成员函数和窗口音讯。类重载突显在列表的上部,以实际臆产生员函数的轻重写字母来表示。其余为窗口音讯,以大写字母现身,描述了实在窗口所能响应的音信ID。选中大家向增加的新闻,单击Add Function按键,Class Wizard自动将该音信加多进去。
      偶尔候,大家想要增加的音讯本应有出今后Message列表中,不过正是找不到,如何是好?不要发急,我们得以选用Class Wizard上Class Info标签以扩大音信列表。在该页中,找到Message Filter组合框,通过它能够改造首页中Messages列表框中的选项。这里,我们选取Window,进而呈现全体的窗口音讯,黄金年代把状态下,你想要加多的音信就可以在Message列表框中现身了,如若还没曾,那就接着往下看:)

0x0007

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

   2、手动地加上海消防息管理函数
    假设在Messages列表框中照旧看不到大家想要的音信,那么该音信可能是被系统忽视掉也许是您自个儿成立的,在这里种处境下,就非得谐和手工业增添。依据大家日前所说的音讯职业的3个构件,大家每一个实行拍卖:
      1) 在类的. h文件中丰盛管理函数的扬言,紧接在//}}AFX_MSG行之后到场注脚,注意:应当要以afx_msg开头。
     常常,增多管理函数证明的最棒的地点是源代码中Class Wizard维护的表上面,可是在它标识其领域的{{}}括弧外面。这么些括弧中的任周永才西都将会被Class Wizard销毁。
      2) 接着,在顾客类的.cpp文件中找到//}}AFX_MSG_MAP行,紧接在它今后加盟新闻入口项。相像,也是身处{ {} }的外面
      3) 末了,在该公文中加多音信管理函数的实体。

得到核心后

图片 113

 

WM_KILLFOCUS

翻看一下buff之处:

 

0x0008

图片 114

消息范围

说 明

0 ~ WM_USER – 1

系统消息

WM_USER ~ 0x7FFF

自定义窗口类整数消息

WM_APP ~ 0xBFFF

应用程序自定义消息

0xC000 ~ 0xFFFF

应用程序字符串消息

> 0xFFFF

为以后系统应用保留

失掉主题

无独有偶便是开垦test.iqy的通令,表达ShellExecuteEx正是先创制了excel的长河,然后发送test.iqy的文本命令给excel展开。

表A-2  常用Windows消息

WM_ENABLE

 

消息名称

说  明

WM_NULL 

0x0000

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

WM_CREATE 

0x0001

应用程序创建一个窗口

WM_DESTROY

0x0002

一个窗口被销毁

WM_MOVE

0x0003

移动一个窗口

WM_SIZE

0x0005

改变一个窗口的大小

WM_ACTIVATE

0x0006

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

WM_SETFOCUS

0x0007

获得焦点后

WM_KILLFOCUS

0x0008

失去焦点

WM_ENABLE

0x000A

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

WM_SETREDRAW

0x000B

设置窗口是否能重画

WM_SETTEXT

0x000C

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

WM_GETTEXT

0x000D

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

WM_GETTEXTLENGTH

0x000E

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

WM_PAINT

0x000F

要求一个窗口重绘自己

WM_CLOSE

0x0010

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

WM_QUERYENDSESSION

0x0011

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

WM_QUIT

0x0012

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

WM_QUERYOPEN

0x0013

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

WM_ERASEBKGND

0x0014

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

WM_SYSCOLORCHANGE

0x0015

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

WM_ENDSESSION

0x0016

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

WM_SHOWWINDOW

0x0018

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

WM_ACTIVATEAPP

0x001C

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

WM_FONTCHANGE

0x001D

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

WM_TIMECHANGE

0x001E

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

WM_CANCELMODE

0x001F

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

WM_SETCURSOR

0x0020

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

WM_MOUSEACTIVATE

0x0021

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

WM_CHILDACTIVATE

0x0022

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

WM_QUEUESYNC

0x0023

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

WM_GETMINMAXINFO

0x0024

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

WM_PAINTICON

0x0026

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

WM_ICONERASEBKGND

0x0027

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

WM_NEXTDLGCTL

0x0028

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

WM_SPOOLERSTATUS

0x002A

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

WM_DRAWITEM

0x002B

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

WM_MEASUREITEM

0x002C

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

WM_DELETEITEM

0x002D

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

WM_VKEYTOITEM

0x002E

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

WM_CHARTOITEM

0x002F

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

WM_SETFONT

0x0030

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

WM_GETFONT

0x0031

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

WM_SETHOTKEY

0x0032

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

WM_GETHOTKEY

0x0033

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

WM_QUERYDRAGICON

0x0037

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

WM_COMPAREITEM

0x0039

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

WM_COMPACTING

0x0041

显示内存已经很少了

WM_WINDOWPOSCHANGING

0x0046

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

WM_POWER

0x0048

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

WM_COPYDATA

0x004A

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

WM_CANCELJOURNAL

0x004B

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

WM_NOTIFY

0x004E

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

WM_INPUTLANGCHANGEREQUEST

0x0050

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

WM_INPUTLANGCHANGE

0x0051

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

WM_TCARD

0x0052

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

WM_HELP

0x0053

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

WM_USERCHANGED

0x0054

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

WM_NOTIFYFORMAT

0x0055

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

WM_CONTEXTMENU

0x007B

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

WM_STYLECHANGING

0x007C

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

WM_STYLECHANGED

0x007D

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

WM_DISPLAYCHANGE

0x007E

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

WM_GETICON

0x007F

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

WM_SETICON

0x0080

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

WM_NCCREATE

0x0081

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

WM_NCDESTROY

0x0082

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

WM_NCCALCSIZE

0x0083

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

WM_NCHITTEST

0x0084

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

WM_NCPAINT

0x0085

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

WM_NCACTIVATE

0x0086

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

WM_NCMOUSEMOVE

0x00A0

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

WM_NCLBUTTONDOWN

0x00A1

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

WM_NCLBUTTONUP

0x00A2

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

WM_NCLBUTTONDBLCLK

0x00A3

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

WM_NCRBUTTONDOWN

0x00A4

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

WM_NCRBUTTONUP

0x00A5

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

WM_NCRBUTTONDBLCLK

0x00A6

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

WM_NCMBUTTONDOWN

0x00A7

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

WM_NCMBUTTONUP

0x00A8

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

WM_NCMBUTTONDBLCL

0x00A9

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

WM_KEYDOWN

0x0100

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

WM_KEYUP

0x0101

释放一个非系统键

WM_CHAR

0x0102

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

WM_DEADCHAR

0x0103

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

WM_SYSKEYDOWN

0x0104

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

WM_SYSKEYUP

0x0105

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

WM_SYSCHAR

0x0106

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

WM_SYSDEADCHAR

0x0107

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

WM_INITDIALOG

0x0110

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

WM_COMMAND

0x0111

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

WM_SYSCOMMAND

0x0112

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

WM_TIMER

0x0113

发生了定时器事件

WM_HSCROLL

0x0114

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

WM_VSCROLL

0x0115

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

WM_INITMENU

0x0116

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

WM_INITMENUPOPUP

0x0117

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

WM_MENUSELECT

0x011F

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

WM_MENUCHAR

0x0120

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

WM_ENTERIDLE

0x0121

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

WM_MENURBUTTONUP

0x0122

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

WM_MENUDRAG

0x0123

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

WM_MENUGETOBJECT

0x0124

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

WM_UNINITMENUPOPUP

0x0125

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

WM_MENUCOMMAND

0x0126

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

WM_CHANGEUISTATE

0x0127

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

WM_UPDATEUISTATE

0x0128

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

WM_QUERYUISTATE

0x0129

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

WM_CTLCOLORMSGBOX

0x0132

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

WM_CTLCOLOREDIT

0x0133

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

WM_CTLCOLORLISTBOX

0x0134

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

WM_CTLCOLORBTN

0x0135

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

WM_CTLCOLORDLG

0x0136

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

WM_CTLCOLORSCROLLBAR

0x0137

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

WM_CTLCOLORSTATIC

0x0138

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

WM_MOUSEMOVE

0x0200

鼠标移动

WM_LBUTTONDOWN

0x0201

按下鼠标左键

WM_LBUTTONUP

0x0202

释放鼠标左键

WM_LBUTTONDBLCLK

0x0203

双击鼠标左键

WM_RBUTTONDOWN

0x0204

按下鼠标右键

WM_RBUTTONUP

0x0205

释放鼠标右键

WM_RBUTTONDBLCLK

0x0206

双击鼠标右键

WM_MBUTTONDOWN

0x0207

按下鼠标中键

WM_MBUTTONUP

0x0208

释放鼠标中键

WM_MBUTTONDBLCLK

0x0209

双击鼠标中键

WM_MOUSEWHEEL

0x020A

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

WM_PARENTNOTIFY

0x0210

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

WM_ENTERMENULOOP

0x0211

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

WM_EXITMENULOOP

0x0212

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

WM_SIZING

0x0214

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

WM_CAPTURECHANGED

0x0215

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

WM_MOVING

0x0216

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

WM_POWERBROADCAST

0x0218

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

WM_DEVICECHANGE

0x0219

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

WM_MDICREATE

0x0220

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

WM_MDIDESTROY

0x0221

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

WM_MDIACTIVATE

0x0222

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

WM_MDIRESTORE

0x0223

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

WM_MDINEXT

0x0224

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

WM_MDIMAXIMIZE

0x0225

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

WM_MDITILE

0x0226

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

WM_MDICASCADE

0x0227

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

WM_MDIICONARRANGE

0x0228

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

WM_MDIGETACTIVE

0x0229

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

WM_MDISETMENU

0x0230

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

WM_ENTERSIZEMOVE

0x0231

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

WM_EXITSIZEMOVE

0x0232

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

WM_DROPFILES

0x0233

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

WM_MDIREFRESHMENU

0x0234

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

WM_MOUSEHOVER

0x02A1

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

WM_MOUSELEAVE

0x02A3

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

WM_CUT

0x0300

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

WM_COPY

0x0301

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

WM_PASTE 

0x0302

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

WM_CLEAR

0x0303

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

WM_UNDO

0x0304

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

WM_DESTROYCLIPBOARD

0x0307

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

WM_DRAWCLIPBOARD

0x0308

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

WM_PAINTCLIPBOARD

0x0309

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

WM_VSCROLLCLIPBOARD

0x030A

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

WM_SIZECLIPBOARD

0x030B

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

WM_ASKCBFORMATNAME

0x030C

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

WM_CHANGECBCHAIN

0x030D

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

WM_HSCROLLCLIPBOARD

0x030E

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

WM_QUERYNEWPALETTE

0x030F

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

WM_PALETTEISCHANGING

0x0310

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

WM_PALETTECHANGED

0x0311

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

来改变系统调色板

WM_HOTKEY

0x0312

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

WM_PRINT

0x0317

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

WM_PRINTCLIENT

0x0318

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

WM_APP

0x8000

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

WM_USER

0x0400

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

0x000A

3.3 总结

  表A-3  通告音讯-按键

接收程序Enable状态改善时爆发

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

消息名称

说 明

BN_CLICKED

单击按钮

BN_DISABLE

按钮被禁止

BN_DOUBLECLICKED

双击按钮

BN_HILITE

加亮按钮

BN_PAINT

按钮应当重画

BN_UNHILITE

加亮应当去掉

WM_SETREDRAW

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

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

0x000B

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

消息名称

说 明

CBN_CLOSEUP

组合框的列表框被关闭

CBN_DBLCLK

用户双击了一个字符串

CBN_DROPDOWN

组合框的列表框被拉下

CBN_EDITCHANGE

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

CBN_EDITUPDATE

组合框内的文本即将更新

CBN_ERRSPACE

组合框内存不足

CBN_KILLFOCUS

组合框失去输入焦点

CBN_SELCHANGE

在组合框中选择了一项

CBN_SELENDCANCEL

用户的选择将被忽略

CBN_SELENDOK

用户的选择将被执行

CBN_SETFOCUS

组合框获得输入焦点

安装窗口是还是不是能重画

4> ShellExecuteEx试行完成,但并不destroy "WorkerW"窗口

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

WM_SETTEXT

5> excel收到WM_DDE_EXECUTE消息后会广播WM_DDE_INITIATE新闻,"WorkerW"窗口所在的console进度由于还未概念音信管理函数,ShellExecuteEx定义的"WorkerW"窗口语资源新闻息管理函数得不到CPU实行时机,招致不会response该消息,进而导致excel hang住

消息名称

说 明

EN_CHANGE

编辑框中的文本己更新

EN_ERRSPACE

编辑框内存不足

EN_HSCROLL

用户点击了水平滚动条

EN_KILLFOCUS

编辑框失去输入焦点

EN_MAXTEXT

插入的内容被截断

EN_SETFOCUS

编辑框获得输入焦点

EN_UPDATE

编辑框中的文本将要更新

EN_VSCROLL

用户点击了垂直滚动条

0x000C

就好像,大家得以创造一个带窗口的程序,运维后将其挂起,这时候,尽管直接双击张开test.iqy也会hang住。

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

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

 

消息名称

说 明

LBN_DBLCLK

用户双击了一项

LBN_ERRSPACE

列表框内存不足

LBN_KILLFOCUS

列表框正在失去输入焦点

LBN_SELCANCEL

用户选择被取消

LBN_SELCHANGE

用户选择将改变

LBN_SETFOCUS

列表框获得输入焦点

WM_GETTEXT

4. 怎么双击展开excel不会hang住

Windows音讯大全

0x000D

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

  Windows是一新闻(Message卡塔 尔(英语:State of Qatar)驱动式系统,Windows音讯提供了应用程序与应用程序之间、应用程序与Windows系统之间举行电视发表的手段。应用程序要落实的功效由音讯来触发,并靠对消息的响应和拍卖来达成。Windows系统中有二种音信队列,黄金时代种是系统消息队列,另风流倜傥种是应用程序新闻队列。Computer的富有输入设备由 Windows监察和控制,当三个风波产生时,Windows先将输入的音信放入系统消息队列中,然后再将输入的信息拷贝到相应的应用程序队列中,应用程序中的消息循环从它的音信队列中搜寻每二个音信并发送给相应的窗口函数中。三个平地风波的发出,到达管理它的窗口函数必得经验上述进度。值得注意的是信息的非超越性,即无论是事件的急与缓,总是按达到的程序排队(一些种类音讯除却),那就使得有个别外表实时事件恐怕得不到那时的拍卖。

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

 

  由于Windows本身是由音讯使得的,举三个事例来证实那个标题。展开记事本程序,该程序有二个File菜单,那么,在运作该应用程序的时候,倘诺客商单击了File菜单里New命令时,那几个动作将被Windows (并不是应用程序本人!卡塔尔国所破获,Windows经过深入分析得到消息那么些动作应该由地点所说的不胜应用程序去管理,既然是那般,Windows就发送了个叫做WM_COMMAND的音讯给应用程序,该音信所富含新闻告知应用程序:"客户单击了New菜单",应用程序得到消息那生机勃勃音讯之后,采用相应的动作来响应它,那么些进度称为新闻管理。Windows为每一个应用程序(确切地就是每多个线程)维护了对应的新闻队列,应用程序的职务就是不停的从它的新闻队列中拿走新闻,分析消息和管理音信,直到一条摄取名叫WM_QUIT信息截至,那几个进度平日是由生机勃勃种叫做新闻循环的程序结构来落到实处的。

WM_GETTEXTLENGTH

5. 怎么win7上不会犹如此的主题素材

  音讯笔者是用作三个记下传递给应用程序的,那些记录中包罗了音讯的种类甚至其余新闻。举个例子,对于单击鼠标所发出的音讯的话,这几个记录中蕴含了单击鼠标时的坐标。那么些记录类型叫做T M s g,它在Wi n d o w s单元中是那样注脚的:

0x000E

5.1 在API Monitor中看下PostMessageW

type

得到与叁个窗口有关的文件的长度(不带有空字符卡塔 尔(阿拉伯语:قطر‎

图片 115

TMsg = packedrecord

WM_PAINT

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

hwnd: HWND / /窗口句柄

0x000F

图片 116

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

渴求三个窗口重绘本身

可以看到是ShellExecuteEx内部创设的线程,所以win7上ShellExecuteEx创造了多个线程专门用来管理和excel的DDE音信通讯,那样就能够符合规律的收四处理excel发过来的WM_DDE_INITIATE消息了

wParam: WPA R AM  // 三十二位音讯的特定附加消息

WM_CLOSE

lParam: LPA 悍马H2 AM  // 三11人音信的一定附加音讯

0x0010

time: DWOMuranoD / /音讯成立时的流年

当多个窗口或应用程序要关张时发送一个能量信号

pt: TPoint / /音信创造时的鼠标地方

WM_QUERYENDSESSION

end

0x0011

 

顾客筛选甘休对话框或应用程序本身调用ExitWindows()函数

音信中有怎么样?

WM_QUIT

是或不是感觉一个消息记录中的音讯像丹麦语相似?借使是那般,那么看黄金时代看上边包车型客车批注:

0x0012

hwnd 30位的窗口句柄。窗口能够是任何类型的荧屏对象,因为Win32能够爱抚大大多可视对象的句柄(窗口、对话框、开关、编辑框等)。

用来收场程序运维或应用程序调用Postquitmessage()函数来发出此新闻

message 用于区分其余新闻的常量值,这个常量能够是Windows单元中预订义的常量,也得以是自定义的常量。

WM_QUERYOPEN

wParam 常常是二个与新闻有关的常量值,也大概是窗口或控件的句柄。

0x0013

lParam 日常是四个对准内存中多少的指针。由于WParm、lParam和Pointer都以三12位的,由此,它们之间能够互相转换。

当顾客窗口苏醒原先的轻重缓急地方时,把此新闻发送给有个别图标

 

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_QUE奥德赛YENDSESSION音讯后,此音讯发送给应用程序

改造贰个窗口的深浅

WM_SHOWWINDOW

WM_ACTIVATE = 6

0x0018

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

当隐讳或出示窗口是发送此音信给那么些窗口

WM_SETFOCUS = 7

WM_ACTIVATEAPP

获得宗旨后

0x001C

WM_KILLFOCUS = 8

当有个别窗口将被激活时,将被激活窗口和当前移动(将要失去激活卡塔尔窗口会接到此消息,发此新闻给应用程序哪个窗口是激活的,哪个是非激活的

错过核心

WM_FONTCHANGE

WM_ENABLE = 10

0x001D

改变enable状态

当系统的书体财富库变化时发送此消息给全体一流窗口

WM_SETREDRAW = 11

WM_TIMECHANGE

设置窗口是不是能重画

0x001E

WM_SETTEXT = 12

当系统的岁月变化时发送此音信给全部顶尖窗口

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

WM_CANCELMODE

WM_GETTEXT = 13

0x001F

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

发送此音讯来撤除某种正在扩充的操作

WM_GETTEXTLENGTH =14

WM_SETCURSOR

获得与三个窗口有关的公文的尺寸(不包罗空字符卡塔尔

0x0020

WM_PAINT = 15

设若鼠标引起光标在有些窗口中活动且鼠标输入未有被抓获时,发音讯给该窗口

务求贰个窗口重画自个儿

WM_MOUSEACTIVATE

WM_CLOSE = 16

0x0021

当多个窗口或应用程序要关张时发送一个数字信号

当光标在有个别非激活的窗口中而顾客正按着鼠标的某部键发送此信息给当下窗口

WM_QUERYENDSESSION= 17

WM_CHILDACTIVATE

当客户采取停止对话框或程序本人调用ExitWindows函数

0x0022

WM_QUIT = 18

出殡此信息给MDI子窗口当客商点击此窗口的题目栏,或当窗口被激活、移动、退换大小

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

WM_QUEUESYNC

WM_QUERYOPEN = 19

0x0023

当客商窗口苏醒原先的高低地点时,把此新闻发送给有些Logo

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

WM_ERASEBKGND = 20

WM_GETMINMAXINFO

当窗口背景必得被擦除时(例在窗口变越来越大小时卡塔 尔(阿拉伯语:قطر‎

0x0024

WM_SYSCOLORCHANGE =21

当窗口要就要转移大小或岗位时,发送此新闻给该窗口

当系统颜色退换时,发送此音信给持有一级窗口

WM_PAINTICON

WM_ENDSESSION = 22

0x0026

当系统经过发生WM_QUE本田UR-VYENDSESSION新闻后,此消息发送给应用程序,

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

通报它对话是或不是终止

WM_ICONERASEBKGND

WM_SYSTEMERROR = 23

0x0027

WM_SHOWWINDOW = 24

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

当掩饰或出示窗口是发送此音信给那些窗口

WM_NEXTDLGCTL

WM_ACTIVATEAPP = 28

0x0028

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

发送此新闻给一个会话框程序以退换主题地方

WM_FONTCHANGE = 29

WM_SPOOLERSTATUS

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

0x002A

WM_TIMECHANGE = 30

当打字与印刷管理列队增添或减少一条作业时发生此消息

当系统的光阴更改时发送此信息给持有拔尖窗口

WM_DRAWITEM

WM_CANCELMODE = 31

0x002B

发送此消息来裁撤某种正在开展的摸态(操作卡塔 尔(英语:State of Qatar)

当Button,ComboBox,Listbox,Menu控件的外观更改时,发送此音讯给那么些控件的主人

WM_SETCURSOR = 32

WM_MEASUREITEM

假定鼠标引起光标在有些窗口中移动且鼠标输入未有被破获时,就发新闻给有个别窗口

0x002C

WM_MOUSEACTIVATE =33

当Button,Combo博克斯,list box,ListView,Menu 项被创制时,发送此音讯给控件的主人

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

WM_DELETEITEM

WM_CHILDACTIVATE =34

0x002D

发送此新闻给MDI子窗口当客户点击此窗口的标题栏,或当窗口被激活,移动,变越来越大小

当ListBox 或 ComboBox被灭绝或当一些项通过发送LB_DELETESTRING、LB_RESETCONTENT、 CB_DELETESTRING、CB_RESETCONTENT 消息被剔除时,发送此音信给控件的持有者

WM_QUEUESYNC = 35

WM_VKEYTOITEM

此音信由基于Computer的演练程序发送,通过WH_JOURNALPALYBACK的hook程序

0x002E

分别出客户输入音讯

三个全体LBS_WANTKEYBOAEscortDINPUT风格的ListBox控件发送此音信给它的主人,以此来响应WM_KEYDOWN消息

WM_GETMINMAXINFO =36

WM_CHARTOITEM

此音信发送给窗口当它就要改良大小或岗位;

0x002F

WM_PAINTICON = 38

贰个有所LBS_WANTKEYBOA昂科拉DINPUT风格的ListBox控件发送此音讯给它的主人,以此来响应WM_CHAR消息

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

WM_SETFONT

WM_ICONERASEBKGND =39

0x0030

此消息发送给某些最小化窗口,仅当它在美术标前它的背景必需被重画

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

WM_NEXTDLGCTL = 40

WM_GETFONT

出殡此音讯给一个对话框程序去修改主题地方

0x0031

WM_SPOOLERSTATUS =42

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

每当打字与印刷管理列队扩张或裁减一条作业时产生此新闻

WM_SETHOTKEY

WM_DRAWITEM = 43

0x0032

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

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

此音讯给那一个空件的主人

WM_GETHOTKEY

WM_MEASUREITEM = 44

0x0033

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

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

发送此消息给控件的持有者

WM_QUERYDRAGICON

WM_DELETEITEM = 45

0x0037

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

此音信发送给最小化窗口,当此窗口将在被拖放而它的类中未有概念图标,应用程序就回去三个图标或光标的句柄,当顾客拖放Logo时系统来得这么些Logo或光标

WM_VKEYTOITEM = 46

WM_COMPAREITEM

此新闻有四个LBS_WANTKEYBOA迈凯伦570DINPUT风格的发出给它的持有者来响应WM_KEYDOWN消息

0x0039

WM_CHARTOITEM = 47

发送此新闻来推断ComboBox或ListBox新扩展的项的相对地点

此音信由二个LBS_WANTKEYBOACR-VDINPUT风格的列表框发送给他的持有者来响应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或光标

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

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

本文由全球彩票平台发布于全球彩票平台操作系统,转载请注明出处:常用新闻大全,关于windows操作系统之新闻和消息

TAG标签: 全球彩票平台
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。