大家好,又见面了,我是你们的朋友全栈君。
文章目录
-
- 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
决定,消息值的范围由参数wMsgFilterMin
和wMsgFilterMax
给出。如果hWnd
为NULL,则GetMessage
接收属于调用线程的窗口的消息,线程消息由函数PostThreadMessage
寄送给调用线程。GetMessage
不接收属于其他线程或其他线程的窗口的消息,即使hWnd
为NULL。由PostThreadMessage
寄送的线程消息,其消息hWnd
值为NULL。如果wMsgFilterMin
和wMsgFilterMax
都为零,GetMessage
返回所有可得的消息(即,无范围过滤)。
常数 WM_KEYFIRST
和WM_KEYLAST
可作为过滤值取得与键盘输入相关的所有消息:常数WM_MOUSEFIRST
和WM_MOUSELST
可用来接收所有的鼠标消息。如果wMsgFilterMin
和wMsgFilterMax
都为零,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
指向一个含有用GetMessage
或PeekMessage
函数从调用线程的消息队列中取得消息信息的MSG结构的指针。
返回值
如果消息被转换(即,字符消息被送到线程的消息队列中),返回非零值。
如果消息是 WM_KEYDOWN
, WM_KEYUP
, WM_SYSKEYDOWN
, 或 WM_SYSKEYUP
,返回非零值,不考虑转换。
如果消息没有转换(即,字符消息没被送到线程的消息队列中),返回值是零
补充
TranslateMessage
函数不修改由参数lpMsg
指向的消息。
消息WM_KEYDOWN
和WM_KEYUP
组合产生一个WM_CHAR
或WM_DEADCHAR
消息。
消息WM_SYSKEYDOWN
和WM_SYSKEYUP
组合产生一个WM_SYSCHAR
或 WM_SYSDEADCHAR
消息。
tanslateMessage
仅为那些由键盘驱动器映射为ASCII字符的键产生WM_CHAR
消息。
如果应用程序为其它用途而处理虚拟键消息,不应调用TranslateMessage
函数。
例如,如果TranslateAccelerator
函数返回一个非零值,则应用程序将不调用TranslateMessage
函数。
Windows CE:Windows CE不支持扫描码或扩展键标志,因此,它不支持由TranslateMessage
函数产生的WM_CHAR
消息中的lKeyData
参数(lParam
)16-24的取值。
TranslateMessage
函数只能用于转换由GetMessage
或PeekMessage
函数接收到的消息。
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,继续执行后续代码。
- GetMessage的主要功能是从消息队列中“取出”消息,消息被取出以后,就从消息队列中将其删除;而PeekMessage的主要功能是“窥视”消息,如果有消息,就返回true,否则返回false。也可以使用PeekMessage从消息队列中取出消息,这要用到它的一个参数(UINT wRemoveMsg),如果设置为PM_REMOVE,消息则被取出并从消息队列中删除;如果设置为PM_NOREMOVE,消息就不会从消息队列中取出。
- 如果GetMessage从消息队列中取不到消息,则线程就会被操作系统挂起,等到OS重新调度该线程时,两者的性质不同:使用GetMessage线程仍会被挂起,使用PeekMessage线程会得到CPU的控制权,运行一段时间。
- GetMessage每次都会等待消息,直到取到消息才返回;而PeekMessage只是查询消息队列,没有消息就立即返回,从返回值判断是否取到了消息。
我们也可以说,PeekMessage是一个具有线程异步行为的函数,不管消息队列中是否有消息,函数都会立即返回。而GetMessage则是一个具有线程同步行为的函数,如果消息队列中没有消息的话,函数就会一直等待,直到消息队列中至少有一条消息时才返回。
如果消息队列中没有消息,PeekMessage总是能返回,这就相当于在执行一个循环,如果消息队列一直为空, 它就进入了一个死循环。GetMessage则不可能因为消息队列为空而进入死循环。
PeekMesssge
只得到那些与参数hWnd
标识的窗口相联系的消息或被lsChild
确定为其子窗口相联系的消息,并且该消息要在由参数wMsgFiterMin
和wMsgFiherMax
确定的范围内。如果hWnd
为NULL,则PeekMessage
接收属于当前调用线程的窗口的消息(PeekMessage
不接收属于其他线程的窗口的消息)。如果hWnd
为-1,PeekMessage
只返回hWnd
值为NULL的消息,该消息由函数PostThreadMessage
寄送。如果wMsgFilterMin
和wMsgFilterMax
都为零,PeekMessage
返回所有可得的消息(即,无范围过滤)。
常数WM_KEYFIRST
和WM_KEYLAST
可作为过滤值取得所有键盘消息;常数WM_MOUSEFIRST
和WM_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