深入浅出 windows 消息机制

Win 32 应用程序生命周期

1. 程序进入点

Windows 程序进入点是 WinMain 函数

  • 函数原型
    int __clrcall WinMain(
      HINSTANCE hInstance,
      HINSTANCE hPrevInstance,
      LPSTR     lpCmdLine,
      int       nShowCmd
    );
    
  • 函数参数
    • hinstance 应用程序当前实例的句柄

    • hPrevlnstance 应用程序的先前实例的句柄。对于同一个程序打开两次,出现两个窗口第一次打开的窗口就是先前实例的窗口。对于一个 32 位程序,该参数总为 NULL。如打开了两个 QQ 后一个就是先前示例的窗口。

      深入浅出 windows 消息机制_第1张图片
    • lpCmdLine 指向应用程序命令行的字符串的指针,不包括执行文件名。

    • nCmdShow 指明窗口如何显示,可以是以下的值等等

      • SW_HIDE 隐藏窗口并且激活另外一个窗口。
      • SW_MINIMIZE 最小化指定的窗口,并且激活在系统表中的顶层窗口。
      • SW_SHOWNORMAL 激活并显示窗口。如果窗口最大化或最小化,系统将其恢复到原来的尺寸和位置。

2. 创建窗口类

窗口类为窗口定义了窗口风格、窗口过程、显示和绘制窗口所需要的信息等。

3. 注册窗口类

通过 RegisterClass 函数来注册一下窗口类

4. 创建窗口

通过 CreateWindow 函数来创建窗口

5. 显示窗口

通过 ShowWindow 函数来显示窗口

6. 消息循环

while(GetMessage(&Msg, NULL, 0, 0) > 0) 
{ 
    TranslateMessage(&Msg);    // 转换
    DispatchMessage(&Msg);     // 分发
} 

7. 窗口处理函数

处理发送给窗口的消息

消息循环过程

捕获消息

Windows 一直监控着 I/O 设备,当用户通过鼠标,键盘来操作应用程序时,这个事件首先会被转化成消息,由 Windows 系统捕获,然后存放在系统消息队列中。

将消息发送到应用程序消息队列

Windows 系统知道该消息应由哪个应用程序处理,然后发送相应的应用程序消息队列,同时将该消息从自己的系统消息队列中删除。

应用程序获取消息

应用程序一直执行消息循环,在消息队列中发现了系统传过来的消息,之后获取消息。

应用程序处理消息

然后取出消息 (msg) 并将其传递给 TranslateMessage() 函数,这个函数可以将虚拟键值信息转换为字符信息。

窗口过程函数

将消息传递给 DispatchMessage() 函数。DispatchMessage() 函数将消息再给 Windows 系统,然后,Windows 将该消息发送给适当的窗口过程函数,即窗口的 WinPro 函数,处理完消息之后,WinPro 传回到 Windows。

处理完毕

应用程序的消息循环继续 while 循环,Windows 系统继续监控各类消息,重复上述步骤。

相关术语

  • 系统
    这里指的就是 Windows 操作系统

  • 应用程序
    比如 QQ PC 端,网易云音乐 PC 端,它们称为应用程序。

    深入浅出 windows 消息机制_第2张图片
  • 窗口
    一个应用程序可以有多个窗口,比如 QQ 有主窗口,也有用于聊天的子窗口,但是一个窗口只能属于一个应用程序。

  • 消息
    Windows 消息,就是指 Windows 发出的一个通知,告诉应用程序某个事情发生了。例如,用户单击鼠标、改变窗口尺寸、按下键盘上的一个键,首先都会被 Windows 系统接收到,然后 Windows 发送这个消息给应用程序。

    消息本身是作为一个记录传递给应用程序的,这个记录中包含了消息的类型以及其他信息。例如,对于单击鼠标所产生的消息来说,这个记录中包含了单击鼠标时的坐标,这样应用程序才会知道点击到了哪个位置。

    因此 Windows 的消息提供了应用程序之间、应用程序与 Windows 系统之间进行通信的手段。

  • 消息循环
    Windows 系统的一种消息机制

  • 消息队列

    • 系统消息队列
      这是一个系统唯一的队列,设备驱动会把操作输入转化成消息存在系统队列中,然后系统会把此消息放到目标窗口所在的线程消息队列中等待处理。

    • 线程消息队列
      每一个 Windows 应用程序运行后,系统都会为该应用程序创建一个线程消息队列,这个消息队列用来存放该应用程序创建的窗口消息。

      用户对 Windows 进行操作后,产生消息,Windows 系统将产生的消息依次放入到线程消息队列中,而应用程序则通过一个消息循环不断地从线程消息队列中取出消息,并进行响应。

  • 线程

    线程(英语:thread)是操作系统能够进行运算调度的最小单位。大部分情况下,它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

参考资料

  • Windows 程序设计:第5版 - 豆瓣读书

你可能感兴趣的:(C++)