1.将消息投递到一个先进先出队列中
2.直接把消息发给窗口过程
投递到队列中的消息主要有:
键盘和鼠标消息MSG_LBUTTONDOWN,MSG_MOUSEMOVE,MSG_KEYDOWN,MSG_CHAR
定时器消息MSG_TIMER
绘制消息MSG_PAINT
退出消息MSG_QUIT
可以用HavePendingMessage函数检查消息队列中是否有消息而不取出的消息
BOOL GUIAPI HavePendingMessage(HWND hMainWnd);
直接发送到窗口过程的消息一般用于通知窗口完成一些需要立即处理的事件,如MSG_ERASEBKGND消息
消息的处理
一般通过一个消息循环来处理消息队列中的消息
GetMessage从消息队列中取出消息
TranslateMessage翻译消息
DispatchMessage发送消息
MSG msg;
HWND hMainWnd;
MAINWINCREATE CreateInfo;
InitCreateInfo(&CreateInfo);
hMainWnd=CreateMainWindow(&CreateInfo);
if(hMainWnd==HWND_INVALID)
return -1;
while(GetMessage(&msg,hMainWnd))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
在Thread中当要求等待消息立即返回以处理其他事务时可以使用HavePendingMessage
do
{
ReadMasterPty(pConInfo);
if(pConInfo->terminate)
break;
while(HavePendingMessage(hMainWnd))
{
if(!GetMessage(&msg,hMainWnd))
break;
DispatchMessage(&msg);
}
}while(true);
窗口过程是一个特定类型的函数,用于接收和处理所有发送到该窗口的消息
每个控件类也有一个窗口过程,属于同一控件类的所有控件共用同一个窗口过程处理消息
如果窗口过程不处理某些消息一般把该消息传给系统进行默认处理
int DefaultMainWinProc(HWND hwnd,int message,WPARAM wParam,LPARAM lParam);
对话框缺省消息处理函数
int DefaultDialogProc(HWND hwnd,int message,WPARAM wParam,LPARAM lParam);
控件窗口缺省消息处理函数
int DefaultControlProc(HWND hwnd,int message,WPARAM wParam,LPARAM lParam);
投递:把一条消息复制到消息队列中
发送: 直接把消息发送到窗口过程函数
消息处理函数:
PostMessage:将消息放到消息队列后立即返回,用于发送非关键性消息,受消息缓冲区限制
SendMessage:将消息发送到窗口过程,等待处理完后返回
SendNotifyMessage:同PostMessage,采用链表处理,不受缓冲区限制,一般用于从控件向父窗口发送“通知消息”
PostQuitMessage:将MSG_QUIT消息投递到消息队列中
将指定消息广播给桌面的所有主窗口:
int GUIAPI BroadcastMessage(int iMsg,WPARAM wParam,LPARAM lParam);
丢弃消息队列中所有消息并返回个数
int GUIAPI ThrowAwayMessages(HWND pMainWnd);
等待一有消息就返回
BOOL GUIAPI WaitMessage(PMSG pMsg,HWND hMainWnd);