typedef struct tagMSG
{
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
}MSG,*PMSG;
注意:WORD是一个16位的整数,DWORD是一个32位的整数。
WindowsAPI GetMessage(
LPMSG lpMsg, //message information
HWND hWnd, //handle to window 指定获取哪个窗口的消息 设置为NULL 则是获取属于这个线程的所有窗口的消息
UINT wMsgFilterMin, //first message 比如WM_MOSEFIRST、WM_KEYFIRST
UINT wMsgFilterMax //last message 比如WM_MOSELAST、WM_KEYLAST
);
总结:这个获取消息的函数可以获取指定接受某窗口某一段消息号的消息,即做消息范围过滤,也可以指定接受所有的某窗口的消息。
代码应用:
MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg); //转换消息 对取到的消息对儿进行转换比如说按下鼠标按键实际是一个WM_KETDOWN和WM_KEYUP消息转换为一个WM_CHAR消息放到消息队列中
DispatchMessage(&msg); //将消息路由给操作系统,操作系统调用窗口过程函数(回调函数)进行处理。
}
领悟:windows程序消息循环的机制
当一个应用程序建立的时候,操作系统会为该应用程序分配一个消息队列,凡是跟该程序相关的消息,操作系统都会把消息放到这个消息队列中,应用程序利用GetMessage从消息队列中取出一条具体的消息,利用TranslateMessage将WM_KEYDOWN和WM_KEYUP转换成一个WM_CHAR消息放到消息队列中。利用DispatchMessage将该消息投递出去,分发出去,分发给操作系统,操作系统利用设计窗口类时候指定的过程函数处理该消息。
注意:键盘按下一个按键的时候,无论按下的是哪个按键,触发的都是WM_CHAR消息,而具体时间按下的哪个字符则是通过消息的附加参数WPARAM得知的。