Windows API 程序的组织结构

简介:
前言:
  现在Windows程序可以说是盛极一时了,有很多人也在从事着Windows编程。那么,Windows程序的结构到底是什么样的呢?很多初学者对此都很迷惑。今天笔者就Windows 程序的动态组织结构进行一次探讨,希望对部分初学者有所帮助!

正文:
  在介绍Windows 程序的基本构架之前我们必需先了什么是消息。
在Windows 多任务环境下同时会有许多程序交织着进行这样复杂的工作是如何管理的呢? Windows 凭借的就是“消息传送(MessagePassing)”这个法宝!在Windows 下所有外部输入如按键、鼠标、按钮、移动计时等动作都是由系统先拦截转换成消息(Message)之后再传给各个程序,
Windows 拦截输入的目的之一是为了将不同外设输入的数据转换成一致的格式以方便程序处理这个一致的格式就是消息(Message)。

消息是一个结构它的组成如下:
typedef struct tagMSG{
HWND hWnd;    所欲送达的窗口代码(handle)
UINTmessage;    消息为-Unsign 整数(int)
WPARAMwParam; 相关参数后文说明

LPARAMtParam; 相关参数后文说明
DWORDtime 时间
POINTpt 鼠标光标位置
}MSG;

  我们可以看到消息结构包含了按键鼠标时间等不同输入设备的数据,其中很重要的是第一项hWnd,这是消息所欲送到的窗口的句柄(handle)。也就是说“消息传送的最终目的地是窗口而不是程序” 这一点很重要请各位记住。

  传送消息时如果程序正在忙碌来不及接收源源而来的消息那消息将会漏失掉,所以Wi ndows 的做法是先把消息放入消息队列(Message Queue)内等有空闲时再由程序主动从队列中读取消息。每个程序运行之初Windows 就会为它创建一个存放消息的队列称为应用程序消息队列(Application message queue)。当外部输入发生时输入设备的驱动程序会将输入转换成消息的格式收集到一个系统的队列(System queue),然后再由Windows 来分派到各应用的程序。
因为消息不会直接送给程序必须由程序主动从队列中读取,所以WinMain()中通常会以一个循环来读取信息:
while (GetMessage( msg NULL 0,0))读取消息的循环
{


}
  此循环用GetMessage()函数往该程序的message queue 读取消息并存入msg 结构变量,然后再由循环内部来处理消息。
GetMessage():多任务的基础
当GetMessage()从消息队列读消息时,则表示目前没有工作给该程序做。此时GetMessage()会自动将程序的控制权交给Windows,以便Windows 将控制权转移给下一个程序,这正是Wind ows 多任务的基础。所以Windows 程序中一定要用GetMessage()来取消息多任务才能进行。

  当我们操作窗口时(如按钮) 窗口必须对该操作有所反应。在Windows 下每个窗口背后都有一个窗口函数负责窗口对操作(输入)的反应也就是负责窗口的行为。因为窗口的“输入—反应”动作是通过消息来传送的所以窗口函数的工作就是按所收到的消息种类来决定反应的动作,因此窗口函数有时也称为“消息处理函数”,因为窗口函数对消息反应之不同每个窗口才有不同的行为。

