消息MSG、 获取消息GetMessage、消息过滤、第一个鼠标、键盘消息等

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得知的。




你可能感兴趣的:(C++/MFC)