Windows程序内部运行机制

一.Windows程序内部运行机制 一  Windows内部运行机制1.API与SDKapi是windows操作系统提供给应用程序编程的接口(Application Proramming Interface)简称api函数,windows有1000多种api函数。sdk全称是Software Development Kit,中文译为软件开发包。例如:购买语音卡的同时,厂商就会提供语音卡的sdk,这个sdk通常包含语音卡的 阅读详情

1,windows程序设计是种事件驱动方式的程序设计,主要基于消息的。当用户需要完成某种功能时,需要调用OS某种支持,然后OS将用户的需要包装成消息,并投入到消息队列中,最后应用程序从消息队列中取走消息并进行响应。
2,消息结构:
typedef struct tagMSG {     // msg
    HWND   hwnd;     //接收消息的窗口句柄。和哪个窗口相关联。
    UINT   message;  //消息标识。消息本身是什么。
    WPARAM wParam;   //消息的附加信息。具体取决于消息本身。  
    LPARAM lParam;
    DWORD  time;     //消息投递时间。 
    POINT  pt;       //消息投递时,光标在屏幕上的位置。 
} MSG;

3,消息队列:
每个应用程序OS都为它建立一个消息队列,消息队列是个先进先出的缓冲区,其中每个元素都是一个消息,OS将生成的每个消息按先后顺序放进消息队列中,应用程序总是取走当前消息队列中的第一条消息,应用程序取走消息后便知道用户的操作和程序的状态,然后对其处理即消息响应,消息响应通过编码实现。

4,使用VC编程除了良好的C基础外还需要掌握两方面:
一,消息本身。不同消息所代表的用户操作和应用程序的状态。
二,对于某个特定的消息来说,要让OS执行某个特定的功能去响应消息。

5,Window程序入口:
int WINAPI WinMain(
  HINSTANCE hInstance,  // 当前事例句柄。
  HINSTANCE hPrevInstance,  // 先前事例句柄。
  LPSTR lpCmdLine,      // 命令行指针
  int nCmdShow          // (窗口)显示的状态
);
说明:WinMain函数是Windows程序入口点函数,由OS调用,当OS启动应用程序的时候,winmain函数的参数由OS传递的。

6,创建一个完整的窗口需要经过下面四个操作步骤:
一,设计一个窗口类;如:WNDCLASS wndcls;
二,注册窗口类;    如:RegisterClass(&wndcls);
三,创建窗口;      如:CreateWindow(),CreateWindowEX();
四,显示及更新窗口。如:ShowWindow(),UpdateWindow();

说明:创建窗口的时候一定要基于已经注册的窗口类.

7,Windows提供的窗口类:
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;

8,窗口类注册:
ATOM RegisterClass(
  CONST WNDCLASS *lpWndClass   // address of structure with class
                               // data
);

9,创建窗口:
HWND CreateWindow(
  LPCTSTR lpClassName,  // pointer to registered class name
  LPCTSTR lpWindowName, // pointer to window name
  DWORD dwStyle,        // window style
  int x,                // horizontal position of window
  int y,                // vertical position of window
  int nWidth,           // window width
  int nHeight,          // window height
  HWND hWndParent,      // handle to parent or owner window
  HMENU hMenu,          // handle to menu or child-window identifier
  HANDLE hInstance,     // handle to application instance
  LPVOID lpParam        // pointer to window-creation data
);

10,显示和更新窗口窗口:
BOOL ShowWindow(
  HWND hWnd,     // handle to window
  int nCmdShow   // show state of window
);
BOOL UpdateWindow(
  HWND hWnd   // handle of window
);

11,消息循环:
MSG msg;
while(GetMessage(&msg,...))    //从消息队列中取出一条消息
{
 TranslateMessage(&msg); //进行消息(如键盘消息)转换
 DispatchMessage(&msg); //分派消息到窗口的回调函数处理,(OS调用窗口回调函数进行处理)。
}

其中:
//**The GetMessage function retrieves a message from the calling thread's message queue and places it in the specified structure.
//**If the function retrieves a message other than WM_QUIT, the return value is nonzero.If the function retrieves the WM_QUIT message, the return value is zero. If there is an error, the return value is -1.