典型的窗口函数的格式为:
Switch (message){case MSGI: 依据消息的种类
(procedure for MSGI);处理MSGI 消息的程序做不同的行为
break;
case MSG2:
(procedure for MSG2);
处理MSG2 消息的程序
break;



default:不想处理的消息就交给系统处理!
return(DefWindowPro((hwnd message

wParam lParam));
}
return (NULL);
  Windows 会将各类消息输入它们所应属于的窗口函数。例如您在某个窗口按下鼠标或选择某个菜单命令,系统当然要指明是在哪一个窗口进行的,还记得消息结构中的hWnd 吗?在msg.h Wnd 中就标示着消息所应送达的窗口代码,窗口函数在收到消息后就以switch-case 的方式来拾取它所关心的消息并加以处理,至于不是该窗口所要处理的消息则在default 处交给一个叫DefWindowProc() 的函数处理。Def:WndowProc() 是一个标准窗口处理函数(Default Window
Procedure) ,它会以Windows 的方式来处理消息例如窗口的放大缩小移动等标准的处理动作。
  这种处理方式也有人称为“事件驱动方式”(event-driven)即事件(消息)才会引发动作,程序并不会主动做任何事,事件驱动的观念在Windows 编程中十分重要,等你学会Windows程序的基本结构之后方能体会它的基本精神!

Windows 程序的流程
  WinMain()是Windows 程序的起始函数,通常它会做窗口注册,创建窗口,显示窗口的动作然后进入消息循环,此循环会不断地往消息队列中读取消息,一旦取得消息立刻用Dispatch Massage()通过系统来调用消息处理函数,如此一直循环直到GetMassage()找不到消息让出控制权才暂告休息。
WndProc()是处理消息的函数或称窗口,函数WndProc()统一由Windows 来调用,为一回调型的函数。WndProc()按消息来做出响应,是控制窗口行为的过程。

Windows 的程序流程如下:

外部输入动作发生被转换成消息
放入消息queue
由Get Message()读消息
Dispatch 消息给Windows
由Windows 回调(CALL BACK)消息处理函数(窗口函数)
读一下消息若无消息则将控制权交回Windows 由Windows
将控制权交给下一程序

(全文完)如有不当之处,诚请指出!

更多编程技术文章,请访问我的网站http://www.vczx.com





   本文转自loose_went博客园博客,原文链接:http://www.cnblogs.com/michaelxu/archive/2006/09/20/509045.html,如需转载请自行联系原作者



相关文章
|
2月前
|
安全 Ubuntu iOS开发
Nessus Professional 10.10 Auto Installer for Windows - Nessus 自动化安装程序
Nessus Professional 10.10 Auto Installer for Windows - Nessus 自动化安装程序
137 3
Nessus Professional 10.10 Auto Installer for Windows - Nessus 自动化安装程序
|
2月前
|
Ubuntu API C++
C++标准库、Windows API及Ubuntu API的综合应用
总之,C++标准库、Windows API和Ubuntu API的综合应用是一项挑战性较大的任务,需要开发者具备跨平台编程的深入知识和丰富经验。通过合理的架构设计和有效的工具选择,可以在不同的操作系统平台上高效地开发和部署应用程序。
108 11
|
4月前
|
Ubuntu Linux Windows
如何在Ubuntu系统中安装Wine,借此来运行Windows程序
熟悉的登录画面出现,在Ubuntu系统中扫描登录微信程序。
|
4月前
|
Unix Linux 编译器
解决在Windows平台上运行Golang程序时出现的syscall.SIGUSR1未定义错误。
通过这种结构,你的代码既可以在支持 SIGUSR1 信号的系统上正常工作,又可以在不支持这些信号的 Windows 系统上编译通过,确保跨平台的兼容性和功能的完整性。
177 0
|
5月前
|
Windows
Windows下版本控制器(SVN)-验证是否安装成功+配置版本库+启动服务器端程序
Windows下版本控制器(SVN)-验证是否安装成功+配置版本库+启动服务器端程序
143 2
|
6月前
|
Windows
Windows下版本控制器(SVN)-启动服务器端程序
Windows下版本控制器(SVN)-启动服务器端程序
196 4
|
7月前
|
安全 Devops 测试技术
AppSpider 7.5.018 for Windows - Web 应用程序安全测试
AppSpider 7.5.018 for Windows - Web 应用程序安全测试
146 0
AppSpider 7.5.018 for Windows - Web 应用程序安全测试
|
6月前
|
JSON 监控 API
深度剖析:淘宝商品详情API返回值结构及高效使用方法
本文详解了淘宝商品详情API(taobao.item.get)的使用方法与返回值解析,涵盖接口基础认知、返回值结构及核心字段说明。通过四步调用流程(注册-认证-请求-解析),开发者可高效获取商品信息,包括基础数据、库存销量、SKU详情、促销活动等。文章还提供了Python实战代码示例,助您实现商品展示、价格监控、智能选品等场景应用。最后提醒注意权限认证、调用频率限制及错误处理,助力电商业务创新。
|
9月前
|
前端开发 Cloud Native Java
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
|
9月前
|
Windows
Windows程序的数字签名证书怎么申请
Windows程序的数字签名证书申请流程包括:准备企业资料(营业执照、税务登记证等),提交申请表及企业资料。经过初审、实名认证和二审后,等待1-5个工作日审核结果。审核通过后,CA机构颁发证书并通过邮件或邮寄方式发送。收到证书后按指南安装并使用签名工具对程序进行数字签名,确保软件完整性和可信度。注意证书有效期、管理和兼容性问题。

热门文章

最新文章