孙鑫VC学习笔记:第一讲 Windows程序内部运行原理

孙鑫MFC笔记教程(1)--Windows程序的内部运行原理 <br /> <br />Windows程序的内部运行原理<br /> <br />操作系统和应用程序之间的关系:<br />应用程序到操作系统表示应用程序可以通知操作系统执行某个具体的动作<br />操作系统到应用程序表示操作系统能够将输入设备的变化上传给应用程序。如用户在某个程序活动时按了一下键盘,操作系统马上能够感知到这一事件,并且能够知道用户按下的是哪一个键,操作系统并不决定对这一事件如何作出反应,而是将这一事件转交给应用程序,由应用程序决定如何对这一事件作出反应。<br /> <br />wind 阅读详情
1.消息结构体
typedef struct tagMSG {     // msg  
   HWND hwnd;           //标识消息与哪个窗口相关
   UINT message; //指示消息本身
   WPARAM wParam; //消息的附加消息
   LPARAM lParam; //消息的附加消息
   DWORD time;  //消息产生的时间
   POINT pt;  //消息产生时光标的位置
} MSG


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

3.WinMain函数

Windows程序的入口函数
int WINAPI WinMain(
  HINSTANCE hInstance,      // handle to current instance应用程序实例句柄
  HINSTANCE hPrevInstance,  // handle to previous instance应用程序先前的实例句柄
                            // This parameter is always NULL在Win32下总是为空
  LPSTR lpCmdLine,          // command line命令行参数
  int nCmdShow              // show state指定程序窗口的显示状态
);

注:VC++6.0下设置命令行参数的方法:
   Projects->Settings->Debug->Program arguments

4.窗口的创建 
创建一个完整的窗口需要经过下面四个操作步骤:
(1)设计一个窗口类;
 typedef struct _WNDCLASS { 
  UINT     style;            //指定窗口类的类型,如:CS_HREDRAW-窗口水平尺寸
                                   //或水平大小发生变化时,窗口重绘,CS_VREDRAW-窗口
       //垂直尺寸或垂直大小发生变化时,窗口重绘
  WNDPROC lpfnWndProc;   //函数指针,指向窗口函数
  int      cbClsExtra;   //类风格的额外的数据,通常设置为0
  int      cbWndExtra;       //窗口类的额外数据,通常设置为0
  HANDLE  hInstance;   //当前应用程序的实例号
  HICON    hIcon;            //图标的句柄,设置标题栏使用的图标
  HCURSOR  hCursor;          //光标的句柄
  HBRUSH   hbrBackground;    //画刷的句柄
  LPCTSTR  lpszMenuName;     //指定菜单的名字
  LPCTSTR  lpszClassName;    //设置窗口的名字
 } WNDCLASS;

    <1>"winuser.h"
    #define CS_VREDRAW          0x0001
    #define CS_HREDRAW          0x0002
    #define CS_DBLCLKS          0x0008
     假如:style=CS_HREDRAW | CS_VREDRAW | CS_NOCLOSE
     如果需要在style中去掉CS_NOCLOSE,可以使用style & ~CS_NOCLOSE
    <2>函数名可以表示函数代码的首地址.
    <3>hIcon,使用LoadIcon函数来赋值:wndcls.hCursor=LoadCursor(NULL,IDC_CROSS)
       HICON LoadIcon( HINSTANCE hInstance, //This parameter must be NULL when 
                                            //a standard icon is being loaded. 
         //微软已经为我们设置好了标准的图标,所以这里
         //的值设置为NULL
                       LPCTSTR lpIconName
                     );
    <4>设置光标:wndcls.hCursor=LoadCursor(NULL,IDC_CROSS),LoadCursor和LoadIcon的用法
       很接近.
    <5>设置画刷的句柄:wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
       API函数GetStockObject:Win GDI函数,
              HGDIOBJ GetStockObject(
     int fnObject   // stock object type
       );
       fnObject:BLACK_BRUSH/DKGRAY_BRUSH/DC_BRUSH........ 
       (HBRUSH)强制类型转换
       
(2)注册窗口类;
 RegisterClass(&wndcls);注册窗口类
 ATOM RegisterClass(
      CONST WNDCLASS *lpWndClass   //指向窗口类的指针
        );
        "windef.h":typedef WORD                ATOM;
            typedef unsigned short      WORD;
