WWindows程序内部运行机制

Windows程序内部运行机制

ü      关键概念

1、句柄

句柄是整个Windows编程的基础。一个句柄是指使用的一个唯一的整数值,即一个4字节(64位程序中为8字节)长的数值,来标识应用程序中的不同对象和同类中的不同的实例,诸如,一个窗口,按钮,图标,滚动条,输出设备,控件或者文件等。

2、消息与消息队列

windows程序设计是种事件驱动方式的程序设计,主要基于消息的。例如,当用户在窗口中华图时,按下鼠标左键,此时os会感知到这一事件,于是将此事件包装成一个消息,投递到应用程序的消息队列中,最后应用程序从消息队列中取走消息并进行响应。

3、Winmain函数

WinMain函数是Windows程序入口点函数,由OS调用,当OS启动应用程序的时候,winmain函数的参数由OS传递的。

4、创建窗口的步骤

1)设计一个窗口类。如:WNDCLASS wndcls。

2)注册窗口类。如:RegisterClass(&wndcls)。

3)创建窗口。如:CreateWindow(),CreateWindowEX();

4)显示及更新窗口。如:ShowWindow(),UpdateWindow();

ü      代码

1、消息

struct tagMSG {     // msg

HWND   hwnd;     //接收消息的窗口句柄。和哪个窗口相关联。

UINT   message;  //消息标识。消息本身是什么。

WPARAM wParam;   //消息的附加信息。具体取决于消息本身。

LPARAM lParam;

DWORD  time;     //消息投递时间。

POINT  pt;       //消息投递时,光标在屏幕上的位置。

} MSG;

2、Winmain函数

int WINAPI WinMain(

HINSTANCE hInstance,  // 当前事例句柄。

HINSTANCE hPrevInstance,  // 先前事例句柄。32位系统中此值都为NULL

LPSTR lpCmdLine,      // 命令行指针

int nCmdShow          // (窗口)显示的状态

);

要带参调用WinMain,类似于命令行的功能,在ProjectèsettingèDebug页èProgram arguments项填写参数

3、窗口类

typedef struct _WNDCLASS {

UINT    style;        //窗口的类型

WNDPROC lpfnWndProc;  //窗口过程函数指针(回调函数)

int     cbClsExtra; //窗口类附加字节,为该类窗口所共享。通常0。

int     cbWndExtra; //窗口附加字节。通常设为0。

HANDLE  hInstance;  //当前应用程序事例句柄。

HICON   hIcon;      //图标句柄 LoadIcon();

HCURSOR hCursor;    //光标句柄 LoadCursor();

HBRUSH  hbrBackground; //画刷句柄 (HBRUSH)GetStockObject();

LPCTSTR lpszMenuName;  //菜单名字

LPCTSTR lpszClassName; //类的名字

} WNDCLASS;

注:

  • 回调函数

在特定时间或条件下由另外一方调用,用于对事件或条件进行响应,而不是由该函数的实现方调用。

eg:

LRESULT CALLBACK WindowProc(  //这里WindowProc是个代号名字。

HWND hwnd,      // handle to window

UINT uMsg,      // message identifier

WPARAM wParam,  // first message parameter

LPARAM lParam   // second message parameter

);

  • 两种函数调用约定(__stdcall 和 _cdecl)

#define CALLBACK    __stdcall

#define WINAPIV     __cdecl

__cdecl 是C Declaration的缩写(declaration,声明),表示C语言默认的函数调用方法:所有参数从右到左依次入栈,由调用者负责把参数压入栈, 最后也是由调用者负责清除栈的内容,一般来说,这是 C/C++ 的默认调用函数的规则,MS VC 编译器采用的规则则是这种规则2. __stdcall
_stdcall 是StandardCall的缩写,是C++的标准调用方式:所有参数从右到左依次入栈,由调用者负责把参数压入栈,最后由被调用者负责清除栈的内容,Windows API 所采用的函数调用规则则是这种规则

另外,采用 __cdecl 和 __stdcall 不同规则的函数所生成的修饰名也各为不同,相同点则是生成的函数修饰名前缀都带有下划线,不同的则是后缀部分,当然,这两者最大的不同点就在于恢复栈的方式不同,而且这点亦是最为重要的。

4、注册窗口类

ATOM
RegisterClass(CONST
WNDCLASS *lpWndClass);

5取出消息和消息循环

  • GetMessage函数声明

BOOL GetMessage(

LPMSG lpMsg,  //指向一个消息结构体(MSG),取出的消息

HWND  hWnd,  
//指定接收了哪个窗口的消息。通常设置为null,用于接收所有窗口的消息。

UINT wMsgFilterMin,  //获取消息的最小值,一般为0

UINT wMsgFilterMax   //获取消息的最大值

);

  • 消息循环

MSG msg;

while(GetMessage(&msg,...))    //从消息队列中取出一条消息