BOOL GetMessage(
  LPMSG lpMsg,         // address of structure with message
  HWND hWnd,           // handle of window
  UINT wMsgFilterMin,  // first message
  UINT wMsgFilterMax   // last message
);


//The TranslateMessage function translates virtual-key messages into character messages. The character messages are posted to the calling thread's message queue, to be read the next time the thread calls the GetMessage or PeekMessage function.
BOOL TranslateMessage(
  CONST MSG *lpMsg   // address of structure with message
);

//The DispatchMessage function dispatches a message to a window procedure.
LONG DispatchMessage(
  CONST MSG *lpmsg   // pointer to structure with message
);


12,窗口过程函数(回调函数)原型:
The WindowProc function is an application-defined function that processes messages sent to a window. The WNDPROC type defines a pointer to this callback function. WindowProc is a placeholder(占位符) for the application-defined function name.

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
//__stdcall 标准调用预定,是PASCAL 调用约定,象DELPHI使用的就是标准调用约定
#define WINAPIV     __cdecl 
// __cdecl 是C 语言形式的调用约定。


主要区别:函数参数传递顺序 和 对堆栈的清除上。
问题:除了那些可变参数的函数调用外,其余的一般都是__stdcall约定。但 C/C++编译默然的是__cdecl约定。所以如果在VC等环境中调用__stdcall约定的函数,必须要在函数声明的时加上 __stdcall 修饰符,以便对这个函数的调用是使用__stdcall约定(如使用DELPHI编写的DLL时候)。
(VC中可通过这途径修改:project|settings..|c/c++|...)


在窗口过程函数中通过一组switch语句来对消息进行处理:
如:
LRESULT CALLBACK WindowProc( 
  HWND hwnd,
  UINT uMsg,
  WPARAM wParam,
  LPARAM lParam  
)
{
    switch(uMsg)
    {
 case WM_PAINT:
  ...
  break;
 case ...
  break;
 case WM_CLOSE:
  //DestroyWindow(hwnd);
   //销毁窗口,并发送WM_DESTROY消息。
  break;
 case WM_DESTROY:
  //PostQuitMessage(0);
  //发送WM_QUIT消息到消息队列中,请求终止。
         //GetMessage()取到WM_QUIT消息后,返回0,退出消息循                //   环,从而终止应用程序。
  break;
 default:
  return DefWindowProc(hwnd,uMsg,wParam,lParam);
 //用缺省的窗口过程处理我们不感兴趣的消息(其它消息)。
 //这是必须的。
    }//switch
 return 0;
}//WindowProc

13,DestroyWindow()函数和PostQuitMessage()函数原型:
//**The DestroyWindow function destroys the specified window. The function sends WM_DESTROY and WM_NCDESTROY messages。

BOOL DestroyWindow(
  HWND hWnd   // handle to window to destroy
);

//**The PostQuitMessage function indicates to the system that a thread has made a request to terminate (quit). It is typically used in response to a WM_DESTROY message.
//**The PostQuitMessage function posts a WM_QUIT message to the thread's message queue and returns immediately; the function simply indicates(预示,通知) to the system that the thread is requesting to quit at some time in the future.

When the thread retrieves the WM_QUIT message from its message queue, it should exit its message loop and return control to the system.

VOID PostQuitMessage(
  int nExitCode   // exit code
);

14,关于DC句柄获取:
a)使用BeginPaint(),EndPaint()对。注意只能在响应WM_PAINT消息时使用。
b)使用GetDc(),ReleaseDC()对。注意他们不能在响应WM_PAINT中使用。

 


 
[VC++深入详解] 1. Windows程序内部运行机制 本系列(VC++深入详解)为《VC++深入详解》(孙鑫 编著)读书笔记,很多例子都是仿照此书,很多概念也是来自此书,在对其做归纳总结的同时,也加入了自己的一些理解。 一、 最简单的Windows程序框架概览 #include #include LRESULT CALLBACK WndProc( _In_ HWND hwnd, _In_ UINT uMsg, _In 阅读详情

相关推荐

vc++消息和事件大全

vc++消息和事件大全 当不清楚时可以下下来查看。。。。。

