前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >getcomponent_getsocketopt

getcomponent_getsocketopt

作者头像
全栈程序员站长
发布2022-09-30 10:26:44
3800
发布2022-09-30 10:26:44
举报

大家好,又见面了,我是你们的朋友全栈君。

文章目录

GetMessage

函数功能

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

函数声明

代码语言:javascript
复制
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,应避免如下代码出现:

代码语言:javascript
复制
while(GetMessage(IpMsg,hwnd,0,0))…

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

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

TranslateMessage

函数功能

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

函数声明

代码语言:javascript
复制
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()函数。

函数声明:

代码语言:javascript
复制
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函数将消息传给窗体函数去处理.

代码实现

代码语言:javascript
复制
BOOLbRet;

 

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

{ 
   

if(bRet==-1)

{ 
   

//handletheerrorandpossiblyexit

}

else

{ 
   

TranslateMessage(&msg);

DispatchMessage(&msg);

}

}

PeekMessage

函数功能

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

函数声明

代码语言:javascript
复制
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.cn/194309.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022年9月13日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • GetMessage
  • 函数功能
  • 函数声明
  • 第一个参数
  • 第二个参数
  • 第三个参数
  • 第四个参数
  • 返回值
  • 补充:
  • TranslateMessage
  • 函数功能
  • 函数声明
  • 第一个参数:
  • 返回值
  • 补充
  • DispatchMessage
  • 函数功能
  • 函数声明:
  • 第一个参数:
  • 返回值:
  • 补充
  • 代码实现
  • PeekMessage
  • 函数功能
  • 函数声明
  • 第一个参数
  • 第二个参数
  • 第三个参数
  • 第四个参数
  • 第五个参数
  • 返回值
  • 区别补充:
  • 插入一个提示(vs如何打开MSDN帮助文档)
相关产品与服务
消息队列 CMQ 版
消息队列 CMQ 版(TDMQ for CMQ,简称 TDMQ CMQ 版)是一款分布式高可用的消息队列服务,它能够提供可靠的,基于消息的异步通信机制,能够将分布式部署的不同应用(或同一应用的不同组件)中的信息传递,存储在可靠有效的 CMQ 队列中,防止消息丢失。TDMQ CMQ 版支持多进程同时读写,收发互不干扰,无需各应用或组件始终处于运行状态。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档