问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

理解windows消息机制

发布网友 发布时间:2022-04-25 15:44

我来回答

1个回答

热心网友 时间:2023-10-14 03:55

  消息机制是Windows应用程序的核心。在Windows中发生的一切都可以用消息来表示,消息用于告诉操作系统发生了什么,所有的Windows应用程序都是消息驱动的,
  在Windows中,不同的消息由应用程序的不同部分进行处理。MFC库将很多底层的消息都屏蔽了,使用户更加方便、简易地处理消息。例如,用户接收到诸如移动鼠标键(WM_MOUSEMOVE)消息或单击鼠标键(WM_LRBUTTONDOWN)消息时不必处理窗口和鼠标的重画工作,MFC及应用程序框架会替用户做这些工作。在使用MFC进行编程时,用户只需处理一些高层的消息,例如,“用户在单击窗口中的OK按扭”,“用户现在选中了下拉列表框中的第五项”等等,这样就大大减轻了程序员的负担。
  一个消息是由消息的名称(UINT)和两个参数(WPARAM, LPARAM)组成。消息的参数中包含有重要的信息。例如对鼠标消息而言,LPARAM中一般包含鼠标的位置信息,而WPARAM参数中包含了发生该消息时,SHIFT、CTRL等键的状态信息,对于不同的消息类型来说,两个参数也都相应地具有明确意义。
  消息与输入焦点
  Windows是一个以消息为导向的系统,应用程序只能被动地等待用户按键的消息,不能主动地去读键盘的状态,也就是说,每当键盘上有个键被按下,系统就会发出一个按键消息给窗口,告诉它某个键被按下去了,只要鼠标移动一下,系统也会发出相应的消息,并把鼠标的坐标信息传给窗口。
  Windows可以同时执行许多程序,但键盘只有一个,怎么判断由哪个窗口接收键盘及鼠标的消息呢?采用“输入焦点”(inpuut focus)技术可以解决这个问题。只要某个窗口取得输入焦点,它不但会被提升到屏幕的最前面,颜色也会有所不同,所有的键盘消息就会导向该窗口,该窗口也成为“活动窗口”。
  窗口如何取得输入焦点?通常被鼠标单击的窗口会得到输入焦点,除此之外,程序本身也可以利用SetFocus()来指定哪个窗口拥有输入焦点。
  CWnd* CWnd::SetFocus();
  如果调用某窗口的SetFocus()成员函数,该窗口就可以取得输入焦点,该函数返回前一个拥有输入焦点的窗口。
  如果某个窗口的输入焦点被抢走,Windows系统就会发出WM_KILLFOCUS消息给这个失去输入焦点的窗口,同时还会告诉该窗口下一个取得输入焦点的窗口的指针。而获得输入焦点的窗口则会收到WM_SETFOCUS消息。
  消息响应函数分别为:
  afx_msg void OnKillFocus(CWnd* pNewWnd);
  其中的参数为得到输入焦点的窗口的指针。
  Afx_msg void OnSetFocus(CWnd* pOldWnd);
  其中的参数为失去输入焦点的窗口的指针。
  消息的分类
  Windows系统预定义了许多消息,每个消息都拥有一个宏定义,即用形象的字符串来标识消息,一系列#define 语句将消息与特定数值联系起来,可以在头文件WinUser.h中找到这些宏定义,例如
  #define WM_PAINT 120
  可以在程序中通过消息名“WM_PAINT”来访问它。其他消息如:
  #define WM_MOUSEMOVE 0x0200
  #define WM_LBUTTONDOWN 0x0201
  #define WM_LBUTTONUP 0x0202
  #define WM_LBUTTONDBLCLK 0x0203
  #define WM_RBUTTONDOWN 0x0204
  #define WM_RBUTTONUP 0x0205
  #define WM_RBUTTONDBLCLK 0x0206
  #define WM_MBUTTONDOWN 0x0207
  #define WM_MBUTTONUP 0x0208
  #define WM_MBUTTONDBLCLK 0x0209
  系统定义的消息有不同的前缀,不同的前缀有不同的含义。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
苹果电脑电池充不进电苹果电脑充不进去电是怎么回事 苹果电脑不充电没反应苹果电脑充电指示灯不亮充不了电怎么办 狗狗更加忠诚护家、善解人意,养一只宠物陪伴自己,泰迪能长多大... 描写泰迪狗的外形和特点的句子 国外留学有用吗 花钱出国留学有用吗 !这叫什么号 百万医疗赔付后是否可以续保 前一年理赔过医疗险还能续保吗? 医疗住院险理赔后还能购买吗? 电脑是Windows10系统的,突然间在右下角出现键盘鼠标文字提醒,应该如何关闭? WINDOWS系统并不是在鼠标每移动一个像素时都产生MOUSEMOVE消息,为什么? windows 7怎么设置鼠标指向文件提示信息 win10 鼠标设置消息 w8系统,宽带显示已连接,显示正在识别网络,上不去网怎么办? win8系统宽带连接怎么设置自动拨号 win8宽带连接的密码和账号输入框在哪儿 win8宽带连接怎样设置自动连接 WIN8宽带断开如何设置自动连接 Win8.1宽带连接在哪 w8的系统,宽带连接上了,为什么说网络受限 win8宽带连接错误651怎么解决 w8宽带连接显示错误651,连上了出现感叹号 w8宽带连接如何设置路由器账号,电脑上操作步骤 我想用可剥指甲油,因为想7月正正规规做一次美甲,现在用这个方便,可是好多人说只是那个透明水有用,那 win8宽带连接上了,但网络受限这怎么解决 家电脑是win8系统,怎么创建宽带连接? win8系统宽带连接错误720,求解。 w8宽带连接错误651 w8如何设置宽带自动连接 求教怎么处理windows消息 windows编程中击键消息、字符消息分别是什么 我用鼠标移动鼠标指针,在win系统里面是传递了什么信息 鼠标消息 鼠标在操作过程中会产生哪些消息,每种消息是何含义? 如何将一个鼠标单击事件传递给windows(实际没有单击鼠标) Java中如何在windows桌面上添加鼠标监听事件 请问windows从什么时候开始支持鼠标操作啊 简单介绍windows的鼠标操作 WINDOWS 调用鼠标指令的API是哪个 win32中有鼠标单击这一消息么 50分!C++ 获取鼠标消息 windows 按键分别对应什么消息 联想台式电脑一关机就成休眠状态怎么回事?而且按电源键也不能开机,只能关电源再开机是怎么回事啊?? 电脑点击关机后自动重新开机? 台式电脑不能正常关机,一关就卡机 联想电脑关机后就开不了机,拔掉电源线再插只能启动几秒就断电了 联想一体机电脑每天关机后要拔电源吗? 大师,办公室台式的联想电脑,装的win7系统,最近一关机就重启,该怎么办?求赐教~~ 联想台式机 每次关机马上自己又自动启动了什么情况