windows消息机制
- 博客分类:
- 技术杂绘
windows消息机制
2011年04月21日
一 Windows中有一个系统消息队列,对于每一个正在执行的Windows应用程序,系统为其建立一个“消息队列”,即应用程序队列,用来存放该程序可能创建的各种窗口的消息。应用程序中含有一段称作“消息循环”的代码,用来从消息队列中检索这些消息并把它们分发到相应的窗口函数中。
二 Windows为当前执行的每个Windows程序维护一个「消息队列」。在发生输入事件之后,Windows将事件转换为一个「消息」并将消息放入程序的消息队列中。程序通过执行一块称之为「消息循环」的程序代码从消息队列中取出消息:
while(GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
msg变量是型态为MSG的结构,型态MSG在WINUSER.H中定义如下:
typedef struct tagMSG
{
HWND hwnd ;
UINT message ;
WPARAM wParam ;
LPARAM lParam ;
DWORD time ;
POINT pt ;
}
MSG, * PMSG ;
POINT数据型态也是一个结构,它在WINDEF.H中定义如下:
typedef struct tagPOINT
{
LONG x ;
LONG y ;
}
POINT, * PPOINT;
TranslateMessage(&msg); 将msg结构传给Windows,进行一些键盘转换。(关于这一点,我们将在第六章中深入讨论。)
DispatchMessage(&msg);又将msg结构回传给Windows。然后,Windows将该消息发送给适当的窗口消息处理程序,让它进行处理。这也就是说,Windows将呼叫窗口消息处理程序。在HELLOWIN中,这个窗口消息处理程序就是WndProc函数。处理完消息之后,WndProc传回到Windows。此时,Windows还停留在DispatchMessage呼叫中。在结束DispatchMessage呼叫的处理之后,Windows回到HELLOWIN程序中,并且接着从下一个GetMessage呼叫开始消息循环。
三 队列化消息与非队列化消息
消息能够被分为「队列化的」和「非队列化的」。队列化的消息是由Windows放入程序消息队列中的。在程序的消息循环中,重新传回并分配给窗口消息处理程序。非队列化的消息在Windows呼叫窗口时直接送给窗口消息处理程序。也就是说,队列化的消息被「发送」给消息队列,而非队列化的消息则「发送」给窗口消息处理程序。任何情况下,窗口消息处理程序都将获得窗口所有的消息--包括队列化的和非队列化的。窗口消息处理程序是窗口的「消息中心」。
队列化消息基本上是使用者输入的结果,以击键(如WM_KEYDOWN和WM_KEYUP消息)、击键产生的字符(WM_CHAR)、鼠标移动(WM_MOUSEMOVE)和鼠标按钮(WM_LBUTTONDOWN)的形式给出。队列化消息还包含时钟消息(WM_TIMER)、更新消息(WM_PAINT)和退出消息(WM_QUIT)。
非队列化消息则是其它消息。在许多情况下,非队列化消息来自呼叫特定的Windows函数。例如,当WinMain呼叫CreateWindow时,Windows将建立窗口并在处理中给窗口消息处理程序发送一个WM_CREATE消息。当WinMain呼叫ShowWindow时,Windows将给窗口消息处理程序发送WM_SIZE和WM_SHOWWINDOW消息。当WinMain呼叫UpdateWindow时,Windows将给窗口消息处理程序发送WM_PAINT消息。键盘或鼠标输入时发出的队列化消息信号,也能在非队列化消息中出现。例如,用键盘或鼠标选择了一个菜单项时,键盘或鼠标消息就是队列化的,而说明菜单项已选中的WM_COMMAND消息则可能就是非队列化的。
四 SendMessage()与PostMessage()之间的区别是什么?
它们两者是用于向应用程序发送消息的。PostMessagex()将消息直接加入到应用程序的消息队列中,不等程序返回就退出;而SendMessage()则刚好相反,应用程序处理完此消息后,它才返回。我想下图能够比较好的体现这两个函数的关系:
五 函数peekmessage和getmessage的区别?
两个函数主要有以下两个区别:
1.GetMessage将等到有合适的消息时才返回,而PeekMessage只是撇一下消息队列。
2.GetMessage会将消息从队列中删除,而PeekMessage可以设置最后一个参数wRemoveMsg来决定是否将消息保留在队列中。
发表评论
-
使用 CMake 进行跨平台软件开发
2012-01-20 09:42 1009使用 CMake 进行跨平台软 ... -
IronPython:交互式解释器与常用函数
2012-01-20 09:42 796IronPython:交互式解释器 ... -
Boost在VS2008下的正确编译
2012-01-20 09:42 1072Boost在VS2008下的正确编译 2010年11月28日 ... -
Win32平台下编译SVN源码全过程
2012-01-20 09:42 1176Win32平台下编译SVN源码 ... -
《Qt for Symbian》翻译系列之六:第一章 简介与写作初衷
2012-01-20 09:42 870《Qt for Symbian》翻译系列之六:第一章 简介与写 ... -
激励口号
2012-01-19 14:47 659激励口号 2011年02月16日 ... -
团队精神训练团队口号精神口号团队心声营销口号知道口碑营销
2012-01-19 14:47 1350团队精神训练团队口号 ... -
团队口号_激励口号_口号大全分享到:
2012-01-19 14:47 1179团队口号_激励口号_口 ... -
团队口号|营销团队励志口号大全
2012-01-19 14:46 2837团队口号|营销团队励志口号大全 2011年09月09日 ... -
销售口号
2012-01-19 14:46 844销售口号 2010年11月12日 团队精神训练团队口号精 ... -
VB中实现系统托盘图标实例
2012-01-17 04:31 617VB中实现系统托盘图标实例 2011年04月19日 新建 ... -
SubClassWindow,SubClassDlgItem
2012-01-17 04:31 667SubClassWindow,SubClassDlgItem ... -
使用Setwindowlong和Callwindowproc这两个Api函数[转的]
2012-01-17 04:31 1962使用Setwindowlong和Callwindo ... -
钩子程序解释说明都要注意小心钩子哦
2012-01-17 04:31 748钩子程序解释说明都要 ... -
(转载)温州人生意经
2012-01-16 03:21 539(转载)温州人生意经 2010年05月03日 温州人生意 ... -
温州人生意经
2012-01-16 03:21 581温州人生意经 2010年07月04日 “有市场的地方就有 ...
相关推荐
Windows消息机制,有助于学习windows 消息机制。
本PDF主要讲Windows系统的消息机制,讲如何通过windows系统提供的消息队列API,在WINDOWS上的应用内以及应用之间进行通信,欢迎下载
Windows消息机制要点,Windows消息机制要点,Windows消息机制要点
windows消息机制简单介绍,对消息过程的简单介绍和解释
Windows消息机制视频介绍,非常有助于学习消息机制的人。
Windows消息机制及HOOK应用,试用于初学者
描述的是Windows操作系统的消息机制,通过一些简单的Win32程序,来理解Windows消息。
NULL 博文链接:https://jacky-dai.iteye.com/blog/1074484
Windows进程之间是相互独立的,通过Windows消息机制,我们可以在进程之间进行通信,适合一台电脑的windows平台下进行消息交换,该例是两个winform之间通过windows消息发送和接收数据。 1、进程间通信 2、SendMessage...
WinSDK编程(续)_windows消息机制
windows消息机制及其应用
用Windows消息机制传数据 使用SendMessage配合WM_COPYDATA消息来传递数据
内含多道c++ 笔试题目以及答案 c++经典笔试宝典 C,C++经典问题,及面试笔试题 基本概念 Windows的消息机制
跨进程通信,利用句柄,可以用来理解windows消息机制,两个程序间通信,高效通信。功能是将程序1TextBox1.Text传递给程序2的label。程序2的TextBox1.Text传递给程序1的lable. 不在需要内存共享等。可以用来做看门狗...