1.windows消息循环

if (GetMessage(&msg, NULL, 0, 0)) {TranslateMessage(&msg); //消息转化DispatchMessage(&msg);  //消息派遣.  把TranslateMessage转换的消息发送到窗口的消息处理函数,此函数在窗口注册时已经指定}

执行过程:

  1. 消息循环调用GetMessage()从消息队列中查找消息进行处理,如果消息队列为空,程序将停止执行并等待(程序阻塞)。
  2. 事件发生时导致一个消息加入到消息队列(例如系统注册了一个鼠标点击事件),GetMessage()将返回一个正值,这表明有消息需要被处理,并且消息已经填充到传入的MSG参数中;当传入WM_QUIT消息时返回0;如果返回值为负表明发生了错误。
  3. 取出消息(在Msg变量中)并将其传递给TranslateMessage()函数,这个函数做一些额外的处理:将虚拟键值信息转换为字符信息。这一步实际上是可选的,但有些地方需要用到这一步。
  4. DispatchMessage()函数将消息分发到消息的目标窗口,并且查找目标窗口过程函数,给窗口过程函数传递窗口句柄、消息、wParam、lParam等参数然后调用该函数。
  5. 在窗口过程函数中,检查消息和其他参数,你可以用它来实现你想要的操作。如果不想处理某些特殊的消息,你应该总是调用DefWindowProc()函数,系统将按按默认的方式处理这些消息(通常认为是不做任何操作)。
  6. 一旦一个消息处理完成,窗口过程函数返回,DispatchMessage()函数返回,继续循环处理下一个消息。

2. 函数定义

2.1GetMessage

BOOL WINAPI GetMessage(_Out_     LPMSG lpMsg,_In_opt_  HWND hWnd,_In_      UINT wMsgFilterMin,_In_      UINT wMsgFilterMax
);
  • GetMessage 函数的作用是从当前线程的消息队列里获取一个消息并填入 MSG 结构 中。
  • 该函数只能获取调用线程的消息,不能获得其他线程的消息。成功获取消息后,线程将从消息队列中删除该消息。
  • 使用 GetMessage 函数,如果消息队列为空,函数会一直等待直到有消息到来才有返回值。

2.2 TranslateMessage

//BOOL TranslateMessage(CONST MSG *lpMsg);
  • 参数:lpMsg
    指向一个含有用GetMessage或PeekMessage函数从调用线程的消息队列中取得消息信息的MSG结构的指针
  • 函数功能描述:
    将虚拟键消息转换为字符消息。字符消息被送到调用线程的消息队列中,在下一次线程调用函数GetMessage或PeekMessage时被读出。
    TranslateMessage函数不修改由参数lpMsg指向的消息。

2.3 DispatchMessage

函数原型:LONG DispatchMessage(CONST MSG*lpmsg);
  • 参数:
    lpmsg:指向含有消息的MSG结构的指针。

  • 返回值:
    返回值是窗口程序返回的值。尽管返回值的含义依赖于被调度的消息,但返回值通常被忽略。

  • 备注:
    MSG结构必须包含有效的消息值。如果参数lpmsg指向一个WM_TIMER消息,并且WM_TIMER消息的参数IParam不为NULL,则调用IPa1ram指向的函数,而不是调用窗口程序。

3. 程序实例

  • 如果处理时间大于定时器时间,按照处理时间循环。
  • 如果处理时间小于定时器时间,按照定时器时间。
#pragma comment(lib,"user32")
#include <stdio.h>
#include <time.h>
#include <sys/timeb.h>
#include <windows.h>
char datestr[16];
char timestr[16];
char mss[4];
void log(char *s) {struct tm *now;struct timeb tb;ftime(&tb);now = localtime(&tb.time);sprintf(datestr, "%04d-%02d-%02d", now->tm_year + 1900, now->tm_mon + 1, now->tm_mday);sprintf(timestr, "%02d:%02d:%02d", now->tm_hour, now->tm_min, now->tm_sec);sprintf(mss, "%03d", tb.millitm);printf("%s %s.%s %s", datestr, timestr, mss, s);
}
VOID CALLBACK myTimerProc1(HWND hwnd, // handle of window for timer messagesUINT uMsg, // WM_TIMER message ************UINT idEvent, // timer identifierDWORD dwTime // current system time){log("In myTimerProc1\n");
}
VOID CALLBACK myTimerProc2(HWND hwnd, // handle of window for timer messagesUINT uMsg, // WM_TIMER messageUINT idEvent, // timer identifierDWORD dwTime // current system time) {log("In myTimerProc2\n");
}int main()
{MSG msg;SetTimer(NULL, 0, 4000, myTimerProc1);SetTimer(NULL, 1, 2000, myTimerProc2);for (int i = 0; i<20; i++) {Sleep(1000);log("In main\n");if (GetMessage(&msg, NULL, 0, 0)) {TranslateMessage(&msg); //消息处理DispatchMessage(&msg);  //消息派遣.  把TranslateMessage转换的消息发送到窗口的消息处理函数,此函数在窗口注册时已经指定}}return 0;
}
2019-12-06 21:10:24.633 In main
2019-12-06 21:10:25.618 In myTimerProc2
2019-12-06 21:10:26.619 In main
2019-12-06 21:10:27.620 In myTimerProc1
2019-12-06 21:10:28.621 In main
2019-12-06 21:10:28.621 In myTimerProc2
2019-12-06 21:10:29.623 In main
2019-12-06 21:10:29.624 In myTimerProc2
2019-12-06 21:10:30.625 In main
2019-12-06 21:10:31.623 In myTimerProc1
2019-12-06 21:10:32.624 In main
2019-12-06 21:10:32.624 In myTimerProc2
2019-12-06 21:10:33.626 In main
2019-12-06 21:10:33.626 In myTimerProc2
2019-12-06 21:10:34.628 In main

C++-Windows消息循环GetMessage/TranslateMessage/DispatchMessage相关推荐

  1. Windows消息循环机制详细概述

    首先来了解几个基本概念: 消息:在了解什么是消息先来了解什么是事件.事件可分为几种,由输入设备触发的,比如鼠标键盘等等.由窗体控件触发的,比如button控件,file菜单等.还有就是来自Window ...

  2. Windows API一日一练(10-12)GetMessage TranslateMessage DispatchMessage函数

    主目录传送门 https://blog.csdn.net/zb774095236/article/details/108291755 本次学习的源码模板下载: 1.https://pan.baidu. ...

  3. Windows 消息循环(1) - 概览

    本文从消息循环是如何驱动程序的这个角度,对 Windows 消息循环进行概览性介绍. 使用 EN5 课件获得更好的阅读体验: [希沃白板5]课件分享 : <Windows培训 - 消息循环> ...

  4. 详谈Windows消息循环机制

    一直对windows消息循环不太清楚,今天做个详细的总结,有说错的地方,请务必指出. 用VS2017新建一个win32 Application的默认代码如下: 这里有几个概念,容易混淆: 1.系统: ...

  5. Windows消息循环理解及窗体创建步骤

    首先理解一句话:"Windows"向应用程序发送了一条消息.这里是指Windows调用了该程序内部的一个函数. 当UpdateWindow被调用后,新建的窗口在屏幕便完全可见了.此 ...

  6. 深入理解Windows消息循环

    理解消息循环和整个消息传送机制对Windows编程来说非常重要.如果对消息处理的整个过程不了解,在windows编程中会遇到很多令人困惑的地方. 什么是消息(Message) 每个消息是一个整型数值, ...

  7. GetMessage TranslateMessage DispatchMessage 和PeekMessage

    文章目录 GetMessage 函数功能 函数声明 第一个参数 第二个参数 第三个参数 第四个参数 返回值 补充: TranslateMessage 函数功能 函数声明 第一个参数: 返回值 补充 D ...

  8. c#windows消息循环sendmessage实例

    [DllImport("User32.dll", EntryPoint = "SendMessage")]private static extern int S ...

  9. TranslateMessage ,GetMessage, DispatchMessage分析

    TranslateMessage(&msg); TranslateMessage是用来把快捷键消息转换为字符消息,并将转换后的新消息投递到调用线程的消息队列中. 由于Windows对所有键盘编 ...

最新文章

  1. Mac 环境下连接多个git — ssh方式
  2. 算法与数据结构之队列的链式存储
  3. linux 子域dns,linux下搭建DNS子域及相关授权详解
  4. csdn上修改字体的颜色
  5. 【CodeForces - 777C】Alyona and Spreadsheet(思维,前缀和)
  6. 自带数据线的迷你数显充电宝,春运相亲必备呀
  7. hive/hadoop文件格式,序列化和反序列化
  8. Open3d之表面重建
  9. siri不能识别语音
  10. ThinkPHP 数据库操作,插入,更新,删除,查询
  11. java 向后台传两个json数据类型_前台向后台传递JSON字符串,处理JSON字符串类型的方法...
  12. 为计算机快捷方式是什么原因,为什么我的电脑界面上的东西都变成快捷方式??...
  13. 2019计算机世界语言排名,2019程序语言排行_2019 年 8 月编程语言排行榜
  14. HDU 4609 3-idiots (思维+FFT卷积)
  15. React基础 ① -- 从零开始
  16. 福利福利!!!!!!!!往这看!!!!!
  17. ChatGPT工作提效之初探路径独孤九剑遇强则强
  18. SV中program module
  19. 2019.1.18【NOIP提高组】模拟B组 JZOJ 3025 选择客栈
  20. 微信小程序获取当前位置和城市名

热门文章

  1. 滴滴出行推出AI Labs,全面开启大数据的行车智能时代
  2. Java数据结构——二叉树的遍历
  3. python量化实战_Python与量化投资 从基础到实战.pdf
  4. 论文阅读《Universal Adversarial Triggers for Attacking and Analyzing NLP》
  5. 解决 grant all privileges on *.* to ‘root‘@‘%‘ identified by ‘PASSWORD‘ with grant option; 错误
  6. 一随机数以概率 p 生成0,以概率(1-p)生成1,怎样生成等概率的 0 和 1
  7. ACTF2020 新生赛 Upload 1
  8. 超级有意思且非常实用的心理学小窍门
  9. MyBatis 批量插入数据到Oracle
  10. 推荐读《微信互联网平民创业》