getcomponent_getsocketopt

2022-09-30 10:26:44 浏览数 (1)

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

文章目录

    • GetMessage
    • 函数功能
    • 函数声明
    • 第一个参数
    • 第二个参数
    • 第三个参数
    • 第四个参数
    • 返回值
    • 补充:
    • TranslateMessage
    • 函数功能
    • 函数声明
    • 第一个参数:
    • 返回值
    • 补充
    • DispatchMessage
    • 函数功能
    • 函数声明:
    • 第一个参数:
    • 返回值:
    • 补充
    • 代码实现
    • PeekMessage
    • 函数功能
    • 函数声明
    • 第一个参数
    • 第二个参数
    • 第三个参数
    • 第四个参数
    • 第五个参数
    • 返回值
    • 区别补充:
    • 插入一个提示(vs如何打开MSDN帮助文档)

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

0 人点赞