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键,会在默认浏览器上打开帮助文档。

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • ora00904::标识符无效_ora-00911 无效字符

    ora00904::标识符无效_ora-00911 无效字符ORA:即Oracle报错。标识符无效:SQL语句中,这个字段名不在表中。解决方案:修改SQL语句中对应的字段或者修改表里面对应的列名。在这里我想说一下,因为我用的是hibernate内部封装好的save方法,咱也不能去改人家的底层方法是不是,所以我在这里用到一个注解(@Column)去指定SQL要执行的字段我第一次用的时候放在了这里↑但是没什么效果,然后我就把这个注解(@Column)放到getset方法上,问题就解决了。我的问题已经解决,也希望能帮到大家。…

    2022年10月24日
  • 部门人员职位权限表设计图_职位设置

    部门人员职位权限表设计图_职位设置用户角色多对多 角色权限多对多用户部门多对多部门表 用户_部门表用户表 用户_角色表角色表  角色_权限表权限表 用户    用户_角色 (角色)    角色_菜单 菜单 — 支付 –退款 –转账 –提现 –充值 交易表账表详细账目表

  • c#线程的使用_线程定义

    c#线程的使用_线程定义Unity3d之截图方法分类: Unity3D2013-11-2817:13 1014人阅读 评论(2) 收藏 举报AnYuanLzhunityunity3d截屏下面是我总结的、在u3d中的,三种截屏方法:1、使用Application类下的CaptureScreenshot方法。[csharp] viewplaincopyvoid CaptureScreen()   {      App

    2022年10月16日
  • Elastic Job 入门详解

    Elastic Job 入门详解Elastic job是当当网架构师张亮,曹昊和江树建基于Zookepper、Quartz开发并开源的一个Java分布式定时任务,解决了Quartz不支持分布式的弊端。Elastic job主要的功能有支持弹性扩容,通过Zookepper集中管理和监控job,支持失效转移等,这些都是Quartz等其他定时任务无法比拟的。

  • 09 idea中 git从远程仓库克隆到本地[通俗易懂]

        从服务端拉取代码                                    

  • ETL开发流程小记(1)[通俗易懂]

    ETL开发流程小记(1)[通俗易懂][原创]ETL开发流程随笔ETL开发ETL工作目标ETL工作目的主要有:ETL工作流程准备工作ETL设计ETL开发ETL测试功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章U…

发表回复

您的电子邮箱地址不会被公开。

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