WM_NCLBUTTONUP不正常响应

当在非客户区点击鼠标左键并释放时,系统会发送窗口的WM_LBUTTONUP(注意不是WM_NCLBUTTONUP,这是客户区的鼠标释放消息,但是我们现在在非客户区释放鼠标如之奈何)消息到线程的消息队列,但线程的消息队列压根就不把这个消息发送给这个窗口的窗口过程!

解决办法如下:

1.       响应非客户区鼠标按下的消息WM_NCLBUTTONDOWN 定义一个flag, m_bNCLButtonDowned = true; 表示当前在非客户区按下了鼠标左键

2.       使用WH_GETMESSAGEHOOK, 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。

在OnSysCommand函数里处理一下,手动发一个WM_NCLBUTTONUP消息,具体代码如下:

void CXX::OnSysCommand(UINT nID, LPARAM lParam)

{
   CDialog::OnSysCommand(nID, lParam);
   if( (nID & 0xFFF0) == SC_MOVE )
   {
    PostMessage(WM_NCLBUTTONUP, HTCAPTION, lParam);   // 发送WM_NCLBUTTONUP消息
   }

}

以上2种方法都来自网络。。特此声明。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值