Peekmessage和Getmessage

Peekmessage和Getmessage

http://blog.csdn.net/rbagglo/archive/2009/05/20/4202622.aspx

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等待到有消息的时候才返回,
区别二:
peekmessage可以根据参数决定是否将消息保留在队列中,
PM_NOREMOVE:该参数指示保留消息
PM_REMOVE:该参数指示移去消息
而getmessage获得消息后回把消息从消息队列中删去

GetMessage(LPMSG lpMsg,  HWND hWnd,   UINT wMsgFilterMin,   UINT wMsgFilterMax)

PeekMessage(LPMSG lpMsg,  HWND hWnd,   UINT wMsgFilterMin,   UINT wMsgFilterMax,UINT wRemoveMsg)

  参数wRemoveMsg的作用是指定消息获取的方式,如果设为PM_NOREMOVE,那么消息将不会从消息队列中被移出,如果设为PM_REMOVE,那么消息将会从消息队列中被移出;

   两个函数主要有以下两个区别:
    1.GetMessage将等到有合适的消息时才返回,而PeekMessage只是撇一下消息队列。
    2.GetMessage会将消息从队列中删除,而PeekMessage可以设置最后一个参数wRemoveMsg来决定是否将消息保留在队列中。

      在Windows的内部,GetMessage和PeekMessage执行着相同的代码。而两者最大的不同之处则体现在没有任何消息返回到应用程序的情况下。在此种情况下,PeekMessage会返回一个空值到应用程序,GetMessage会在此时让应用程序休眠。

你可能感兴趣的:(Peekmessage和Getmessage)