主循环一般如此写:
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
首先在这个主循环之间,main函数已经对当前窗口类定制了其对应的消息处理函数WndProc 。
这个消息循环中的第一个函数 GetMessage(),从窗口消息队列头获得下一条消息,直到GetMessage()返回0。
BOOL GetMessage(
LPMSG lpMsg, // 检索到的消息
HWND hWnd, // 窗口指向
UINT wMsgFilterMin, // 消息范围的下界限参数
UINT wMsgFilterMax // 上界限参数
);
第一个参数一般设置为 &msg,而其他的参数没太大作用,一般设置为NULL或0.这里的参数msg是Windows用于放置文本消息的储存空间,是一个复杂的数据结构MSG,而不是之前的一个消息ID:
typedef struct tagMSG {
HWND hwnd; // 窗口句柄
UINT message; // 消息ID
WPARAM wParam; //详细信息
LPARAM lParam;//详细信息
DWORD time;//事件发生时间
POINT pt;//鼠标位置
#ifdef _MAC
DWORD lPrivate;
#endif
} MSG
当一个程序中有一定的快捷键时,当按下快捷键时,调用TranslateAccelerator函数,将本身的按键消息跟快捷键表中定义的按键进行比较,如果发现快捷键,就将这个按键消息转换为快捷键表中定义的消息。
接下来调用TranslateMessage()函数,这个函数是一个虚拟加速键转换器,进行消息的翻译。
最后调用 DispatchMessage()函数发送消息,这个函数中调用WinProc,并根据之前的MSG来发送给WinProc函数适当的参数。