理解Windows消息机制

2016-02-19 12:20 7 1 收藏

关注图老师设计创意栏目可以让大家能更好的了解电脑,知道有关于电脑的更多有趣教程,今天给大家分享理解Windows消息机制教程,希望对大家能有一点小小的帮助。

【 tulaoshi.com - 编程语言 】

Windows系统是一个消息驱动的OS,什么是消息呢?下面从不同的几个方面讲解一下。

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

1、消息的组成:一个消息由一个消息名称(UINT),和两个参数(WPARAM,LPARAM)。当用户进行了输入或是窗口的状态发生改变时系统都会发送消息到某一个窗口。例如当菜单转中之后会有WM_COMMAND消息发送,WPARAM的高字中(HIWORD(wParam))是命令的ID号,对菜单来讲就是菜单ID。当然用户也可以定义自己的消息名称,也可以利用自定义消息来发送通知和传送数据。

2、谁将收到消息:一个消息必须由一个窗口接收。在窗口的过程(WNDPROC)中可以对消息进行分析,对自己感兴趣的消息进行处理。例如你希望对菜单选择进行处理那么你可以定义对WM_COMMAND进行处理的代码,如果希望在窗口中进行图形输出就必须对WM_PAINT进行处理。

3、未处理的消息到那里去了:M$为窗口编写了默认的窗口过程,这个窗口过程将负责处理那些你不处理消息。正因为有了这个默认窗口过程我们才可以利用Windows的窗口进行开发而不必过多关注窗口各种消息的处理。例如窗口在被拖动时会有很多消息发送,而我们都可以不予理睬让系统自己去处理。

4、窗口句柄:说到消息就不能不说窗口句柄,系统通过窗口句柄来在整个系统中唯一标识一个窗口,发送一个消息时必须指定一个窗口句柄表明该消息由那个窗口接收。而每个窗口都会有自己的窗口过程,所以用户的输入就会被正确的处理。例如有两个窗口共用一个窗口过程代码,你在窗口一上按下鼠标时消息就会通过窗口一的句柄被发送到窗口一而不是窗口二。

5、示例:下面有一段伪代码演示如何在窗口过程中处理消息

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

LONG yourWndProc(HWND hWnd,UINT uMessageType,WPARAM wP,LPARAM)

{

         switch(uMessageType)

         {//使用SWITCH语句将各种消息分开

                 case(WM_PAINT):

                          doYourWindow(...);//在窗口需要重新绘制时进行输出

                 break;

                 case(WM_LBUTTONDOWN):

                          doYourWork(...);//在鼠标左键被按下时进行处理

                 break;

                 default:

                          callDefaultWndProc(...);//对于其它情况就让系统自己处理

                 break;

         }

}

接下来谈谈什么是消息机制:系统将会维护一个或多个消息队列,所有产生的消息都回被放入或是插入队列中。系统会在队列中取出每一条消息,根据消息的接收句柄而将该消息发送给拥有该窗口的程序的消息循环。每一个运行的程序都有自己的消息循环,在循环中得到属于自己的消息并根据接收窗口的句柄调用相应的窗口过程。而在没有消息时消息循环就将控制权交给系统所以Windows可以同时进行多个任务。下面的伪代码演示了消息循环的用法:

while(1)

{

来源:http://www.tulaoshi.com/n/20160219/1600652.html

延伸阅读
1.消息推送机制 服务器器端需要变被动为主动,通知客户一些开发商认为重要的信息,无论应用程序是否正在运行或者关闭。 我想到了一句话:don't call me,i will call you! qq今天在右下角弹出了一个对话框:"奥巴马宣布本拉登挂了...",正是如此。 自作聪明,就会带点小聪明,有人喜欢就有人讨厌。 2.独立进程 无论程序是否正在运行,我...
第一部分:得到Winamp的窗口 Winamp是一个32位的Windows应用程序。也就是说,我们可以使用32位的Windows编程的一些基础技术来实现控制Winamp,即使用Windows的消息系统。在你给Winamp发送消息之前,你必须得到Winamp窗口的句柄。这里有个方法,使用外部应用程序(例如你自己编写的VB应用)就可以达到要求。 Public Declare Functi...
这篇文章写的非常好,深入浅出,关键还是一位大三学生自己剖析的心得。这是我喜欢此文的原因。下面请看正文: 作为一个大三的预备程序员,我学习android的一大乐趣是可以通过源码学习google大牛们的设计思想。android源码中包含了大量的设 计模式,除此以外,android sdk还精心为我们设计了各种helper类,对于和我一样渴望水平得到进阶的人来...
标签: 电脑入门
尽管微软最新款操作系统Windows 7尚未正式上市销售,但其激活机制已被破解。报道称,用户可以利用联想OEM版Windows 7系统的SLP(system-locked pre-installation)序列号及OEM验证,来实现对Windows 7激活机制进行破解。但在此之前,用户需要修改机器BIOS,以便使操作系统认定该机器为OEM产品。微软此前宣布,Windows7 RTM已完成开发,并将交付给...
标签: windows 操作系统
  系统的启动分三个步骤。第一个步骤从接通电源开始,系统BIOS对硬件设备进行例行的加电自检,即所谓的POST(Power On Self Test)检查,包括RAM检查、软硬驱和CD-ROM驱动器检测等。接着,BIOS读取活动分区主引导记录MBR(Master Boot Record)的启动装载器。最后,当启动装载器初始化完成之后,操作系统启动过程正式开始。启动操作...