解决办法如下:
1. 响应非客户区鼠标按下的消息WM_NCLBUTTONDOWN, 定义一个flag, m_bNCLButtonDowned = true; 表示当前在非客户区按下了鼠标左键
2. 使用WH_GETMESSAGE的HOOK, hook整个线程的消息队列,从而得到在非客户区释放鼠标时的WM_LBUTTONUP消息(因为spy++就是这种方式,因此我们也可以采用这种方式,当然google里的那哥们使用的是mouse hook,忒复杂了些)
3. 在hook回调函数里的WM_LBUTTONUP消息判断当前m_bNCLButtonDowned == true?非客户区里是否按下了鼠标左键,如果是,则PostMessage一个WM_NCLBUTTONUP,将真正的非客户区的
鼠标释放消息发送给窗口的窗口过程
4. 在窗口过程里的WM_NCLBUTTONUP的处理函数里判断m_bNCLButtonDowned == true?如果是,则执行代码,同时置位m_bNCLButtonDowned,表示当前已经释放了鼠标左键,因此鼠标左键没有按下
其实有更好的办法(网上这么说的,我验证了一下,比较扯蛋,还是建议用第一种方法),不用hook。
void CXX::OnSysCommand(UINT nID, LPARAM lParam)
{
CDialog::OnSysCommand(nID, lParam);
if( (nID & 0xFFF0) == SC_MOVE )
{
PostMessage(WM_NCLBUTTONUP, HTCAPTION, lParam); // 发送WM_NCLBUTTONUP消息
}