getcomponent_getsocketopt

getcomponent_getsocketoptGetMessage函数功能GetMessage是计算机编程中的一个函数,从调用线程的消息队列里取得一个消息并把其放于指定的结构。GetMessage函数可取得与指定窗口联系的消息和由PostThreadMesssge寄送的线程消息,接收一定范围的消息值,不接收属于其他线程或应用程序的消息。GetMessage获取消息成功后,线程把从消息队列中删除该消息,函数会一直等待直到有消息到来才有返回值。函数声明WINUSERAPIBOOLWINAPIGetMessage(_Out_LPMS

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

GetMessage

函数功能

GetMessage是计算机编程中的一个函数,从调用线程的消息队列里取得一个消息并把其放于指定的结构。GetMessage函数可取得与指定窗口联系的消息和由PostThreadMesssge寄送的线程消息,接收一定范围的消息值,不接收属于其他线程或应用程序的消息。GetMessage获取消息成功后,线程把从消息队列中删除该消息,函数会一直等待直到有消息到来才有返回值。

函数声明

WINUSERAPI
BOOL
WINAPI
GetMessage(
    _Out_ LPMSG lpMsg,
    _In_opt_ HWND hWnd,
    _In_ UINT wMsgFilterMin,
    _In_ UINT wMsgFilterMax);

第一个参数

输出参数,指向MSG结构的指针,该结构从线程的消息队列里接收消息信息。

第二个参数

输入参数,取得其消息的窗口的句柄。当其值取NULL时,GetMessage为任何属于调用线程的窗口检索消息,线程消息通过PostThreadMessage寄送给调用线程。

第三个参数

输入参数,指定被检索的最小消息值的整数

第四个参数

输入参数,指定被检索的最大消息值的整数。

返回值

如果函数取得WM_QUIT之外的其他消息,返回非零值。如果函数取得WM_QUIT消息,返回值是零。如果出现了错误,返回值是-1。例如,当hWnd是无效的窗口句柄或lpMsg是无效的指针时。若想获得更多的错误信息,请调用GetLastError函数

补充:

应用程序通常用返回值来确定是否终止主消息循环并退出程序。

GetMesssge只接收与参数hWnd标识的窗口或子窗口相联系的消息,子窗口由函数IsChild决定,消息值的范围由参数wMsgFilterMinwMsgFilterMax给出。如果hWnd为NULL,则GetMessage接收属于调用线程的窗口的消息,线程消息由函数PostThreadMessage寄送给调用线程。GetMessage不接收属于其他线程或其他线程的窗口的消息,即使hWnd为NULL。由PostThreadMessage寄送的线程消息,其消息hWnd值为NULL。如果wMsgFilterMinwMsgFilterMax都为零,GetMessage返回所有可得的消息(即,无范围过滤)。

常数 WM_KEYFIRSTWM_KEYLAST可作为过滤值取得与键盘输入相关的所有消息:常数WM_MOUSEFIRSTWM_MOUSELST可用来接收所有的鼠标消息。如果wMsgFilterMinwMsgFilterMax都为零,GetMessage返回所有可得的消息(即,无范围过滤)。

GetMessage不从队列里清除WM.PAINT消息。该消息将保留在队列里直到处理完毕。

注意,此函数的返回值可非零、零或-1,应避免如下代码出现:

while(GetMessage(IpMsg,hwnd,00))…

-1返回值的可能性表示这样的代码会导致致命的应用程序错误。

速查:Windows NT: 3.1及以上版本;Windows:95及以上版本;Windows CE:1.0及以上版本:头文件:winuser.h;输入库:user32.Iib;Unicode:在Windows NT环境下以Unicode和ANSI方式实现。

TranslateMessage

函数功能

将虚拟键消息转换为字符消息。字符消息被送到调用线程的消息队列中,在下一次线程调用函数GetMessage或PeekMessage时被读出。

函数声明

WINUSERAPI
BOOL
WINAPI
TranslateMessage(
    _In_ CONST MSG *lpMsg);

第一个参数:

lpMsg指向一个含有用GetMessagePeekMessage函数从调用线程的消息队列中取得消息信息的MSG结构的指针。

返回值

如果消息被转换(即,字符消息被送到线程的消息队列中),返回非零值。
如果消息是 WM_KEYDOWN, WM_KEYUP, WM_SYSKEYDOWN, 或 WM_SYSKEYUP,返回非零值,不考虑转换。
如果消息没有转换(即,字符消息没被送到线程的消息队列中),返回值是零

补充

TranslateMessage函数不修改由参数lpMsg指向的消息。

消息WM_KEYDOWNWM_KEYUP组合产生一个WM_CHARWM_DEADCHAR消息。
消息WM_SYSKEYDOWNWM_SYSKEYUP组合产生一个WM_SYSCHARWM_SYSDEADCHAR 消息。

tanslateMessage仅为那些由键盘驱动器映射为ASCII字符的键产生WM_CHAR消息。

如果应用程序为其它用途而处理虚拟键消息,不应调用TranslateMessage函数。
例如,如果TranslateAccelerator函数返回一个非零值,则应用程序将不调用TranslateMessage函数。

Windows CE:Windows CE不支持扫描码或扩展键标志,因此,它不支持由TranslateMessage函数产生的WM_CHAR消息中的lKeyData参数(lParam)16-24的取值。

TranslateMessage函数只能用于转换由GetMessagePeekMessage函数接收到的消息。

DispatchMessage

函数功能

该函数调度一个消息给窗口程序。通常调度从GetMessage取得的消息。消息被调度到的窗口程序即是MainProc()函数。

函数声明:

WINUSERAPI
LRESULT
WINAPI
DispatchMessageW(
    _In_ CONST MSG *lpMsg);

第一个参数:

lpmsg:指向含有消息的MSG结构的指针。

返回值:

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

补充

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

速查:Windows NT:3.1及以上版本;Windows:95及以上版本;Windows CE:1.0及以上版本;头文件:winuser.h;输入库:user32.lib;Unicode:在Windows NT环境下以Unicode和ANSI方式实现。

总结:TranslateMessage函数将键盘消息转化,DispatchMessage函数将消息传给窗体函数去处理.

代码实现

BOOLbRet;

 

while((bRet=GetMessage(&msg,hWnd,0,0))!=0)

{ 
   

if(bRet==-1)

{ 
   

//handletheerrorandpossiblyexit

}

else

{ 
   

TranslateMessage(&msg);

DispatchMessage(&msg);

}

}

PeekMessage

函数功能

PeekMessage是一个Windows API函数。该函数为一个消息检查线程消息队列,并将该消息(如果存在)放于指定的结构。

函数声明

WINUSERAPI
BOOL
WINAPI
PeekMessageW(
    _Out_ LPMSG lpMsg,
    _In_opt_ HWND hWnd,
    _In_ UINT wMsgFilterMin,
    _In_ UINT wMsgFilterMax,
    _In_ UINT wRemoveMsg);

第一个参数

lpMsg接收消息信息的MSG结构指针。

第二个参数

hWnd其消息被检查的窗口句柄。

第三个参数

wMsgFilterMin指定被检查的消息范围里的第一个消息。

第四个参数

wMsgFilterMax指定被检查的消息范围里的最后一个消息。

第五个参数

wRemoveMsg确定消息如何被处理。此参数可取下列值之一:

意义
PM_NOREMOVE PeekMessage处理后,消息不从队列里除掉。
PM_REMOVE PeekMessage处理后,消息从队列里除掉。
PM_NOYIELD 此标志使系统不释放等待调用程序空闲的线程。可将PM_NOYIELD随意组合到PM_NOREMOVE或PM_REMOVE

缺省地,处理所有类型的消息。若只处理某些消息,指定一个或多个下列值:

意义
PM_QS_INPUT Windows NT 5.0和Windows 98:处理鼠标和键盘消息。
PM_QS_PAINT Windows NT 5.0和Windows 98:处理画图消息。
PM_QS_POSTMESSAGE Windows NT 5.0和Windows 98:处理所有被寄送的消息,包括计时器和热键
PM_QS_SENDMESSAGE Windows NT 5.0和Windows 98:处理所有发送消息。

返回值

如果消息可得到,返回非零值;如果没有消息可得到,返回值是零。

区别补充:

和函数PeekMesssge不一样的是,GetMessage:从系统获取消息,将消息从系统中移除,属于阻塞函数。当系统无消息时,GetMessage会等待下一条消息。而函数PeekMesssge是以查看的方式从系统中获取消息,可以不将消息从系统中移除,是非阻塞函数;当系统无消息时,返回FALSE,继续执行后续代码。

  1. GetMessage的主要功能是从消息队列中“取出”消息,消息被取出以后,就从消息队列中将其删除;而PeekMessage的主要功能是“窥视”消息,如果有消息,就返回true,否则返回false。也可以使用PeekMessage从消息队列中取出消息,这要用到它的一个参数(UINT wRemoveMsg),如果设置为PM_REMOVE,消息则被取出并从消息队列中删除;如果设置为PM_NOREMOVE,消息就不会从消息队列中取出。
  2. 如果GetMessage从消息队列中取不到消息,则线程就会被操作系统挂起,等到OS重新调度该线程时,两者的性质不同:使用GetMessage线程仍会被挂起,使用PeekMessage线程会得到CPU的控制权,运行一段时间。
  3. GetMessage每次都会等待消息,直到取到消息才返回;而PeekMessage只是查询消息队列,没有消息就立即返回,从返回值判断是否取到了消息。

我们也可以说,PeekMessage是一个具有线程异步行为的函数,不管消息队列中是否有消息,函数都会立即返回。而GetMessage则是一个具有线程同步行为的函数,如果消息队列中没有消息的话,函数就会一直等待,直到消息队列中至少有一条消息时才返回。

如果消息队列中没有消息,PeekMessage总是能返回,这就相当于在执行一个循环,如果消息队列一直为空, 它就进入了一个死循环。GetMessage则不可能因为消息队列为空而进入死循环。

PeekMesssge只得到那些与参数hWnd标识的窗口相联系的消息或被lsChild确定为其子窗口相联系的消息,并且该消息要在由参数wMsgFiterMinwMsgFiherMax确定的范围内。如果hWnd为NULL,则PeekMessage接收属于当前调用线程的窗口的消息(PeekMessage不接收属于其他线程的窗口的消息)。如果hWnd为-1,PeekMessage只返回hWnd值为NULL的消息,该消息由函数PostThreadMessage寄送。如果wMsgFilterMinwMsgFilterMax都为零,PeekMessage返回所有可得的消息(即,无范围过滤)。

常数WM_KEYFIRSTWM_KEYLAST可作为过滤值取得所有键盘消息;常数WM_MOUSEFIRSTWM_MOUSELAST可用来接收所有的鼠标消息。

PeekMessage通常不从队列里清除WM_PAINT消息。该消息将保留在队列里直到处理完毕。但如果WM_PAINT消息不指向无效区,PeekMessage将能够从队列里清除WM_PAINT消息。

Windows CE:具备无效区的WM_PAINT消息不从队列里清除。

插入一个提示(vs如何打开MSDN帮助文档)

比如要查看float的特征。
在vs中输入float,然后按F1键,会在默认浏览器上打开帮助文档。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/194309.html原文链接:https://javaforall.net

(0)
上一篇 2025年11月8日 下午1:22
下一篇 2025年11月8日 下午2:01


相关推荐

  • seekg ()[通俗易懂]

    seekg ()[通俗易懂] seekg语法:istream&seekg(off_typeoffset,ios::seekdirorigin);istream&seekg(pos_typeposition);函数seekg()用于输入流,并且它将重新设置”get”指针到当前流的从origin偏移offset个字节的位置上,或是置”get”指针在position位

    2022年6月10日
    41
  • xray漏洞扫描器

    xray漏洞扫描器文章目录一、xray下载二、xray安装、使用一、xray下载xray是一款功能强大的安全评估工具,由多名经验丰富的一线安全从业者呕心打造而成,主要特性有:1、检测速度快。发包速度快;漏洞检测算法高效。2、支持范围广。大至OWASPTop10通用漏洞检测,小至各种CMS框架POC,均可以支持。3、代码质量高。编写代码的人员素质高,通过CodeReview、单元测试、集成测试等多层验证来提高代码可靠性。4、高级可定制。通过配置文件暴露了引擎的各种参数,通过修改配置文件可

    2022年5月7日
    90
  • 基数排序、桶排序和计数排序的区别

    基数排序、桶排序和计数排序的区别1 桶排序 BucketSort 基本思路是 将待排序元素划分到不同的痛 先扫描一遍序列求出最大值 maxV 和最小值 minV 设桶的个数为 k 则把区间 minV maxV 均匀划分成 k 个区间 每个区间就是一个桶 将序列中的元素分配到各自的桶 对每个桶内的元素进行排序 可以选择任意一种排序算法 将各个桶中的元素合并成一个大的有序序列 假设数据是均匀分

    2026年3月3日
    2
  • 指纹识别算法c++实现

    指纹识别算法c++实现指纹算法需求指纹特征值生成 比对 API 库需求 可输出指纹图像 图像格式为 bmp 小于等于 500DPI 不大于 50K 可输出指纹模板 生成模板需要至少采集几次指纹需说明 建议不超过三次 模板大小不超过 1K 模板生成时间不大于 1 秒 可输出指纹特征值 可以是非字符串格式 特征值大小不超过 512B 可输出指纹特征值字符串 字符串为可见字符 长度不超 1024 指纹比对时 支持输入指纹特征值字符串比对 指纹比对时 支

    2026年3月16日
    2
  • 阿里云国外服务器购买_阿里云购买服务器流程

    阿里云国外服务器购买_阿里云购买服务器流程目录前言购买实际全过程1、选择服务器基础配置2、网络和安全组3、系统配置(选填)4、分组设置(选填)5、确认订单6、付钱完,前往控制台控制台基本操作1、获取服务器公网IP2、登录服务器3、正常使用,放行端口前言阿里云官网:https://www.aliyun.com云服务器ECS购买链接:https://ecs-buy.aliyun.com/wizard#/prepay/ap-northeast-1共享型可用,最低日本服30.2/月(不含带宽)1Mbps要55.2元流量付费0.6元/

    2026年4月14日
    6
  • typora文章同步(跨平台)

    typora文章同步(跨平台)typora实现备份个人博客一、图片上传PicGo有提供默认的图床,可以直接使用,但是有上传的限制,有特定要求的可以自己配置github图床。1.配置github图床利用github搭建图床2.安装PicGo下载链接windows选择exe结尾文件即可mac选择dmg为后缀的文件安装的时候一路next即可。3.在picGo中配置使用github图床4.picGo设置开启时间戳重名防止图片上传出错ps:我当时一直传输失败,修改代理,重新生成厂库,toke

    2022年5月19日
    135

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号