浅谈windows消息驱动的基本原理(.NET平台)

最近的课设涉及到调用系统API函数和窗体消息的发送,重载接收等。因此发表一篇浅文,希望能和大家共同探讨,学习。

首先,windows是一个基于视窗的消息驱动系统。这句话非常的有意思。重点是"视窗"和"消息驱动"这两个词,这两个词包含了windows界面的处理原理。下面解释下什么是消息驱动。所谓"消息",即"事件"。接触过C#.NET的朋友都知道,你拖一个控件,双击,添加代码,这一段即可称为"事件"。严肃点来讲,所谓"事件",即是指人们使用计算机的过程中发生的操作,如按下键盘上的某个按键、移动鼠标、单击鼠标左键、移动窗口及选择程序菜单等等等等。

那么,什么是消息驱动呢?消息驱动,也叫做事件驱动。通俗点来讲,你对窗体做一个操作,windows做出相应的响应,实现相应的功能。这就叫消息驱动。严肃点说,每当发生一个事件,即我们对程序做出一个操作,程序就会产生一个与之对应的特定消息,该消息会被Windows捕获,然后将通过此消息调用执行与之对应的程序代码,实现功能。windows对于每一个产生的消息都会建立一些"消息队列"。在操控窗口时产生的消息就放在消息队列里。每个应用程序对应有一个消息循环,该循环不断重复查看自身消息队列,如果有消息,就用GetMessage()函数从消息队列中提取出,并执行相应的消息处理代码。如果队列中没有消息就等待,当队列中有消息时就又处理它,如此循环往复,直至程序结束或遇到WIN_QUIT;

下面看这么一张图:

当运行程序->事件操作引发消息->消息先存在系统消息队列->再存入到应用程序消息队列->用消息循环提取消息->处理消息->再返回消息队列....

以上解释如果看不懂没关系。咱下面继续慢慢解释。

首先,先抛开消息驱动这个原题。我们先引入一个叫"动态链接库"的概念。什么是动态链接库?刚接触过C#的朋友可能有听过,但又没怎么了解过。不急,咱慢慢来。动态链接库,这个名字也挺有意思。分为三个部分,动态,链接和库。首先它是一个库,什么库?暂且通俗地理解为一个仓库。放着一大堆函数的仓库。然后它是动态的,什么是动态的?动态就是一开始时程序是没有的,等运行到了,需要了,就去那个库里寻找调用。那为什么是动态的?因为假如弄为静态的,程序将会动不动带上一大堆代码,用倒是不一定用得上,但是程序空间会变大,效率等都会受到影响。不知道看这篇文章的朋友写过C/C++的程序没有,C/C++中有个#include<xxx.h>的头文件对吧,没错,这就是"动态连结"。那在C#中如何用上动态链接库呢,没错,就是[DllImprot("xxx.dll")]类。C#中,用此类声明一个实例,声明用到的.DLL文件。就可以调用API函数啦(API函数封装在.DLL文件里)。但是有几个要求,就是调用的API函数名必须与原来系统的API函数名一致,参数也得一致,并且必须声明为extern ...;Sample:

1 int xxx1 = 0x520;
2 int xxx2 = 0x521; //用户自定义消息。
1 [DllImport("User32.dll",EntryPoint="SendMessage")]//EntryPoint 表示要调用的函数入口点是dll文件里的SendMessage()函数。
2 private static extern int SendMessage(
3    IntPtr hwnd,  //声明一个窗口句柄,所谓句柄,就是C#里的"指针",窗口的一个引用,但此"指针"不可用于其他特殊操作。                                                             //IntPtr是平台特定的int类型。就是在32跟64位系统上分别为32位和64位。一般用于声明一个句柄。
4    int Msg,    //表明要发送的消息。
5    int wParam,  //32位的附加信息。
6    int IPrarm  //32位的附加信息。(随消息的改变而改变)
7 );

SendMessage()函数的作用就是对一个或多个窗体发送消息,相应的还有一个窗体接收信息的函数。他俩是天生一对,编写程序时要对接收函数重载声明。

1 protected override void DefWndProc(ref Message m)//重载接收处理函数
2 {
3  switch (m.Msg)
4  {
5    case xxx1: label1.Text = "在吗"; break;
6    case xxx2: label1.Text = "没空"; break; //XXX1 /XXX2 用户自定义的消息。
7    default: base.DefWndProc(ref m); break;
8  }
9 }

DefWndProc()函数的作用就是让窗体接收相应的"消息",并做出处理,功能实现。

以上说了这么多无非是,发给一个窗体消息,然后让窗体接收这个消息再处理这个消息。那么这跟我们的原目的有什么挂钩呢?

windows应用程序实际上具有相同的程序结构和执行控制流程。比如一个API调用程序的建立、执行流程如下:

