while(GetMessage(&msg,NULL,0,0))//从消息队列中取消息
{
TranslateMessage (&msg); //转换消息
DispatchMessage (&msg); //派发消息
}
对于以上结构,写过windows程序的都应该熟悉,其中Dispatch函数负责转发消息,那么如果就dispatch这句话注释掉,是不是windows窗口就收不到消息了,非也,经研究发现,对于一般的鼠标键盘操作,注释掉dispatch是可以屏蔽消息的,但是有些消息是操作系统是直接调用窗口过程的,所以他可以绕过消息循环。
一下是经过测试可以绕过派发消息直接调用窗口过程的消息,但是可能还不止这些吧。
#define WM_ACTIVATE 0x0006
#define WM_SETFOCUS 0x0007
#define WM_KILLFOCUS 0x0008
#define WM_ERASEBKGND 0x0014
#define WM_ACTIVATEAPP 0x001C
#define WM_WINDOWPOSCHANGING 0x0046
#define WM_WINDOWPOSCHANGED 0x0047
#define WM_NCHITTEST 0x0084
#define WM_NCPAINT 0x0085
#define WM_NCACTIVATE 0x0086
#if(WINVER >= 0x0400)
#define WM_IME_SETCONTEXT 0x0281
#define WM_IME_NOTIFY 0x0282
原来windows消息分为队列消息,凡是队列消息都需要用消息循环派发,队列消息使用postmessage,而sendmessage是直接发送消息给窗口过程处理的。