(3)创建窗口;
        首先定义一个窗口句柄:HWND hwnd;
 使用API函数CreateWindow创建窗口:
 HWND CreateWindow(          
  LPCTSTR lpClassName,         //注册的窗口类名,如果指定的类名没有注册,应用
                               //程序依然可以运行,只不过不会产生窗口
  LPCTSTR lpWindowName,        //窗口的名字,即窗口标题栏的文字
  DWORD dwStyle,       //窗口的类型  
  int x,                       //窗口显示的时候的水平坐标
  int y,                       //窗口显示的时候的垂直坐标    
  int nWidth,                  //窗口的宽度
  int nHeight,                 //窗口的高度
  HWND hWndParent,             //指向父窗口的句柄
  HMENU hMenu,                 //窗口菜单的句柄
  HINSTANCE hInstance,         //应用程序实例的句柄
  LPVOID lpParam               //WM_CREATE消息的附加参数
 );
 hwnd=CreateWindow("Weixin2003","北京维新科学技术培训中心",WS_OVERLAPPEDWINDOW,
  0,0,600,400,NULL,NULL,hInstance,NULL);
 #define WS_OVERLAPPEDWINDOW (WS_OVERLAPPED  | / //产生层叠的窗口,具有标题栏和边框
                             WS_CAPTION        | /   //具有标题栏
                             WS_SYSMENU        | /   //具有系统菜单
                             WS_THICKFRAME     | /   //具有可调边框的窗口
                             WS_MINIMIZEBOX    | /   //具有最小化,最大化按钮,此时必须同时
                                //设置WS_SYSMENU
                             WS_MAXIMIZEBOX)
        同理,如果要在WS_OVERLAPPEDWINDOW中去掉最大化按钮,可以使用
 WS_OVERLAPPEDWINDOW & ~WS_MAXIMIZEBOX
 如果将x设置为CW_USEDEFAULT,系统将为窗口左上角选择缺省的坐标,同时忽略y坐标
 如果将nWidth设置为CW_USEDEFAULT,同上nHeight被忽略.

(4)显示窗口:
        ShowWindow(hwnd,SW_SHOWNORMAL);
 BOOL ShowWindow(
       HWND hWnd,
              int nCmdShow
        );
        nCmdShow:SW_HIDE
   Hides the window and activates another window.
   SW_MAXIMIZE
    Maximizes the specified window.
   SW_MINIMIZE
          Minimizes the specified window and activates the
   next top-level window in the Z order.
(5)更新窗口
       UpdateWindow(hwnd);

5.消息循环:
       GetMessage(&msg,NULL,0,0);
       BOOL GetMessage(          //从消息队列中取出一条消息
            LPMSG lpMsg,         //消息结构体的指针
            HWND hWnd,           //指示获取哪一个窗口的消息
            UINT wMsgFilterMin,  //指定消息的最小值,指定消息的范围
            UINT wMsgFilterMax   //指定消息的最大值,指定消息的范围,设置为0表示没有消息过滤
       ); 
lpMsg
[out] Pointer to an MSG structure that receives message information
      from the thread's message queue
      out指示不需我们赋值,只需放置一个这样的变量,由系统函数为我们填充

      TranslateMessage(&msg);转换消息/翻译消息
      比如它可以将WM_KEYDOWN和WM_KEYUP消息转换为WM_CHAR消息,然后重新投递到消息队列

      DispatchMessage(&msg);将消息分发给窗口的回调函数,

