打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Windows消息机制的理解

一.    消息的概念

  当用户单击鼠标、改变窗口大小或者按下键盘上的一个键等用户动作时,会触发点击,按键等事件,而windows系统把这些事件转化为特定的消息,并放置在应用程序的消息列队中(windows为当前运行的每一个windows程序维护了一个消息列队)等待应用程序的处理,而应用程序不断从消息列队中取出消息,并进行响应。所以说windows是基于消息的事件驱动模式。

二.    消息如何被处理?(窗口过程)

  按照一般写程序的思维而言,我们希望传给函数正确的参数来调用这个函数。而windows消息可以理解为指定了的函数的参数,例如:用户需要关闭某个窗口,点击了右上角的X后,windows便把这个行为转换为消息加入消息列队,而这个消息可能包含了“需要关闭的是哪一个窗口(窗口句柄)”,“关闭窗口的信息”这样的参数,应用程序从消息列队中读取到了这个消息,并把它交给“关闭窗口”这个函数来进行处理,而这个函数就叫做“窗口过程”,这样听起来不好理解,可以加长的理解为“处理窗口消息的函数过程”。

     而如果没有对应的函数来处理这个消息呢?例如,拖动窗口。为此,windows会用默认的消息处理函数(DefWindowProc)来进行处理.

三.    消息的组成

 消息结构体长这样

   typedef struct tagMSG {        HWND   hwnd;   //消息句柄,理解为窗口的唯一标志    UINT   message;    //消息类型,分为windows消息和用户自己定义的消息    WPARAM wParam;    //消息附加参数    LPARAM lParam;    //消息附加参数    DWORD  time;    //消息产生时间爱你    POINT  pt;    //消息被发送时的光标位置  } MSG;

四.    消息发送的方式

1.    投递消息PostMessage

 异步执行,发送到消息列队后立即返回无序等待。

应用程序一般是投递一个消息来通知指定窗口完成某个任务

BOOL PostMessage(    HWND        hWnd,      //目标窗口句柄    UINT          Msg,       //消息类型    WPARAM     wParam,     //第一个消息参数    LPARAM      lParam      //第二个消息参数);

2.    发送消息 SendMessage

 同步执行,需要等到消息的返回码之后在继续。

基本上所有的输入类消息,都是以投递的方式抵达应用的,而其他的消息,则大部分是采取了发送方式。

LRESULT SendMessage(  HWND hWnd,          //接收消息的目标窗口  UINT Msg,            //消息类型  WPARAM wParam,    //第一个消息参数  LPARAM lParam      //第二个消息参数);

五.    消息循环实例

while(GetMessage (&msg, NULL, 0, 0)) //消息循环,不断从消息列队取出消息

{

TranslateMessage (&msg) ; //翻译键盘消息

DispatchMessage (&msg) ; //把消息发送给窗口过程

}

//消息过程是一个CALLBACK回调函数,每处理一个消息会返回一个值给windows

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)  

{  

   HDC         hdc;  

   PAINTSTRUCT ps;  

   RECT        rect;  

   switch (message)  

   {  

   case WM_CREATE:  

       PlaySound(TEXT('hello.wav'), NULL, SND_FILENAME | SND_ASYNC);  //窗口创建的时候播放音乐

       return 0;  

   case WM_DESTROY:  

       PostQuitMessage(0);  //把退出窗口的消息插入消息列队

       return 0;  

   }  

   return DefWindowProc(hwnd, message, wParam, lParam);  //默认的消息处理函数

}

   

             

本文转自:简书

微信号:IdeaofSE


本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
LRESULT CALLBACK WndProc
Windows消息机制 vc
PostMessage和SendMessage,SendMessageTimeout区别
windows.h和windowsx.h区别
day01
PostMessage(异步)和SendMessage(同步)的区别
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服