程序的运行机制——CPU、内存、指令的那些事

序言 说起计算机大家并不陌生,在计算机上又运行着各种程序,如QQ、微信等。这些程序有可以为我们做很多事情,能聊天、能玩游戏等等。那么这些看似复杂的程序在计算机中到底是怎么运行起来的呢?其实非常简单,我们不妨一起探讨一下。 作为程序员我们必须理解CPU是如何运行的,特别是要弄清楚负责保存指令和数据的寄存器的机制。了解了寄存器,也就自然而然的理解了程序的运行机制。 CPU的构成 在程序运行流程中,

在路上的博客 1万+

Containerd容器运行时的私有仓库镜像推送push和镜像拉取问题解决

向/etc/containerd/config.toml配置添加如下配置,然后重启containerd。向/etc/containerd/config.toml配置添加如下配置,然后重启containerd。通过crictl为k8s拉取镜像如下所示。可以通过ctr命令进行镜像推送。往私有仓库推送镜像如下。

Bulut0907 1万+

一、Window程序运行的内部机制

文章目录1、API与SDK2、窗口与句柄3、消息与消息队列3.1 消息3.2 消息队列3.3 进队消息和不进队消息4、WinMain函数4.1 WinMain函数的定义4.2 窗口的创建4.2.1 设计一个窗口类4.2.2 注册窗口类4.2.3 创建窗口4.2.4 显示及更新窗口4.3 消息循环4.4 编写窗口过程函数5、动手写第一个Windows程序6、小结 1、API与SDK API Windows操作系统提供了各种各样的函数,以方便我们开发Windows应用程序。这些函数是Windows操作系统

weixin_43488529的博客 1597

CyberChef本地搭建

CyberChef本地搭建

2301_80241182的博客 6085

LM358实战:手把手教你搭建电流检测电路(附电阻选型计算)

本文详细解析了使用LM358运算放大器搭建电流检测电路的全过程,包括基础原理、采样电阻选型、放大电路设计及PCB布局技巧。通过实战案例和精确计算,帮助工程师快速掌握低成本、高精度的电流检测方案,适用于电源管理、电机控制等多种应用场景。

weixin_30872157的博客 451

程序的运行机制

程序运行机制

w_hai_q的博客 820

SIwave学习记录:电热耦合仿真

SIwave电热耦合仿真

m0_68174736的博客 2337

孙鑫VC++讲座笔记-(1)Windows程序内部运行机制