{

TranslateMessage(&msg); //进行消息转换

DispatchMessage(&msg); //分派消息到窗口的回调函数处理,(OS调用窗口回调函数进行处理)。

6、创建、更新和显示窗口

 

ü     
总结:Windows消息处理机制

时间: 2024-10-12 02:20:49

WWindows程序内部运行机制的相关文章

MFC第一节-windows程序内部运行机制

一.窗口 设计窗口类时: 1 typedef struct _WNDCLASS{ 2 UINT style; //如水平.垂直变化是否重绘,禁用Close,检测双击 3 WNDPROC lpfnWndProc;//窗口过程函数句柄 4 int cbClsExtra;//类附加内存 5 int cbWndExtra;//窗口附加内存 6 HANDLE hInstance;//实例句柄 7 HANDLE hIcon;//图标 8 HCURSOR hCursor;//光标 9 HBRUSH hbrBa

再理解Windows程序内部运行机制

参照孙鑫<VC++深入详解> 创建Win32程序的步骤: 1. 编写WinMain函数 2. 设计窗口类(WNDCLASS) 3. 注册窗口类 4. 创建窗口 5. 显示并更新窗口(ShowWindow(hwnd,SW_SHOWNORMAL);UpdateWindow(hwnd);) 6. 消息循环(不断地从消息队列中取出消息,并进行响应) 7. 窗口过程函数(处理发送给窗口的消息) 测试代码如下(在VS2010编译通过): #include <stdafx.h> #include

Windows程序内部运行机制

Windows程序内部运行机制 一.        API与SDK Windows操作系统提供了各种各样的函数,以方便我们开发Windows应用程序,这些函数是Windows操作系统提供给应用程序编程的接口(Application Programming Interface),简称为API函数.我们在编写Windows程序时所说的API函数,就是指系统提供的函数,所有主要的Windows函数都在Windows.h头文件中进行了说明. SDK的全称是Software Development Kit

【vc】1_Windows程序内部运行机制

创建一个Win32应用程序步骤: 1.编写WinMain函数; 2.创建窗口(步骤如下): a.设计(一个)窗口类(WNDCLASS) b.注册(该)窗口类. c.创建窗口. d.显示并更新窗口. 3.编写消息循环. 4.编写窗口过程函数. 1 //WinMain.cpp 2 #include <windows.h> 3 #include <stdio.h> 4 5 LRESULT CALLBACK WinAzeProc( 6 HWND hwnd, // handle to win

第一章 Windows程序内部运行机制(4)WinMain函数

WinMain函数相当于main函数,作为Windows程序的入口函数.当WinMain结束或返回时,Windows程序结束. 一个win32应用程序,该程序创建一个窗口并在窗口中响应键盘与鼠标消息,程序的实现步骤为: 1.WinMain函数的定义:2.创建一个窗口:3.进行消息循环:4.编写窗口过程 WinMain函数的定义: int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, in

Windows程序内部运行机制 转自http://www.cnblogs.com/zhili/p/WinMain.html

一.引言 要想熟练掌握Windows应用程序的开发,首先需要理解Windows平台下程序运行的内部机制,然而在.NET平台下,创建一个Windows桌面程序,只需要简单地选择Windows窗体应用程序就可以了,微软帮我们做了非常好的封装,以至于对于很多.NET开发人员至今也不清楚Windows 平台下程序运行的内部机制,所以本专题将深入剖析下Windows 程序的内部运行机制. 二.Windows平台下几个基础概念 有朋友会问,理解了程序运行的内部机制有什么用,因为在我们实际开发中用得微软提供的

第一章 Windows程序内部运行机制(2)窗口和句柄

窗口是Windows应用程序中非常重要的元素.一个Windows应用程序至少有一个主窗口.窗口是Windows应用程序和用户进行交互的接口. 窗口通常包含标题栏.菜单栏.系统菜单.最小化框.最大化框.可调边框和滚动条. 窗口分为客户区和非客户区.应用程序通常在客户区中显示文字或绘制图形.标题栏.菜单栏.系统菜单.最小最大化框.可调边框统称为非客户区.非客户区主要由Windows系统来管理.应用程序主要管理客户区和外观及操作. 桌面也是一个窗口,称为桌面窗口,由windows系统创建和管理. 窗口

第一章 Windows程序内部运行机制(1)API和SDK

Windows操作系统提供了各种各样的函数,以方便我们开发Windows应用程序.这些函数是Windows操作系统提供给应用程序编程的接口(Application Programming Interface)简称为API函数. MSDN可以说是为微软开发人员提供的一套帮助系统,其中包含大量的开发文档.技术文章和示例代码,学会用MSDN来进行学习,对初学者来说很重要. 什么是SDK? SDK的全称是SoftwareDevelopment Kit,中文译为软件开发包.假如我们要开发呼叫中心,在购买语

第一章 Windows程序内部运行机制(3)消息与消息队列

在Windows中,用户程序可以调用系统的API函数,系统也会调用用户程序,这个调用时通过消息来进行的. Windows程序设计是一种事件驱动方式的程序设计模式,主要基于消息. [例]当用户在窗口中画图的时候,按下鼠标左键,操作系统就会感知到这一事件,于是将这个事件包装成一个消息,投递到应用程序的消息队列中,然后应用程序从消息队列中取出消息进行响应.在处理过程中,操作系统会给应用程序“发送消息”.“发送消息”实际上是指操作系统调用程序中一个专门负责处理消息的函数,这个函数称为窗口过程. 1.消息