程序入口点(DOS下是main() ,windows下是_tWinMain())->注册窗口类(RegisterClass)->创建窗口(CreateWindow())->显示窗口(ShowWindow(hwnd,nCmdShow)->(UpdateWindow(hwnd))->消息循环(等待用户操作窗口产生消息)->放入消息队列->消息循环往复读取并执行相应代码->窗口函数(决定在窗口那里显示些什么,或者如何响应用户输入(如上面的SendMessage()函数))->消息处理(用来确定窗口函数接收的是什么消息以及如何处理(如上面的DefWndProc()函数)。

笔者文笔不佳,知识也并不扎实,写出来只是让大家指教指教,还望能严厉批评, 增进彼此。

题外话:为什么学.NET还要学习消息驱动原理这些比较接近底层的东西?按照我们老师讲的,你就是在学校毕业前有两万行代码,连这个都不知道,就算你再有几万行,你始终也编不出怎么多好,多有用的程序来。

时间: 2024-10-06 02:15:11

浅谈windows消息驱动的基本原理(.NET平台)的相关文章

浅谈windows消息机制

首先来了解几个基本概念: 消息:在了解什么是消息先来了解什么是事件.事件可分为几种,由输入设备触发的,比如鼠标键盘等等.由窗体控件触发的,比如button控件,file菜单等.还有就是来自Windows内部的事件.这三种称为事件.而消息,是由事件翻译而来的.事件产生消息. 从数据结构角度来讲,消息是一种结构体.结构如下: 1 typedef struct tagMSG 2 3 { 4 5 HWND hwnd; //窗口句柄. 6 7 UINT message;//消息类型. 8 9 WPARAM

浅谈Windows平台下C++调用静态链接库的方式

浅谈Windows平台下C++调用静态链接库的方式 1. 什么是静态链接库?为什么要用静态链接库? 维基百科上关于静态库的解释是这样的:在计算机科学里,静态库(英语:Static library, Statically-linked library),或称静态库,是一个外部函数与变量的集合体.静态库的文件内容,通常包含一堆程序员自定的变量与函数,其内容不像动态链接库那么复杂,在编译期间由编译器与连接器将它集成至应用程序内,并制作成目标文件以及可以独立运作的可执行文件. 由上面的解释可以很清楚的看

浅谈Windows Server APPFABRIC

    hi,everyone !真的是好久好久没有update blog了,因为最近忙着备考,没有时间对<数据结构与算法>进行研究学习了.所以,blog一直未更新.today is Friday,心里比较轻松,(哈哈,上班族懂我的感受),有时间写篇技术文章了.正好,最近研究了一些新技术,这篇文章权当对技术的梳理归纳吧.子曰:"温故而知新,可以为师也."对于knowledge,我们一定要时常复习.thought.归纳.practice.只有这样,我们才能真正的掌握它.Ein

搞懂分布式技术21:浅谈分布式消息技术 Kafka

搞懂分布式技术21:浅谈分布式消息技术 Kafka 浅谈分布式消息技术 Kafka 本文主要介绍了这几部分内容: 1基本介绍和架构概览 2kafka事务传输的特点 3kafka的消息存储格式:topic和parition 4副本(replication)策略:主从broker部署和partition备份,以及选主机制 5kafka消息分组,通过comsumergroup实现主体订阅 6push和pull的区别,顺序写入和消息读取,零拷贝机制 Kafka的基本介绍 Kafka是最初由Linkedi

浅谈Windows API编程

WinSDK是编程中的传统难点,个人写的WinAPI程序也不少了,其实之所以难就难在每个调用的API都包含着Windows这个操作系统的潜规则或者是windows内部的运行机制…… WinSDK是编程中的传统难点,曾经听有一个技术不是很好的朋友乱说什么给你API谁都会用,其实并非那么简单,个人写的WinAPI程序也不少了,其实之所以难就难在每个调用的API都包含着Windows这个操作系统的潜规则或者是windows内部的运行机制. 首先来谈谈句柄,初学习WinSDK的朋友刚看到这个词头大了吧?

浅谈分布式消息技术 Kafka

http://www.linkedkeeper.com/1016.html Kafka的基本介绍 Kafka是最初由Linkedin公司开发,是一个分布式.分区的.多副本的.多订阅者,基于zookeeper协调的分布式日志系统(也可以当做MQ系统),常见可以用于web/nginx日志.访问日志,消息服务等等,Linkedin于2010年贡献给了Apache基金会并成为顶级开源项目. 主要应用场景是:日志收集系统和消息系统. Kafka主要设计目标如下: 以时间复杂度为O(1)的方式提供消息持久化

浅谈分布式消息技术 Kafka(转)

一只神秘的程序猿. Kafka的基本介绍 Kafka是最初由Linkedin公司开发,是一个分布式.分区的.多副本的.多订阅者,基于zookeeper协调的分布式日志系统(也可以当做MQ系统),常见可以用于web/nginx日志.访问日志,消息服务等等,Linkedin于2010年贡献给了Apache基金会并成为顶级开源项目. 主要应用场景是:日志收集系统和消息系统. Kafka主要设计目标如下: 以时间复杂度为O(1)的方式提供消息持久化能力,即使对TB级以上数据也能保证常数时间的访问性能.

浅谈Windows Azure 存储服务

我们现在正处于一个数据爆炸的年代,大数据.开放数据炒的如火如荼,表明数据给我们带来了不可估量的价值. 对于企业来说,保存.管理和维护数据已经成为一项重要的挑战.大量存储设备的采购.部署.数据规模的不断增长,对于需要为其数据使用可伸缩的.持久的且具有高可用性的存储的应用程序,云计算使其有了新的方案可供选择,这正是 Microsoft 开发 Azure 存储服务的原因. Azure存储服务包括Blob存储.表存储.队列存储和文件存储.这些服务都包含在每个存储账户中. 那么存储账户是一个唯一的命名空间

浅谈Windows入侵检查

1 准备工作 检查人员应该可以物理接触可疑的系统.因为黑客可能侦测到你可以在检查系统,例如网络监听,所以物理接触会比远程控制更好. 为了当做法庭证据可能需要将硬盘做实体备份.如果需要,断开所有与可疑机器的网络连接. 做入侵检查时,检查人员需要一台PC对检查的过程进行检查项目的结果记录. 请维护可疑服务器人员或者PC使用人员来配合,来确定机器上运行的服务和安装的软件,便于安全检查人员提交检查的效率和准确性. 2 基本检查点 检测不正常账户 查找被新增的账号,特别是管理员群组的(Administra