1,windows程序设计是种事件驱动方式的程序设计,主要基于消息的。当用户需要完成某种功能时,需要调用OS某种支持,然后OS将用户的需要包装成消息,并投入到消息队列中,最后应用程序从消息队列中取走消息并进行响应。2,消息结构:typedef struct tagMSG {     // msg     HWND   hwnd;     //接收消息的窗口句柄。和哪个窗口相关联。    UINT 

hbyufan的专栏 1万+

HFSS仿真的后处理结果,如何根据天线表面的电流密度分布对天线进行优化?

在HFSS仿真中,天线表面的Jsurf​是最直观、最有价值的诊断工具之一。它不仅告诉你天线“能不能工作”,还能告诉你“为什么工作”以及“哪里出了问题”。

degogmy的博客 1160

JavaScript实现量化交易策略(附完整源码)

JavaScript实现量化交易策略(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 722

Windows中创建窗口的步骤

在Visual Studio中,要创建一个窗口,可以利用Windows API进行开发。Windows API是微软为了方便开发基于Windows的应用程序所提供的一种函数,这是操作系统提供给应用程序的接口,即:Application Programming Interface,简称API。 要在创建一个窗体,需要一下步骤 1.设计窗口类:一个完整的窗口具有许多特征,所...

yuanzuxingkong的博客 1330

基于单片机设计的智能消防排烟窗控制系统_422

随着城市化进程的不断加快,高层建筑、大型商业综合体以及地下空间的数量迅速增加,建筑内部结构日趋复杂,一旦发生火灾,烟雾和有毒气体往往比明火更具威胁性。大量研究表明,在火灾事故中,人员伤亡的主要原因并非直接烧伤,而是由于吸入烟雾及一氧化碳等有毒气体导致窒息。因此,如何在火灾初期快速排烟、降低有害气体浓度,并及时进行预警,成为现代消防系统设计中的关键问题。传统的消防排烟系统多依赖人工操作或简单的联动控制方式,存在响应滞后、自动化程度低、信息反馈不及时等问题。在实际应用中,当火灾发生时,如果不能第一时间开启排烟窗

405

Windows程序内部运行机制学习

对于WINDOWS程序的内部运行机制,主要学习知识点如下。 1.MSDN 的全称是 Microsoft Developer Network。这是微软公司面向软件开发者的一种信息服务。MSDN 实际上是一个以 Visual Studio 和 Windows 平台为核心整合的开发虚拟社区,包括技术文档、在线电子教程、网络虚拟实验室、微软产品下载(几乎全部的操作系统、服务器程序、应用程序

Andrewniu的博客 557

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

深入浅出话VC++(1)——Windows程序内部运行机制

深入浅出话VC++(1)——Windows程序内部运行机制 一、引言 要想熟练掌握Windows应用程序的开发,首先需要理解Windows平台下程序运行的内部机制,然而在.NET平台下,创建一个Windows桌面程序,只需要简单地选择Windows窗体应用程序就可以了,微软帮我们做了非常好的封装,以至于对于很多.NET开发人员至今也不清楚Wind...

fgmah2000的博客 280

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Windows 程序内部运行机制

API函数是指Windows提供给应用程序编程的接口。     SDK(软件开发包):包括了API函数,帮助文档,辅助开发工具。     在Windows应用程序中,窗口是通过窗口句柄(HWND)来标识的。若要对某个窗口进行操作,首先要得到这个窗口的句柄。系统在创建资源(窗口,图标,光标)时会为它们分内存,并返回标识这些资源的标识号,即句柄。     Windows程序设计是一种基于事件

yzq19910629的博客 756

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

VC++深入详解--第一章 Windows程序内部运行机制

1.1 API与SDK API:application programming interface,应用程序编程接口,如在windows系统编程时,windows系统提供了很多API函数接口供开发者直接使用,在windows.h头文件进行了声明 MSDN:windows开发说明工具,介绍windows系统API的使用 SDK:software development kit,软件开发包,包括开发工具、开发文档说明、开发环境、API函数、辅助工具等。 1.2 窗口与句柄 窗口:屏幕上显示的一块矩形区域,是应用

ym12345678901的博客 622

WINDOWS核心编程--Windows程序内部运行机制

WinMain 函数接收 4 个参数,这些参数都是在系统调用 WinMain 函数时,传递给应用程序的。第一个参数 hInstance 表示该程序当前运行的实例的句柄,这是一个数值。当程序在 Windows 下运行时,它唯一标识运行中的实例(注意,只有运行中的程序实例,才有实例句柄)。一个应用程序可以运行多个实例,每运行一个实例,系统都会给该实例分配一个句柄值,并通过 hInstance 参数传递给 WinMain 函数。第二个参数 hPre

20岁爱吃必胜客 1523

WINDOWS程序内部运行机制

本文转载处:http://www.cnitblog.com/edaiqingwa/archive/2006/12/13/20432.html 1,windows 程序设计是种事件驱动方式的程序设计,主要基于消息的。当用户需要完成某种功能时,需要调用OS某种支持,然后OS将用户的需要包装成消息,并投入到消息队列中,最后应用程序从消息队列中取走消息并进行响应。 2 ,消息结构: typed

禽滑厘的专栏 536

Windows程序的内部运行机制

Windwos程序都是基于消息的,系统为每个应用程序都会分配一个消息队列。应用程序的所有操作都会通知操作系统,操作系统把应用程序所要完成的操作以消息的形式发送给消息队列,应用程序会调用GetMessage()函数从消息队列中读出消息(如:键盘按下,鼠标单击),然后通知操作系统做出相应的反应。 1. WinMain()函数是Windows程序的入口函数,所以 WinMain(...

HeartHelp2013的博客 263
上一篇: WINX如何做到可视化界面开发
下一篇: MFC程序框架的剖析
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值