当消息队列中存在消息时, PeekMessage就返回TRUE, 最后一个参数可以为:表示是否在接收到消息的时候从消息队列中删除它们。
PM_REMOVE
PM_NOREMOVE
与GetMessage的不同:
PeekMessage只要有消息的时候, 这相依返回TRUE, 即使消息是WM_QUIT, 没有消息的时候, 它不会等待,而是立即返回,并返回FALSE。而GetMessage则是从消息队列中取出消息并删除它们, 当消息队列是空的时候,它会一直等待,直到队列中存在消息, 当收到WM_QUIT消息时, 它返回FALSE, 这是GetMessage惟一返回FALSE的情况, 其它都会返回TRUE, 代表一直等待或处理消息。
不管是PeekMessage还是GetMessage, 它们都不会删除WM_PAINT消息, 绝不会!!!从队列中删除WM_PAINT消息的情况是当显示区域重新变得有效的时候, 用ValidateRect和ValidateRgn或者BeginPaint和EndPaint来完成。
Peekmessage和Getmessage都是向系统的消息队列中取得消息,不过性质不同。
若第一次向消息队列中取不到消息,则程序的主线程会被OS(操作系统)挂起;等到OS重新调度到该线程时,而且消息队列仍然是空的时,两者的性质不同:
若使用Getmessage(),则程序的主线程会仍被OS挂起。
若是用Peekmessage(),则程序会取得OS控制权,运行一段时间。此函数多用于处理系统的空闲时间。
getmessage and peekmessage are both get the message from send_message queue.
getmessage supports 同步机制。PEEKMESSAGE SUPPORTS 异步机制。
从原因上而言:GetMessage函数从消息队列中得到消息后并在队列中删除该消息
PeekMessage函数从消息队列中得到消息后并不在队列中删除该消息
从结果上而言:GetMessage等待一个消息(就像_getch),直到拿到消息才返回
PeekMessage不是这样(就像_kbhit),查询消息队列,有就取,即使没有也立即返回。
为了实现windows的多任务,要用getmessage,因为当getmessage发现自己的消息队列里没有消息时,就会把控制权交还给系统,这样就可以让避免资源的浪费。
GetMessage函数每次调用是肯定会取回一个消息的,当消息队列为空的时候此进程会被挂起直到消息队列中有消息可取为止。
PeekMessage函数不管消息队列中是否有消息都会立即返回,返回是可以从返回的值里判断是否取到了消息,准确地说此函数是询问了一下消息队列,至于取回消息后是否从消息队列中删除此消息,由参数可以指定。Windows3.1时很多应用程序的消息队列是由GetMessage函数构成的,而Win32以后大多数的应用程序的消息队列是由 PeekMessage函数构成的,vc和bcb好像都是这样的,基于Win32的抢先式多任务处理机制,采用PeekMessage函数构成的消息循环也不会对系统造成什么威胁。
PeekMessage 与 GetMessage
最新推荐文章于 2023-07-17 21:48:14 发布