Windows程序内部运行原理

本文大部分内容都是摘自孙鑫老师,在下就是一个简单的总结,归纳,希望对大家有用!!!!

Windows操作系统是一种完全不同于传统的dos方式的程序设计方法,是事件驱动的方式(主要是基于消息的,当用户需要完成某种功能时,会调用操作系统的某种支持,然后操作系统将用户的某种需要,包装成消息,并投递到消息队列中去,最后应用程序从消息队列中取走消息,并进行响应。)

Windows应用程序,操作系统,计算机硬件之间的相互关系。
这里写图片描述
1,表示操作系统能操作输出设备,以执行特定的功能:让声卡发出声音,让显卡显示图像
2,表示操作系统能够感知输入设备状态的变化:鼠标移动,键盘按下,并且能够清楚的明白当前移动到了那个位置,键盘按下的是什么字符

(这就是操作系统和计算机硬件之间的交互关系)
应用程序的开发者通常不需要知道具体的实现细节,我们所关心的仅仅是应用程序和操作系统之间的交互

3,表示应用程序可以通知操作系统执行某个具体的动作,操作系统能够控制声卡发出声音,但它并不知道应该何时发出什么样的声音,需要应用程序告诉操作系统该发出什么声音

那么,应用程序是如何通知操作系统执行某个功能的呢???
有过编程经验的读者都应该知道,在应用程序中要完成某个功能,都是以函数调用的形式实现的,同样,应用程序也是以函数调用的方式来通知操作系统执行相应的功能的。操作系统所能够完成的每一个特殊功能通常都有一个函数与其对应,也就是说,操作系统把它所能够完成的功能以函数的形式提供给应用程序使用,应用程序对这些函数的调用就叫做系统调用,,,这些函数的集合就是Windows操作系统提供给应用程序编程的接口(Application Programming Interface),简称为Windows API。
如:CreateWindow就是一个API函数,应用程序中调用这个函数。操作系统就会按照该函数提供的参数信息产生一个相应的窗口。。

4,表示操作系统能够将输入设备的变化上传给应用程序。如:用户在某个程序活动中按下了一个按键,操作系统马上能够感知到这一事件,并且能够知道用户按下的是哪一个键,操作系统并不决定对这一事件如何做出反应,而是将这一事件转交给应用程序,由应用程序决定如何对这一事件做出反应。
蚊子叮了我们一口,我们的神经末梢(操作系统)马上感知到这一事件,并传递给了我们的大脑(应用程序),我们的大脑最终决定如何对这一事件做出反应。将蚊子赶走,或是拍死蚊子。
对事件做出反应的过程就是消息响应。。。。。

操作系统是如何将感知到的事件传递给应用程序的呢???
这是通过消息机制(Message)来实现的。操作系统将每个事件都包装成一个称为消息的结构体MSG来传递给应用进程,
MSG结构定义如下:

typedef struct tagMSG
{
        HWND hwnd;
        UINT    message;
        WPARAM wParam;
        LPARAM lParam;
        DWORD time;
        POINT pt;
}MSG;

句柄(HANDLE),资源的标示(和指针类似)
操作系统要管理和操作这些资源,都是通过句柄来找到对应的资源。按资源的类型,又可将句柄细分为图标句柄(HICON),光标句柄(HCURSOR),窗口句柄(HWND),应用程序实例句柄(HINSTANCE)等到各种类型的句柄。操作系统给每一个窗口指定的一个唯一的标识号即窗口句柄

其实:WPARAM,LPARAM本质上就是int类型,之所以会出现,只是为了更加直观的明白这些参数的意义

WORD:是一个16位的整数
DWORD:是一个32位的整数,表示了这个消息被投递于消息队列中的时间
POINT:是一个点的结构体(当消息被投递时,光标在屏幕上的位置)

int WINAPI WinMain(
    HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR     lpCmdLine,
    int       nCmdShow
);

//HINSTANCE:当同样的应用程序打开多次的时候,产生多个窗口
//hPrevInstance:标示上一次打开的窗口
//(for a win32-based application,this parameter is always NULL)
//LP:long point(长指针)
//LPSTR:是一个指向字符串首地址的指针
//lpCmdLine:是一个命令行的参数(dos中接收两个参数:argc是参数的个数,argv是一个指针数组,用来存放命令行的参数),
//同样的,windows中也可以接收命令行的参数

//nCmdShow:窗口显示的状态。(最大化,最小化,隐藏显示)

WinMain:是一个入口点函数,其实是由操作系统来调用的,不是由我们去调用的。
当操作系统启动我们的程序的时候,会给我们运行中的程序分配一个实例号,通过这个参数就传递进来了,如果我们传递了一个参数的话,那么操作系统就会将这个参数放在相应的参数中(lpCmdLine)
上面的这些参数,都是由操作系统来赋值呢,,,,

窗口的创建:

创建一个完整的窗口需要经过下面四个操作步骤:
1,设计一个窗口类
2,注册窗口类
3,创建窗口
4,显示及更新窗口

设计一个窗口类???

因为一个窗口具有很多特征,光标(形状(十字,箭头)),图标,背景
也就是说:windows已经为我们定义了一个窗口所需要的因素,我们只需要向里面填写相应的值即可

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值