java中getmessage函数_PeekMessage、GetMessage的区别

article/2025/10/25 7:29:03

在Windows编程中经常使用这两个函数来处理消息,它们之间的区别就是GetMessage是阻塞的,PeekMessage是非阻塞的。

GetMessage原型如下:BOOL GetMessage(LPMSG lpMsg,HWND hWnd,UINT

wMsgFilterMin,UINT wMsgFilterMax);

PeekMessage原型如下:BOOL PeekMessage(LPMSG lpMsg,HWND hWnd,UINT

wMsgFilterMin,UINT wMsgFilterMax,UINT wRemoveMsg);

前面4个参数都是一样的,第一个是消息结构指针;第二个是窗口句柄,标识要接收的消息的窗口,如果为NULL,则表示接收属于该应用程序的所有窗口的消息;第三个、第四个分别指定了接收的消息的范围,如果都为0,则接收所有消息,WM_KEYFIRST

和 WM_KEYLAST 常量用于接受所有的键盘消息。 WM_MOUSEFIRST 和 WM_MOUSELAST

常量用于接受所有的鼠标消息。PeekMessage函数的第五个参数指示了PeekMeesage接收过消息之后是否将该消息删除,PM_REMOVE表示删除,PM_NONREMOVE表示不删除。

该函数用于查看应用程序的消息队列,如果其中有消息就将其放入lpMsg所指的结构中,不过,与GetMessage不同的是,

PeekMessage函数不会等到有消息放入队列时才返回。同样,如果hWnd为NULL,则PeekMessage获取属于调用该函数应用程序的任一窗口的消息,如果hWnd=-1,那么函数只返回把hWnd参数为NULL的PostAppMessage函数送去的消息。如果

wMsgFilterMin和wMsgFilterMax都是0,则PeekMessage就返回所有可得到的消息。函数获取之后将删除消息队列中的除

WM_PAINT消息之外的其他消息,至于WM_PAINT则只有在其处理之后才被删除。

Windows编程中常用的消息处理函数如下:

1 while(GetMessage(&msg, NULL, 0, 0))2 {3 TranslateMessage(&msg);4 DispatchMessage(&msg);5 }

首先,GetMessage从进程的主线程的消息队列中获取一个消息并将它复制到MSG结构,如果队列中没有消息,则GetMessage函数将等待一个消息的到来以后才返回。如果你将一个窗口句柄作为第二个参数传入GetMessage,那么只有指定窗口的的消息可以从队列中获得。GetMessage也可以从消息队列中过滤消息只接受消息队列中落在范围内的消息。这时候就要利用GetMessage/PeekMessage指定一个消息过滤器。这个过滤器是一个消息标识符的范围或者是一个窗体句柄,或者两者同时指定。当应用程序要查找一个后入消息队列的消息是很有用。WM_KEYFIRST

和 WM_KEYLAST 常量用于接受所有的键盘消息。 WM_MOUSEFIRST 和 WM_MOUSELAST 常量用于接受所有的鼠标消息。

TranslateMessage将把两个按键消息WM_KEYDOWN和WM_KEYUP

转换成一个WM_CHAR,不过需要注意的是,消息WM_KEYDOWN,WM_KEYUP仍然将传递给窗口的回调函数。

处理完之后,DispatchMessage函数将把此消息发送给该消息指定的窗口中已设定的回调函数。如果消息是WM_QUIT,则

GetMessage返回0,从而退出循环体。应用程序可以使用PostQuitMessage来结束自己的消息循环。通常在主窗口的

WM_DESTROY消息中调用。

使用PeekMessage函数的消息循环如下:

69c5a8ac3fa60e0848d784a6dd461da6.png1 while(true)2 {3 if(PeekMessage(&msg, m_hWnd, WM_KEYFIRST, WM_KEYLAST, PM_REMOVE))4 {5 if (msg.message ==WM_QUIT)6 {7 break;8 }9 if(msg.message == WM_KEYDWON && msg.wParam ==VK_ESCAPE)10 {11 ...12 }13 }14 else

15 {16 //no message

17 }18 }

69c5a8ac3fa60e0848d784a6dd461da6.png

这里我们接受所有的键盘消息,所以就用WM_KEYFIRST 和

WM_KEYLAST作为参数。最后一个参数可以是PM_NOREMOVE 或者 PM_REMOVE,表示消息信息是否应该从消息队列中删除。

所以这段小代码就是判断是否按下了Esc键,如果是就进行处理。

注意:

while (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE)) ;

这行叙述从消息伫列中删除WM_PAINT之外的所有消息。如果伫列中有一个WM_PAINT消息,程式就会永远地陷在while循环中。

原文:http://www.cnblogs.com/lit10050528/p/3763891.html


http://chatgpt.dhexx.cn/article/fIaew4FW.shtml

相关文章

java e.getmessage() null,Java 求助! 为什么我拿不到错误信息,e.getMessage()

Java 求助! 为什么我拿不到错误信息,e.getMessage() Java 求助! 为什么我拿不到错误信息,e.getMessage() 我明明打印了错误信息的啊? e.getMessage() 是空,为什么? 一声声带着惊讶,带着恐慌,带着质疑,带着无奈的话语,从某个角落里传出。 议论纷纷...... 似乎拿不到异…

Java 异常中 e.getMessage() 和 e.toString() e.printStackTrace()的区别常见的几种异常

Java 异常中 e.getMessage() 和 e.toString() e.printStackTrace()的区别 一、概述 在java异常体系中,要打印异常信息,可以通过:e.getMessage() 、 e.toString() e.printStackTrace() 等方法打印出 一些 异常信息。已知的是这些方法都可以打…

GetMessage以及消息循环说明

