分享
 
 
 

拨动Windows的神经--Win32 API 消息(上)

王朝system·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

亲爱的朋友们,请牢记今天这个日子:今天是七·七事变的纪念日。当你在看这篇blog的时候,请在心中先深深地哀悼和缅怀一下我们的抗日英烈们。正是他们,用自己的生命换来了我们今天宁静、和平的生活。他们在放弃生命的一瞬间,想的就是我们这些后代能过上幸福的生活。没有他们,就没有我坐在这里写,你坐在那里看这篇blog……

为中华崛起而发奋学习,为中国强盛而认真写程序!

今天写点什么呢?从最基本的理论开始理顺一下吧。

无数的书籍都在反复强调,要想学好Win32,就要先理解Windows的消息传递过程。其实,了解Windows的消息传递过程何止是学习Win32的基础,可以毫不夸张地说:这是学习所有Windows编程的基础!(当然,如果你只是想写一两个小程序玩玩那就另当别论了。)

Windows是消息驱动的。这句话怎么解释?我的理解是这样:如果把计算机比做你的家产,Windows就是你的“大管家”,他管理着你计算机里的各种“资源”——CPU的运算资源、内存里的各种程序、硬盘里文件和剩余空间。这个大管家非常认真,绝对是“令行禁止”,换句话说就是,你命令他干什么,他立刻就去干,如果没有命令他做什么,他就老老实实地等着你给他下命令。一般情况下,你下的命令他都会立刻执行完毕,然后等着你的下一个命令(所以大部分时间他是在休息,不信你看看CPU资源,基本上都是在0上晃悠,或者你打开任务管理器,System Idle Process占到了90%以上),但也有时候他会忙不过来,积压在一起的命令形成一个长长的“命令队列”,这个时候他就要一条一条地执行接收到的命令——先收到的命令先执行,后收到的后执行。当然了,命令也是分轻重缓急的吗,偶而也要有那么一两条命令必需立刻执行,这样的命令就要“卡个”到这个命令队列的最前端优先执行了。

让我们回到Windows操作系统,其实,上面所说的“命令”就是“消息”!因为Windows是在各种“消息”的“驱赶”下才“劳动”的,所以,我们说:Windows是消息驱动的:)

如果你学过VB或者.NET下的WinForm开发,那么对“程序是事件驱动的”这句话就不应该感到陌生,其实,“程序是事件驱动”与“Windows由命令驱动”这两句话在本质上是一样的。为什么这么说呢?

举个简单例子吧,比如你写了一个程序,在一个窗体上有一个按钮和一个文本框,你要达到的效果是点击按钮后文本框里显示“Hello Win32 API”。对于VB/.NET的事件驱动,给我们的感觉是这样的:我点了一下按钮,引发了“按钮的Click事件”(注意:不是按钮发生了Click事件,因为按钮不会自己动),按钮的Click事件上挂了一个事件处理器(Event Handler,我不喜欢译成“事件处理句柄”,句柄这个词儿总让我想起“话把儿”这个词儿,再说了,也词不达意),事件处理器的另一端又挂了一个用来响应这一事件的函数/过程,这个函数/过程里写着“textBox1.Text="Hello Win32 API”这样一句。挺简单,事儿就办完了,因为程序是在事件发生的基础上去给予响应的,所以我们说“程序是事件驱动”的。

但用Win32 API的眼光来看待这次执行可用远远没这么简单了。

首先我们必须明确一点:什么是程序?硬盘里有一个可执行文件(注意,是一个文件),你双击它的图标要运行它,Windows就把它“弄”进内存里(具体是怎么弄进去的,应该是看《操作系统》),这叫做“加载”(Load)。加载进内存之后,Windows找到这个程序的“入口点”,也就是从哪里开始执行这个程序,学过C语言的朋友都知道是那个main()函数,在Win32 API中是一个叫WinMain()的函数,Windows时代了吗:)。当然,你不要指望Windows会认识“WinMain()”这串字符,因为作为可执行的二进制机器码,WinMain()函数早已经化身成只有CPU才能读懂的指令了。那么,作为入口点的WinMain()函数起什么作用呢?简单地讲(“不简单地讲”我也不会,水平不到耶)它起到一个“纲”的作用,Windows只要抓住这个纲,怎么就控制了整个程序。一旦Windows调用WinMain()函数,把这个程序执行起来,那么这个程序就以一个“进程”(Process)的形式存在在内存里了。

OK,扯太远了,之所以扯这么远不为别的,就是让大家意识到,一个程序打一开始运行就是被Windows牢牢控制着的。也就是说,一个进程在内存里的从生到死,都是在Windows的管理之下。这说明什么?只能说明一个问题:什么是程序?程序就是以进程形式存在的一块内存。既然是一块内存,用户想与一个程序(内存)直接打交道能行吗?门儿都没有。用户与程序之间,还隔着一个Windows系统,用户想操纵程序,只能通过Windows来完成。现在我们可以剖析刚才那个简单的程序了。

当你点击按钮的时候,实际上这个动作被精确地描述为“用户在屏幕的某一点上按下了老鼠的左牙”这样一个消息,Windows收到这个消息的时候,并不知道这个消息是送给谁的,于是它立刻查看在这个“点”下有没有对应什么东西,结果它发现这个点下面对应着一个窗体;然后Windows会缩小自己的搜索范围,看看这个点下还有没有其它什么东西,结果它发现这个点下还对应着一个按钮,因为这个按钮是压在窗体之上的(z order,z轴高度,想想金字塔从底座开始一直到塔尖是怎么摞着的),所以,用户的意思是把这个消息发送给这个按钮。Windows“领会精神”后,把这个消息发送给了某某程序的某某窗体的一个按钮。按钮收到消息之后好开心哦!赶紧打开消息的信封,一看,哦~~~~原来是有人用鼠标的左键敲俺滴脑袋!Coder是怎么写的程序来着?……“当有人用鼠标左键敲你的脑袋的时候,你就告诉textBox1,让它显示Hello Win32 API……”于是,按钮立刻执行任务,告诉textBox1显示出了Hello Win32 API。

如果你不小心在按钮上点了右键,对应VB/C#,我们可以说我们引发了按钮的右击事件,只是这个事件上没有挂着事件处理器,所以按钮什么也不做,对应Win32 API,仍然会有一个消息被Windows分发到按钮那里,不过按钮会发现没人告诉它如果被右键敲了脑袋应该做什么,所以它就把这个消息扔了……

现在明白了吧,“程序由事件驱动”只是对“Windows由消息驱动”在较高层次上的一种封装、一种概念上的简化,是把用户产生的消息要从底层Windows绕行路由到程序窗口这样一个事实隐藏掉了,给VB/C#程序员的感觉是在用事件来驱动程序。

就上面这个程序而言,你用VB/C#写的和用Win32 API写的,在用户看来绝对是一模一样的,但作为开发它的程序员,脑子里想的东西可是大想径庭的。想一想,VB/BCB/Delphi/VC#等等为什么被称为“快速开发工具”,还不是因为隐藏了这些消息传递的“内幕”,能让程序员把精力集中在程序的逻辑上吗?

好啦!从现在开始,忘掉“事件”这个概念吧,因为我们要学习的是Win32 API。聪明的程序员用事件驱动程序,真正的程序员用消息来操纵一切……

今天就写到这里,to be continue :P (拍砖开始!)

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有