区别一: peekmessage不管消息队列里有没有消息都会马上返回,有消息返回消息,没消息返回空值, getmessage等待到有消息的时候才返回, 区别二: peekmessage可以根据参数决定是否将消息保留在队列中, PM_NOREMOVE:该参数指示保留消息 PM_REMOVE:该参数指示移去消息而getmessage获得消息后回把消息从消息队列中删去 例程: // GetMessage Damo int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR szCmdLine, int iCmdShow) { MSG msg ; while(GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return TRUE ; } // PeekMessage() Damo int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR szCmdLine, int iCmdShow) { MSG msg ; while (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE)) { TranslateMessage (&msg) ; DispatchMessage (&msg) ; } return TRUE ; }
WH_GETMESSAGE钩子
在GetMessage和PeekMessage将一个消息返回到调用的应用程序之前,会做一个验证是否存在一个WH_GETMESSAGE钩子的测试。如果有一个已经被安装了,那这个钩子会被调用。如果PeekMessage没有发现可用的消息并返回一个空值时,这个钩子将不会被调用。在钩子处理过程中,你不可能得知是到底是GetMessage被调用还是PeekMessage被调用