6.窗口过程回调函数
 LRESULT CALLBACK WindowProc(
         HWND hwnd,
  UINT uMsg,
  WPARAM wParam,
                LPARAM lParam
        );
 函数名可以更改,函数参数的类型不能改变.


 case WM_CHAR:
  char szChar[20];
  sprintf(szChar,"char is %d",wParam);//sprintf格式化wParam值,存入szChar中
  MessageBox(hwnd,szChar,"weixin",0);
  break;
        int MessageBox(
         HWND hWnd,               //消息框所属的窗口
  LPCTSTR lpText,          //消息框显示的文本
  LPCTSTR lpCaption,       //消息框的标题
  UINT uType               //消息框的类型
 );  
        uType:
 MB_OK
  The message box contains one push button: OK. This is the default.
 MB_OKCANCEL
  The message box contains two push buttons: OK and Cancel.
 MB_YESNO
  The message box contains two push buttons: Yes and No.

 #define MB_OK                       0x00000000L
        #define MB_OKCANCEL                 0x00000001L


 case WM_LBUTTONDOWN:
  MessageBox(hwnd,"mouse clicked","weixin",0);
  HDC hdc;              //设备描述表句柄
  hdc=GetDC(hwnd);
  TextOut(hdc,0,50,"计算机编程语言培训",strlen("计算机编程语言培训"));
  ReleaseDC(hwnd,hdc);
  break; 

 HDC GetDC(
  HWND hWnd   // handle to window
 );

 BOOL TextOut(
  HDC hdc,           // handle to DC
  int nXStart,       // x-coordinate of starting position
  int nYStart,       // y-coordinate of starting position
  LPCTSTR lpString,  // character string
  int cbString       // number of characters
 );
 ReleaseDC(hwnd,hdc);


 case WM_PAINT:           //当窗口重绘时发送WM_PAINT消息
  HDC hDC;
  PAINTSTRUCT ps;
  hDC=BeginPaint(hwnd,&ps);
  TextOut(hDC,0,0,"维新培训",strlen("维新培训"));
  EndPaint(hwnd,&ps);
  break;
 HDC BeginPaint(
  HWND hwnd,            // handle to window
  LPPAINTSTRUCT lpPaint // paint information
 );
        BeginPaint和EndPaint函数只能在WM_PAINT里面使用,其它的任何地方都不能使用
 GetDC和ReleaseDC也不能WM_PAINT里面使用,能在其它地方使用


 case WM_CLOSE:
  if(IDYES==MessageBox(hwnd,"是否真的结束?","weixin",MB_YESNO))
  {
   DestroyWindow(hwnd);      //使用这个函数时,会发送WM_DESTROY消息
                             //销毁窗口
  }
  break;

 查看MSDN MessageBox函数的返回值:
 IDABORT        Abort button was selected. 
 IDCANCEL       Cancel button was selected. 
 IDCONTINUE     Continue button was selected. 
 IDIGNORE       Ignore button was selected. 
 IDNO           No button was selected. 
 IDOK           OK button was selected. 
 IDRETRY        Retry button was selected. 
 IDTRYAGAIN     Try Again button was selected. 
 IDYES          Yes button was selected

 BOOL DestroyWindow( 
      HWND hWnd
        );


        case WM_DESTROY:
  PostQuitMessage(0);
  break;

 void PostQuitMessage(
      int nExitCode                //指示应用程序退出的代码
                                   //执行这个函数会投递WM_QUIT消息到消息队列
 );

 WM_QUIT消息可以使GetMessage函数的值为0


 default:
  return DefWindowProc(hwnd,uMsg,wParam,lParam);
  //其它的消息由缺省的窗口过程处理.这段程序是比不可少的

7.CALLBACK
 #define CALLBACK    __stdcall    //标准的调用约定
 #define WINAPIV     __cdecl      //c语言调用约定
 在参数传递的顺序和堆栈的清除有些差异.
修改调用约定:
 Projects->Settings->c/c++->Category:Code Generation 
 

第一讲_Windows程序内部运行原理 Windows程序内部运行原理 具体讲述windows程序的开发,运行原理 立即下载

相关推荐

高通QCOM Camera Pipeline 可视化工具:从XML到交互式图谱的工程实践

本文详细介绍了高通QCOM Camera Pipeline可视化工具的工程实践,旨在解决Camera驱动与算法工程师在解析复杂XML配置文件时的痛点。该工具能将静态的XML文件(如g_camx_usecase.xml)自动转换为交互式视觉图谱,通过分层布局算法清晰展示Pipeline、Node、Port和Link的拓扑关系,并支持悬停查看、拖动缩放等交互操作,极大提升了开发调试与架构理解的效率。

prometheus5watch的博客 554

Lesson1 Windows程序内部运行原理 ---孙鑫VC++教程

