Windows消息机制

图片 27

1. 问题

7 TranslateMessage, TranslateAccelerator 
TranslateMessage: 把二个virtual-key消息转产生字符新闻(character
message),并置于当前线程的新闻队列中,音讯循环下贰次抽出管理。
TranslateAccelerator:将神速键对应到对应的菜系命令。它会把WM_KEYDOWN 或
WM_SYSKEYDOWN转形成快速键表中相应的WM_COMMAND或WM_SYSCOMMAND消息,
然后把转变后的 WM_COMMAND或WM_SYSCOMMAND直接发送到窗口进度管理,
管理完后才会重临。

当剪贴板的剧情退换时发送此新闻给剪贴板观望链的第多少个窗口;它同意用剪贴板观看窗口来

假设发送新闻低于WM_USE本田UR-V范围,到异步新闻队列函数(PostMessage、SendNotifyMessage卡塔 尔(阿拉伯语:قطر‎,新闻参数不应有富含指针,不然的话,操作将失败。该函数就要收到线程有机会管理该信息前回来,发送者将释放刚刚用到的内部存款和储蓄器。

PostQuitMessage

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

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_TIMEHaval唯有在Queue中从未任何音讯的时候才会被管理,WM_PAINT音讯还有或者会被统一以升高成效。别的具备音讯以先进先出(FIFO卡塔 尔(阿拉伯语:قطر‎的艺术被拍卖。

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

非新闻队列方式,直接调用窗口进度,系统及时切换成收到线程奉行,发送线程锁住,知道接受线程管理完成

SendMessageTimeout

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

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, LOWOTucsonD(wParam)表示菜单项,工具栏开关或控件的ID。假使是控件,
HIWO揽胜D(wParam)表示控件音讯类型
3> 控件公告(Notify Message) 
控件通告音讯, 那是最灵敏的音信格式, 其Message, wParam,
lParam分别为:WM_NOTIFY,
控件ID,指向NMHD奥迪Q7的指针。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

当三个窗口标准垂直滚动条发生叁个轮转事件时发送此新闻给那些窗口也,发送给具备它的控件
WM_INITMENU = 278

该函数将得到和hWnd可能其子窗口相关的音讯。

DWORD GetMessagePos(void);

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

9 BroadcastSystemMessage 
咱俩日常所接触到的音信都是发送给窗口的,其实,
讯息的收信人能够是五光十色的,它能够是应用程序(applications),
可安装驱动(installable drivers),互连网设施(network drivers),
系统级设备驱动(system-level device drivers)等, 
布罗兹castSystemMessage那几个API能够对以上系统组件发送新闻。

hwnd: HWND / /窗口句柄

音讯相关函数:

DispatchMessage

LONG DispatchMessage(
const MSG* lpmsg
);
1.该函数将音讯,通过系统派发给窗口进程
2.若是是二个电火花计时器新闻,lParam参数不是空,

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

1. 窗口进程 
各个窗口会有叁个誉为窗口进程的回调函数(WndProc),它包涵八个参数,分别为:窗口句柄(Window
Handle),消息ID(Message ID),和八个音讯参数(wParam,
lParam),当窗口收到新闻时系统就能调用此窗口进程来拍卖音信。(所以叫回调函数卡塔尔国

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

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

InSendMessage

图片 1

4 队列新闻(Queued Messages)和非队列信息(Non-Queued Messages)
1)队列新闻(Queued Messages)
 
消息会先保存在消息队列中,新闻循环会自此队列中取新闻并散发到各窗口管理
如鼠标,键盘新闻。
2) 非队列音讯(NonQueued Messages) 新闻会绕过系统消息队列和线程消息队列直接发送到窗口进度被拍卖
如: WM_ACTIVATE, WM_SETFOCUS, WM_SETCURSOR, WM_WINDOWPOSCHANGED 
瞩目: postMessage发送的音信是队列新闻,它会把消息Post到音信队列中;
SendMessage发送的音讯是非队列音讯, 被直接送到窗口进程管理

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

收获线程近些日子二遍希图管理多个新闻的系统时间(GetTickCount卡塔尔

GetMessageSource
MSGSRC_SOFTWARE_POST表面键盘音讯来源于software(postmessage标志为software卡塔 尔(阿拉伯语:قطر‎.
MSGSRC_HARDWARE_KEYBOATiggoD 表面新闻来源keyboard. MSGSRC_UNKNOWN

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

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来制止现身死锁。

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

该函数通过调用窗口进度的点子发送消息,假诺窗口归于分裂线程,SendMessage提姆erout将明了新闻处理实现才回来或许钦定的晚点已经身故,倘诺窗口就在现阶段线程,则平昔调用窗口进程,并忽视time-out超时

SendNotifyMessage
若是窗口创制于归属发送音讯的线程,则调用窗口进程,并听候窗口进度管理完结该音信。假如是例外线程,则将音讯传递到窗口进度,并立即重临,不等待窗口进度的消息管理过程。


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

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

1> 解压iqy_test.zip

5 PostMessage(PostThreadMessage), SendMessage 
PostMessage:把音信放到钦定窗口所在的线程音讯队列中后即时回到。
PostThreadMessage:把音信放到内定线程的音信队列中后立即重临。
SendMessage:间接把音讯送到窗口进程管理,管理完了才回来。

WM_COMPAREITEM = 57

音信来源未知

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

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

WM_IME_ENDCOMPOSITION= 270

该函数只是轻易申明被呼吁终止的线程将会终止。接纳WM_QUIT的线程,应该甘休音信循环,并将调节权交给系统。再次回到给系统的脱离值,一定是WM_QUIT的wParam参数

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

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


RegisterWindowMessage
同一字符串,注册的值,在全部连串中是当世无双的


SendMessage

NtUserMessageCall(HWND_BROADCAST, WM_DDE_INITIATE)

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

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

4.假若应用程序正在创制顶层窗口时调用PeekMessage,将形成窗口窗口被创造在Z-Order的最终。你要求在PeekMessage后,显式调用SetForegroundWindow。假诺应用程序以至有七个内置窗口了,那么新窗口将被放置。

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

 

WM_MENUCOMMAND =294

用于剖断当前窗口进程所拍卖的音讯,是还是不是来自此外线程的SendMessage调用。

PeekMessage
1.该函数核实线程消息队列中是不是有消息,并将音讯放在参数结构体中
2.要是hWnd参数=-1,则只回去hWnd=NULL的消息,这种音信来自PostThreadMessage
3.参数wRemoveMsg要求注意

翻开参数知excel调用NtUserMessageCall()相仿如下:

当顾客双击鼠标右键同有时候光标有些窗口在非客商区十发送此消息

lParam指向三个函数地址,被调用的将是以此函数,而非窗口进程

GetMessage
应用程序使用该函数重临值来支配是不是终止新闻循环,并脱离程序。

5.1 在API Monitor中看下PostMessageW

E N _ U P D AT E编辑框中的文本将在更新

至于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_USERubicon)-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奥迪Q5音信。那几个信息文告窗口它曾经被激活了,键盘输入正指向该窗口,鼠标光标已经移至了窗口边框内。当应用程序调用某个系统函数时,也会窗口非队列新闻,比方,应用程序在调用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.各样线程默许是从未新闻队列的,线程独有在第一回调用客商接口时(比方创立窗口卡塔 尔(英语:State of Qatar),系统才为其创造音信队列。
3.种类本身保险二个类别音信队列,然后还为各样GUI线程线程维护二个线程专门新闻队列。
4.鼠标、键盘等驱动,首先将事件转换为音讯放置在系统消息队列中,然后系统又经过窗口来显然将其放入到哪些线程信息队列中。
5.线程消息循环抽出音信,进行拍卖,将音信再派发给系统,系统调用新闻对应的窗口进程。
6.PostMessage不一定成功,比方队列是满的。
7.防止新闻死锁,比方收受音讯的窗口进程,在弃权前,要求检查实验音讯是还是不是发自此外线程。否则别的线程将长日子等待。其实自个儿倍感这里不可能成为死锁嘛,终归依旧大概再施行的,只是时长而已。
8.内需静心wm_paint,wm_timer,wm_quit等特种消息
9.系统预订义新闻其实大都以这一个控件音信,公告音讯,系统广播音信等等。

图片 2

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

该函数再次来到音讯x,y坐标,在多种monitor下,也是有负值。

GetMessageQueueReadyTimeStamp

当在console中调用API
ShellExecuteEx张开”test.iqy”文件时,发掘excel会hang住,console退出后excel才会响应,但向来双击”test.iqy”是从未难题的,有趣的是以此意况独有在xp发生,在win7上并未有那些主题素材。

C B N _ K I L L F OC U S组合框失去输入主题

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

WM_SETREDRAW = 11

call stack展现实乃ShellExecuteEx所调用

  由于Windows本人是由消息使得的,举贰个例子来申明那几个难点。打开记事本程序,该程序有三个File菜单,那么,在运行该应用程序的时候,假若客商单击了File菜单里New命令时,那些动作将被Windows
(实际不是应用程序自个儿!卡塔 尔(阿拉伯语:قطر‎所捕获,Windows经过解析得悉这一个动作应该由地点所说的老大应用程序去管理,既然是如此,Windows就发送了个名字为WM_COMMAND的音讯给应用程序,该新闻所包括音信报告应用程序:”客商单击了New菜单”,应用程序获悉那意气风发音信随后,接收相应的动作来响应它,那个历程称为消息管理。Windows为每三个应用程序(确切地正是每叁个线程)维护了相应的新闻队列,应用程序的天职就是不停的从它的新闻队列中赢得音讯,深入分析音讯和处理消息,直到一条摄取名字为WM_QUIT消息停止,那一个进程日常是由豆蔻梢头种叫做音讯循环的程序结构来落到实处的。

可以预知是ShellExecuteEx内部创造的线程,所以win7上ShellExecuteEx创设了叁个线程特地用来处理和excel的DDE信息通讯,那样就能够正常的收纳管理excel发过来的WM_DDE_INITIATE消息了

此消息发送给将要收到宗旨的窗口,此音信能使窗口在吸收接纳核心时同有时间有机缘完毕他的逻辑调色板

图片 3

WM_CANCELJOURNAL =75

 

C B N _ E D I T C HA N G E客商修改了编辑框中的文本

 

通过运用给定的连锁展现设备的句柄来设置列表框的文书和背景颜色

2. 重现步骤

C B N _ D B L C L K客商双击了一个字符串

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

编辑框控件
 EN_CHANGE 编辑框中的文本己更新
 EN_E本田CR-VPAJEROSPACE 编辑框内部存款和储蓄器不足
 EN_HSCROLL 客户点击了水平滚动条
 EN_KILLFOCUS 编辑框正在失去输入核心
 EN_MAXTEXT 插入的内容被截断
 EN_SETFOCUS 编辑框获得输入大旨
 EN_UPDATE 编辑框中的文本将在更新
 EN_VSCROLL 客户点击了垂直滚动条音信含义

3.3 总结

WM_IME_KEYUP = 657

留意到下多个API GetWindowThreadProcessId ( 0x00310172 , 0x0012fb70
),恰巧是赢得这些窗口的pid和tid,查看下参数窗口:

程序发送此音讯给MDI客商窗口以层叠方式重新排列全部MDI子窗口

3.1 excel hang在哪里?

的边框体

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

次第在呈现前校正菜单

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

WM_MOUSEHOVER = 673

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

  Windows是生龙活虎音信(Message卡塔尔国驱动式系统,Windows音讯提供了应用程序与应用程序之间、应用程序与Windows系统之间进行广播发表的招式。应用程序要完成的功用由音讯来触发,并靠对音信的响应和管理来形成。Windows系统中有二种消息队列,风姿浪漫种是系统音信队列,另生机勃勃种是应用程序信息队列。计算机的保有输入设备由
Windows监察和控制,当五个风浪时有爆发时,Windows先将输入的音讯归入系统新闻队列中,然后再将输入的音讯拷贝到相应的应用程序队列中,应用程序中的音信循环从它的新闻队列中搜求每二个音信并发送给相应的窗口函数中。二个风浪的发生,到达管理它的窗口函数必须经历上述进度。值得注意的是消息的非超越性,即无论是事件的急与缓,总是按达到的顺序排队(一些系统消息除了那么些之外),那就使得一些外界实时事件恐怕得不到顿时的拍卖。

图片 4

E N _ E 奥德赛 奥迪Q7 S PA CE编辑框内存不足

 

图片 5void MsgCracker(HWND hWnd,int id,HWND hWndCtl,UINT codeNotify)
图片 6{
图片 7      switch(id)
图片 8      {
图片 9     case ID_A:
图片 10                  if(codeNotify==EN_CHANGE)图片 11
图片 12                  break;
图片 13     case ID_B:
图片 14                  if(codeNotify==BN_CLICKED)图片 15
图片 16                  break;
图片 17             图片 18.
图片 19       }
图片 20}
图片 21

表达excel给持有顶层窗口发送叁个WM_DDE_INITIATE新闻,可是有窗口没有response

程序发送此音信给MDI顾客窗口来找到激活的子窗口的句柄

其意气风发窗口所属的进度PID =
0xc54,恰好是excel的经过,表明ShellExecuteEx确实发送了DDE音讯给excel,并且可执发送的音讯的thread正是主线程

WM_UPDATEUISTATE =296

图片 22

WM_CTLCOLORLISTBOX= 308

图片 23

//双击鼠标中键

适逢其时便是张开test.iqy的一声令下,表明ShellExecuteEx正是先创制了excel的进程,然后发送test.iqy的公文命令给excel展开。

应用程序发送此新闻取妥善前控件绘制文本的字体

shell_execute.exe的主要code:

WM_USERCHANGED = 84

图片 24

知父窗口。公告音信只适用于专门的学业的窗口控件如按键、列表框、组合框、编辑框,以至Windows
95公

图片 25

WM_SETTEXT = 12

基于DDE的新闻参数,可以知道wParam就是发送新闻的窗口,其句柄为2425190 =
0x250166,反向查询知这是ShellExecuteEx制造的”WorkerW”窗口

WM_MBUTTONDOWN =519

WM_COMMAND = 273

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

WM_DEVICECHANGE =537

当系统将要步向暂停状态时发送此音信

图片 26

前后相继发送此音信给有些窗口当它(窗口卡塔尔国的框架必得被绘制时;

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

 

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

WM_KEYLAST = 264

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

在windows绘制音讯框前发送此消息给音讯框的主人窗口,通过响应那条新闻,全体者窗口能够

图片 27

WM_MOUSELEAVE = 675

5>
excel收到WM_DDE_EXECUTE消息后会广播WM_DDE_INITIATE音讯,”WorkerW”窗口所在的console进程由于并未概念新闻管理函数,ShellExecuteEx定义的”WorkerW”窗口新闻管理函数得不到CPU实施机遇,导致不会response该消息,进而变成excel
hang住

此新闻发送给应用程序来打招呼它有关电源处理事件;

 

前后相继发送此音讯给MDI客商窗口用MDI菜单代替子窗口的菜谱

翻开一下buff的地点:

WM_HANDHELDFIRST =856

 

  表A-3  通告音信-开关

周围,我们能够创设二个带窗口的次第,运行后将其挂起,此时,纵然直接双击展开test.iqy也会hang住。

WM_DROPFILES = 563

复出情况:XP sp3 / Office 2005(别的office版本应该也能够,未有测验卡塔 尔(英语:State of Qatar)

WM_CTLCOLORDLG =310

3.2 为了验证3.1.1的预计,用API Monitor一下ShellExecuteEx

当四个滚动条控件将在被绘制时发送此消息给它的父窗口;通过响应那条音讯,全部者窗口能够

 

WM_WINDOWPOSCHANGING= 70

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

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

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

WM_MENUDRAG = 291

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

WM_COPY = 769

3. 原因深入分析

WM_DESTROY = 2

WM_MDIDESTROY = 545

此信息发送给窗口当它将在改换大小或地方;

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

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

当客商按住ALT键同不常间按下其余键时提交此信息给持有大旨的窗口;

WM_MDIICONARRANGE =552

WM_MDICREATE = 544

WM_QUEUESYNC = 35

WM_GETOBJECT = 61

当鼠标轮子转动时发送此音讯个当前有关键的控件

WM_SETFOCUS = 7

 

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

WM_TIME奥德赛 = 275 //爆发了电火花计时器事件

WM_PALETTEISCHANGING=784

赢得核心后

WM_COMPACTING = 65

E N _ K I L L F O CU S编辑框正在失去输入主题

出殡此消息给有个别与对话框程序关联的控件,widdows调整方位键和TAB键使输入进去此控件

WM_CLOSE = 16

通过剪贴板观望窗口发送此新闻给剪贴板的持有者来号召三个CF_OWNE奥迪Q5DISPLAY格式的剪贴板的名字

当有些控件的某部事件已经发出或其豆蔻梢头控件供给获得部分新闻时,发送此音讯给它的父窗口

浮现剪贴板的新内容;

叁个DDE客商程序提交此消息给贰个DDE服务程序来发送贰个字符串给服务器让它象串行命令相同被管理,服务器通过付出WM_DDE_ACK新闻来作回应;

图片 30
   
非队列新闻将会绕过系统队列和新闻队列,间接将音讯发送到窗口进度,。系统一发布送非队列新闻文告窗口,系统发送音讯文告窗口。例如,当客商激活三个窗口系统一发布送WM_ACTIVATE,
WM_SETFOCUS, and
WM_SETCUPRADOSOR。这几个消息文告窗口它被激活了。非队列音信也足以由当应用程序调用系统函数发生。举例,当程序调用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个具备代表性的函数,大家能够见到音信的出殡和安葬方式和寄送格局的界别所在:被发送的新闻是不是会被马上处理,函数是或不是及时回去。被发送的新闻会被立刻管理,管理完结后函数才会回到;被寄送的音信不会被当即管理,他被安放三个先进先出的队列中,一贯等到应用程序空线的时候才会被拍卖,可是函数放置新闻后即时赶回。
图片 31
  实际上,发送新闻到叁个窗口处理进度和直接调用窗口处理进程之间并从未太大的界别,他们直接的唯大器晚成差距就在于你能够须求操作系统截获全部被发送的新闻,但是不能够收获对窗口管理进度的第一手调用。
  以寄送措施发送的音讯经常是与顾客输入事件相对应的,因为那么些事件不是可怜急迫,能够进行缓慢的缓冲管理,比如鼠标、键盘音讯会被寄送,而开关等音信则会被发送。
  广播新闻用得超少,布罗兹castSystemMessage函数原型如下:
      long 布罗兹castSystemMessage(DWO奇骏D dwFlags,LPDWO奥迪Q5D
lpdwRecipients,UINT uiMessage,WPARAM wParam,LPARAM
lParam);该函数能够向内定的收信人发送一条音信,这么些选用者能够是应用程序、可设置的驱动程序、互联网驱动程序、系统等级的装置驱动音讯和她们的猖狂组合。必要介意的是,假如dwFlags参数是BSF_QUEXC90Y并且最少多个选用者重返了BROADCAST_QUERY_DENY,则再次回到值为0,如果未有一点点名BSF_QUE凯雷德Y,则函数将音讯发送给全体选拔者,而且忽视其再次来到值。

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

Windows音讯大全

WM_UNDO = 772

此消息发送给最小化窗口,当此窗口将在被拖放而它的类中尚无定义图标,应用程序能

二个DDE顾客程序提交此音信给八个DDE服务程序,客商接纳此新闻来倡议服务器收到叁个未经允许的数额项;服务器通过答复WM_DDE_ACK音信提醒是或不是它采取这几个数额项;

WM_NCMOUSEMOVE =160

WM_QUERYOPEN = 19

WM_VKEYTOITEM = 46

WM_DDE_LAST =WM_DDE_FIRST + 8

C B N _ S E L C H AN G E在组合框中选取了风流洒脱项

WM_COALESCE_FIRST =912

WM_GETDLGCODE = 135

WM_ERASEBKGND = 20

WM_SIZECLIPBOARD =779

也能够修正他们

//按下鼠标左键

WM_HANDHELDLAST =863

前后相继发送此新闻给三个编辑框或combobox来复制当前选用的文书到剪贴板

当顾客已经登陆或抽离后发送此音讯给持有的窗口,当顾客登陆或退出时系统改良客户的现实性

当客户自由鼠标右键同不常候光标又在窗口的非客户区时发送此音信

WM_POWERBROADCAST =536

WM_CUT = 768

WM_USER = 1024

WM_PAINTICON = 38

WM_IME_COMPOSITIONFULL= 644

此音信由一个LBS_WANTKEYBOA福睿斯DINPUT风格的列表框发送给她的持有者来响应WM_CHAR消息

C B N _ E D I T U PD AT E编辑框内的文书就要履新

WM_SYSCOLORCHANGE =21

WM_MOUSEMOVE = 512

当绘制文本时前后相继发送此消息得到控件要用的水彩

WM_HSCROLLCLIPBOARD= 782

当客商正在调节窗口大小时发(英文名:zhōng fā卡塔尔送此消息给窗口;通过此信息应用程序可以监视窗口大小和职位

WM_MDISETMENU = 560

WM_IME_COMPOSITION= 271

WM_SYSKEYDOWN = 260

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

WM_DDE_EXECUTE =WM_DDE_FIRST + 8

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

WM_SYSDEADCHAR =263

当系统经过产生WM_QUESportageYENDSESSION音讯后,此音信发送给应用程序,

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

列表框控件
 LBN_DBLCLK 客商双击了生龙活虎项
 LBN_E牧马人TiggoSPACE 列表框内部存款和储蓄器缺乏
 LBN_KILLFOCUS 列表框正在失去输入大旨
 LBN_SELCANCEL 选取被撤废
 LBN_SELCHANGE 接受了另风流倜傥项
 LBN_SETFOCUS 列表框获得输入主旨

  音讯小编是当作叁个记录传递给应用程序的,那些记录中包涵了新闻的门类以致此外新闻。举例,对于单击鼠标所发出的新闻的话,那些记录中含有了单击鼠标时的坐标。那几个记录类型叫做T
M s g,它在Wi n d o w s单元中是那样评释的:

You can leave a response, or trackback from your own site.

Leave a Reply

网站地图xml地图