Window工作机制
这篇文章将介绍Windows的工作机制。
原理介绍
Windows 是一个“基于事件的,消息驱动的”操作系统。
每个 Windows 应用程序都是基于事件和消息的,而且包含一个主事件循环,它不停地、反复地检测是否有用户事件发生。每次检测到一个用户事件,程序就对该事件做出响应,处理完再等待下一个事件的发生。
Windows 下的应用程序不断地重复这一过程,直至用户终止程序,用代码来描述实际上也就是一个消息处理过程的 while 循环语句。
基本概念
窗口
从用户的角度看,窗口就是显示在屏幕上的一个矩形区域,其外观独立于应用程序,事实上它就是生成该窗口的应用程序与用户间的直观接口;从应用程序的角度看,窗口是受其控制的一部分矩形屏幕区。应用程序生成并控制与窗口有关的一切内容,包括窗口的大小、风格、位置以及窗口内显示的内容等。用户打开一个应用程序后,程序将创建一个窗口,并在那里默默地等待用户的要求。每当用户选择窗口中的选项,程序即对此做出响应。
程序
通常说的程序都是指一个能让计算机识别的文件,如 exe 等。
进程
进程是程序动态的描述,而上面说到的程序是静态的描述,两者有本质的区别。
线程
线程是进程中的一个执行单元,同一个进程中的各个线程对应于一组 CPU 指令、一组 CPU 寄存器以及一堆栈。进程本来就具有动态的含义,然而实质上是通过线程来执行体现的,从这个意义上说,Windows 中进程的动态性意义已经不是很明显了,只算是给程序所占的资源划定一个范围而已,真正具有动态性意义的是线程。
消息
我们几乎做每一个动作都会产生一个消息,鼠标被移动会产生 WM_MOUSEMOVE 消息,鼠标左键被按下会产生 WM_LBUTTONDOWN 的消息,鼠标右键按下便产生 WM_RBUTTONDOWN 消息等等。所有的这些都可以通过 GetMessage,SendMessage 等函数得到。
事件
如在程序运行的过程中改变窗口的大小或者移动窗口等,都会触发相应的“事件”。
句柄
句柄是系统用来标识不同对象类型的工具,如窗口、菜单等,这些东西在系统中被视为不同类型的对象,用不同的句柄将他们区分开来。
在 Win32 里,句柄是指向一个无值型对象 (void*) 的指针,是一个4字节长的数据。
API与SDK
API 是英文 Application Programming Interface 的简称,意为“应用程序接口”,泛指系统为应用程序提供的一系列接口函数。其实质是程序内的一套函数调用,在编程的时候可以直接调用,而不必知道其内部实现的过程,只知道它的原型和返回值就可以了。
SDK 是英文 Software Development Kit 的缩写,指“软件开发工具包”,在防火墙的设计中就经常涉及到 SDK。