Lesson1 Windows程序内部运行原理State:09061.消息结构体typedef struct tagMSG {     // msg     HWND hwnd;           //标识消息与哪个窗口相关   UINT message; //指示消息本身   WPARAM wParam; //消息的附加消息   LPARAM lParam; //消息的附加消息   DWO

lxu的专栏 2308

2023电赛B题实战解析:基于立创天空星开发板的同轴线缆长度与负载测量系统

本文详细解析了2023年全国大学生电子设计竞赛B题的实战方案,重点介绍了基于立创EDA天空星开发板(STM32F103)的同轴线缆长度与负载测量系统。文章深入剖析了两种核心测量方案,并推荐了更稳定易实现的NE555测电容法,提供了从硬件选型、电路设计到软件编程、参数标定的完整“施工图”,实测精度可达厘米级和皮法级,为电赛复现与高精度测量学习提供了清晰指导。

weixin_36303305的博客 231

Windows程序内部运行原理

本文大部分内容都是摘自孙鑫老师,在下就是一个简单的总结,归纳,希望对大家有用!!!!Windows操作系统是一种完全不同于传统的dos方式的程序设计方法,是事件驱动的方式(主要是基于消息的,当用户需要完成某种功能时,会调用操作系统的某种支持,然后操作系统将用户的某种需要,包装成消息,并投递到消息队列中去,最后应用程序从消息队列中取走消息,并进行响应。)Windows应用程序,操作系统,计算机硬件之间

L未若的博客 4369

基于ZYNQ7020芯片(黑金开发板AX7020)之AXI-FULL DDR的PL与PS交互操作。

在该工程中我们使用了PS端的串口接收功能,PS端串口接收和发送分别有一个64字节的FIFO,但是因为串口接收阈值设置为16,所以固定接收16个字节数据后才会发生中断。此测试工程得到以前知识的总结和各大网友的支持,只希望可以为学习的你更进一步,大家一起学习才是真的开心。加油,国产芯片之路。

landyjzlai的博客 3189

win10自动修复-无限循环【通用完美】超简单解决办法

2020.02.14今个我的笔记本电脑(Thinkpad Carbon 7 X1)(win10)早晨起来发现蓝屏,上面显示自动修复失败,重启后依然自动修复失败,不断手动重启,始终是修复失败。然后上网开始搜集资料找解决办法。 前边介绍关闭自动修复,如何找出错文件的方法;如果想看最终解决办法,直接看第三部分 上网就会发现这种现象很常见,同时是电脑自动安装系统更新,或者安装某些驱动出现。解决办法也大...

y15941300574的博客 19万+

Windows程序设计__孙鑫C++Lesson1《Windows内部运行原理》

Windows程序设计__孙鑫C++Lesson1《Windows内部运行原理》 本节要点: 1.Windows操作系统的消息机制 2.窗口产生过程 3,消息循环 采用C++ Win32 Application (注意不要选择了WIN32 Console Application 因为我们编写的窗口的应用程序 而不是控制台)编写一个窗口程序代码如下: //****************

王定桥的专栏 2337

Java 实现 MP3 音频合并工具类:摆脱 FFmpeg,高效低 CPU 的纯本地方案【需求已解决】

本方案充分发挥了 Java 音频 SPI 的潜力,实现了轻量、跨平台、低 CPU 消耗的 MP3 音频合并工具类。 对于希望在服务器或桌面应用中集成音频处理功能的开发者而言,这无疑是一个可行且优雅的解决方案。

一键难忘的博客 542

一、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的博客 1596

YOLOv13改进策略【小目标改进】| Shape-NWD:融合改进,结合Shape-IoU和NWD 更好地适应小目标特性

Bw−wgt2h−hgt2weight2Bweight2w−wgt​2h−hgt​2​其中weight2weight = 2weight2。

Limiiiing的博客 587

第1章:认识OpenClaw

OpenClaw是一个开源的 AI 智能体 Gateway 网关项目名称演变:OpenClaw 原名 Clawdbot,因 Anthropic 商标顾虑在 2026年1月27日更名为 Moltbot(过渡名),最终在1月30日确定为 OpenClaw。三个名字本质是同一个项目,功能完全一致。🏠在你的电脑上运行:完全本地部署,数据隐私有保障📁访问本地文件:可以搜索、读取、编辑你电脑上的文件🔌扩展能力:通过Skills(技能)系统无限扩展功能💬多平台使用。

Maynor的博客 2832

Windows程序设计__孙鑫C++Lesson14《网络编程》

Windows程序设计__孙鑫C++Lesson14《网络编程》 本节要点: 1.网络协议参考模型简介 2.套接字简介 3.网络字节顺序 4.客户机/服务器模式简介 5.Windows Sockets的实现 6.Windows网络编程函数准备 7.基于TCP的套接字编程 8.基于UDP的套接字编程 //**************************************

王定桥的专栏 3254

YOLOv11改进 | 注意力篇 | YOLOv11引入24年最新的ELA注意力机制,并构建C2PSA_ELA

为了解决这些限制,本文介绍了一种高效的本地注意力(ELA)方法,实现了一个简单的结构,大幅度的性能改善。我们精心设计了ELA中的三个超参数,产生了四个不同的版本:ELA-T,ELAB,ELA-S和ELA-L,以满足不同视觉任务的具体要求,如图像分类,目标检测和语义分割。到此本文的正式分享内容就结束了,在这里给大家推荐我的YOLOv11改进有效涨点专栏,本专栏目前为新开的,后期我会根据各种前沿顶会进行论文复现,也会对一些老的改进机制进行补充,如果大家觉得本文帮助到你了,订阅本专栏,关注后续更多的更新~

tsg6698的博客 1284

孙鑫VC视频教程笔记之第一课“Windows程序的内部运行原理”

1.      操作系统和应用程序之间的关系:应用程序到操作系统表示应用程序可以通知操作系统执行某个具体的动作操作系统到应用程序表示操作系统能够将输入设备的变化上传给应用程序。如用户在某个程序活动时按了一下键盘,操作系统马上能够感知到这一事件,并且能够知道用户按下的是哪一个键,操作系统并不决定对这一事件如何作出反应,而是将这一事件转交给应用程序,由应用程序决定如何对这一事件作出反应。 2.

Roger Ge 的专栏 2452

ssm框架搭建

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

老版QQ原生表情gif动态

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

孙鑫C++视频教程

(注意以下为FTP下载地址,建议使用迅雷等下载工具下载,全20CD,已添加完整) 孙鑫C++教程(全20讲)PPT讲义.rar 孙鑫C++教程01.rar 孙鑫C++教程02.rar 孙鑫C++教程03.rar 孙鑫C++教程04.rar 孙鑫C++教程05.rar 孙鑫C++教程06.rar 孙鑫C++教程07.rar 孙鑫C++教程08.rar 孙鑫C++教程0

又见炊烟 6280

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

孙鑫VC学习系列教程

教程简介 1、循序渐进  从Win32SDK编程开始讲解,帮助大家理解掌握Windows编程的核心 —— 消息循环机制。 2、通俗易懂  编程语言枯燥难懂,然而通过孙鑫老师形象化的讲解,Windows和MFC编程中的难点、重点,让你轻松掌握。 3、实战性强  编程中要注意什么?如何阅读出错提示?如何调试运行程序?如何排查错误,解决问题?通过孙鑫老师的一步步操作讲解,带你迅速掌握程序

学如逆水行舟,不进则退 1821

孙鑫VC++第一章 Windows内部运行原理

Windows程序的入口

qq_38446366的博客 791

孙鑫VC++LESSON1:Windows程序内部运行原理

孙鑫VC++LESSON1:Windows程序内部运行原理

p975468132的博客 544

孙鑫VC第一课学习笔记

孙鑫VC第一课学习笔记Windows程序内部运行原理知识点一Windows程序设计是一种事件驱动方式的程序设计,主要是基于消息的。当用户需要完成某种功能时,会调用操作系统的某种支持,然后操作系统将用户的需要包装成消息,并投递到消息队列中,最后应用程序从消息队列中取走消息,并进行响应。箭头1表示操作系统能够操纵输出设备,以执行特定的功能,例如让声卡发出声音。箭头2表示操作系统能够

张戟的专栏-H.264学习乐园 6157

孙鑫VC视频学习笔记之windows程序内部运行原理

这两天看了孙鑫VC教学视频的第一集:WinDows程序内部运行原理。将所学内容整理成笔记以备将来之需,其文如下: 1.  关于计算机系统,如图所示:                                                                              计算机系统大致分为三层:应用程序,操作系统,硬件设备。应用程序通过调用操作系统提供的A

毅&意&忆 1132

Windows消息运行原理 孙鑫讲座笔记

(1)Windows程序内部运行机制       1,windows程序设计是种事件驱动方式的程序设计,主要基于消息的。当用户需要完成某种功能时,需要调用OS某种支持,然后OS将用户的需要包装成消息,并投入到消息队列中,最后应用程序从消息队列中取走消息并进行响应。2,消息结构:typedef struct tagMSG {     // msg     HWND   hwnd;    

xziis的专栏 527

孙鑫C++教程(全20讲)

(注意以下为FTP下载地址,建议使用迅雷等下载工具下载,全20CD,已添加完整)孙鑫C++教程(全20讲)PPT讲义.rar孙鑫C++教程01.rar孙鑫C++教程02.rar孙鑫C++教程03.rar孙鑫C++教程04.rar孙鑫C++教程05.rar孙鑫C++教程06.rar

http://www.softwareace.cn 王牌软件 2510

孙鑫VC讲座笔记--WINDOWS程序内部运行原理

声明:        本人最近也在看孙老师的视频,为了加强理解,所以想一些读书笔记。但是在优快云上一搜索,发现已经有朋友做了相关笔记。根据面向对象的“继承”观点,为了解决劳动力,所以我打算在他们的基础上添加、修改。应该不涉及著作权什么的东东吧?!        我在BLOG.youkuaiyun.com/LEWISLAU上搜索了下 ,有两位朋写了相关笔记(而且都是一样的)。不知道谁才是原作者,所以列

程序的江湖?! 勿在浮砂筑高台! 3557
上一篇: WM_CREATE消息响应函数和WM_INITDIALOG消息响应函数之区别
下一篇: 孙鑫VC学习笔记:第二讲 掌握C++
Savitch
博客等级 码龄16年 84粉丝 130原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值