在网上瞎逛,看到这样一道题目“鼠标左键点击在非当前窗口的标题栏上,会产生什么样的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)