如果像通过窗口的客户区移动鼠标,而不只是在标题栏的话。那么我们可以依照这种思路来实现:处理客户区鼠标左键消息WM_LBUTTONDOWN,在这里面记录鼠标的位置,然后捕获WM_MOUSEMOVE消息,在它里面处理鼠标的位移量,并通过MoveWindow或SetWindowPos来移动窗口。

上面的处理方式效果还是不错的,就是比较麻烦,其实我们可以在鼠标左键客户区的时候发送一条WM_NCLBUTTONDOWN给窗口,这条消息的wParam为HTCAPTION表示击中标题栏,这样就会让窗口以为你现在的操作是左键击中标题栏,就像你真正在标题栏上点击了左键一般。如此系统自然而然为你提供了移动窗口的服务了。实现方法可以在处理WM_LBUTTONDOWN消息时SendMessage(hWnd, WM_NCLBUTTONDOWN, HTCAPTION, lParam);在发送这条消息之前最好使用ReleaseCapture()释放鼠标捕获,因为有窗口在捕获鼠标的话,WM_NCLBUTTONDOWN消息不会被发送。

谈一谈使用WM_NCLBUTTONDOWN方式移动窗口的不足:你将无法捕获到WM_LBUTTONUP、WM_MOUSEWHEEL消息,原因是系统认为你的鼠标是在标题栏上,因此想捕获这几个消息不行的。