GetMessage以及消息循环说明 在创建窗口、显示窗口、更新窗口后,我们需要编写一个消息循环,不断地从消息队列中取出消息,并进行响应。要从消息队列中取出消息,我们需要调用GetMessage()函数,该函数的原型声明如下&…

redis使用配置文件的方式启动

文章目录 为什么用配置文件启动呢使用配置文件启动1.创建配置文件2.修改配置文件里面的参数3.以配置文件的方式启动4.查看日志文件 为什么用配置文件启动呢 因为在企业项目中不会只有单个redis实例,每个redis的config配置都可以能不一样,所以这个时候就需…

.NET Core使用Redis

环境Windows 首先安装Redis 1、下载最新版redis,选择.zip则是免安装的版本 下载地址:https://github.com/MicrosoftArchive/redis/releases 2、解压到指定目录,并运行cmd命令 3、在该文件夹下运行命令:redis-server.exe redis.…

flask使用redis

文章目录 前言一、环境二、使用步骤1.安装redis1.下载2.运行 2.安装并使用redis包1.安装2.使用 运行 前言 有人会有疑问,不是已经连上了mysql数据库了吗,为什么还要用redis数据库?有时候用户访问网页的时候,会产生一些临时性的数据&#xf…

最新版本Redis:Redis 7.0 安装使用,编译安装Redis,Redis使用场景-2022年最新Redis图解安装

最新版本Redis:Redis 7.0 安装使用,编译安装Redis,Redis使用场景。 本章主要目标: 1.Redis介绍 2.下载Redis,编译安装Redis 3.启动Redis使用 4.Redis常用数据类型 5.使用场景介绍 下面开始本章内容的学习 1.Redi…

TP5 使用redis

1.打开tp5官方手册,在缓存下面找到使用多个缓存类型 粘贴以下代码到tp框架config下面的缓存设置下 // 切换到redis操作 Cache::store(redis)->set(name,value);//获取redis Cache::store(redis)->get(rename); //实现redis 消息队列 在 /thinkphp/library/t…

C#使用Redis

Redis是一种key-value型数据库与非持久化数据,用来存于频繁操作的数据,与Sqlserver、Mysql等关系型数据库有着很大的区别,如Redis存储的数据结构不相同,还有Redis数据存于内存中,它也与Mongodb、Azure Cosmos Db、Azure TableStor…

springboot使用redis

springboot使用redis redis-service.exe : 服务端,启动后不要关闭 redis-cli.exe : 客户端,访问redis中的数据 redisclient-win32.x86_64.2.0.jar : redis的图形界面客户端,执行方式是在这个文件的目录执行 java -jar redisclient-win32.x86_64.2.0.jar或者在这个jar包的目录…

springboot集成redis使用注解

redis简介: Redis是当前比较热门的NOSQL系统之一,它是一个开源的使用ANSI c语言编写的key-value存储系统 (区别于MySQL的二维表格的形式存储。)。和Memcache类似,但很大程度补偿了Memcache的不 足。和Memcache一样&am…

Another Redis使用手册

Another Redis DeskTop Manager 跨平台、免费的redis可视化工具,完胜Redis DeskTop Manager。 下载地址:https://github.com/qishibo/AnotherRedisDesktopManager 界面、排版引起极度舒适,只是命令行的入口相对隐蔽,在此截图标出…

Redis使用认证密码登录

Redis默认配置是不需要密码认证的,也就是说只要连接的Redis服务器的host和port正确,就可以连接使用。这在安全性上会有一定的问题,所以需要启用Redis的认证密码,增加Redis服务器的安全性。 1. 修改配置文件 Redis的配置文件默认…

Redis使用密码登录

(1)进入redis客户端安装目录: (2)输入命令:redis-cli.exe -h 主机号 -p 端口号 如:redis-cli.exe -h 127.0.0.1-p 6379 (3)输入密码命令:auth 密码 若显示…

thinkphp5 redis使用

服务器必须要安装redis 我是通过宝塔安装的redis 不过也可以通过命令安装 测试安装成功 进入redis redis-cli 查看密码 config get requirepass 设置密码 config set requirepass “123456” 使用redis有两种方式 第一种是使用php里面的redis扩展(需要对服务器上…

redis使用详解

一.redis简介 redis是开源的BSD许可的高级key/valu存储系统,用于存储String,list,hash,set,zset,常用来提供数据结构服务。 redis与memcached比较 1.redis可以用来做存储storage,memcached只用来…

Redis基本使用!

目录 1.基本概念: 1.Redis的安装和启动 下载 目录结构 3.Redis的命令(重点) Redis数据结构 1.String字符串(重点) 2.Hash哈希(重点) 3.Set集合 4.ZSet集合 通用命令 4.Jedis的基本使用(了解) 相当于JDBC Jedi…

人工智能的几个研究方向

人工智能主要研究内容是:分布式人工智能与多智能主体系统、人工思维模型、知识系统、知识发现与数据挖掘、遗传与演化计算、人工生命、人工智能应用等等。 其中热门研究有以下几种。 一、计算机视觉 就包括图像识别,视频识别,具体应用有人…

学习人工智能可以从事哪些职业,有哪些就业前景和薪资待遇?

学习人工智能可以从事的职业非常广泛,就业前景非常广阔,随着人工智能技术的不断发展和应用,人工智能相关职位的需求将会越来越大。以下是一些主要的职业方向: 学习人工智能可以从事哪些职业,有哪些就业前景和薪资待遇&…

人工智能机器人专业就业前景怎样

在大数据时代,人工智能的相关技术越来越受到关注,人工智能产品的市场话语权也越来越大。因此,许多科技公司已经开始在人工智能领域实施战略布局。人工智能的就业前景如何?让我们来看看吧! 第一:智能化是未来…