面试题

一道题目“鼠标左键点击在非当前窗口的标题栏上,会产生什么样的win32消息?”。当时感觉有点茫然,不就是WM_LBBUTTONDOWN、WM_ACTIVATE和WM_SETFOCUS吗?后来感觉可能不是这么简单,就用Spy++跟踪了一下,果然多了不少消息。

在NC点击发出的消息流程如下:
   WM_NCHITTEST
   //在鼠标点击非激活窗体的时候发出的,如果是点在子窗体上,还会通过DefWindowProc发给父窗体
   WM_MOUSEACTIVATE
   //鼠标左键点在NC发出的消息
   WM_NCLBUTTONDOWN
   WM_WINDOWPOSCHANGING
   WM_WINDOWPOSCHANGED
   //在应用程序切换的时候,用来Deactivate和Activate应用程序
   WM_ACTIVATEAPP
   //改变窗体在Activated和Deactivated状态下的NC
   WM_NCACTIVATE
   //Activate和Deactivate窗体,在同一个输入消息队列中Deactivate消息在前,随后才是activate消息;在不同的输入消息队列中,这两个消息被异步处理
   WM_ACTIVATE
   WM_NCLBUTTONMOVE
   WM_NCLBUTTONUP
   //当窗体获取键盘焦点的时候,才会发出这个消息
   WM_SETFOCUS
  
在用户区的子窗体上点击的消息流程如下:
   //一般用来处理create、destroyed和鼠标消息,是子窗体发给所属父窗体的消息
   WM_PARENTNOTIFY(WM_LBUTTONDOWN)
   WM_MOUSEACTIVATE
   WM_WINDOWPOSCHANGING
   WM_WINDOWPOSCHANGED
   WM_ACTIVATEAPP
   WM_NCACTIVATE
   WM_ACTIVATE
  
通过Alt+Tab让该应用程序Deactivate的消息流程如下:
   //The WM_CANCELMODE message is sent to cancel certain modes, such as mouse capture. For example, the system sends this message to the active window when a dialog box or message box is displayed. Certain functions also send this message explicitly to the specified window regardless of whether it is the active window. For example, the EnableWindow function sends this message when disabling the specified window.
   WM_CANCELMODE
   WM_NCACTIVATE(FALSE)
   WM_ACTIVATE(FALSE)
   //An application sends the WM_CHANGEUISTATE message to indicate that the user interface (UI) state should be changed
   WM_CHANGEUISTATE
   WM_ACTIVATEAPP(FALSE)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值