我尝试允许窗口被客户端区域拖动,并且仍然检测WM_LBUTTONUP
消息进行处理。我发现了两种常用的拖动窗口的方法(如下所列),这两种方法都依赖于使用非客户端相关的函数,但是它们在释放左键按钮时无法检测WM_LBUTTONUP
消息。
我尝试接收WM_LBUTTONUP
消息,同时能够通过客户区拖动屏幕,在WM_LBUTTONDOWN
上每毫秒发送SetTimer
,并使用SetWindowPos
移动光标所在的窗口,然后在WM_LBUTTONUP
上发送KillTimer
,它工作正常,并成功检测到WM_LBUTTONUP
消息,但是,我不喜欢这个解决方案,因为窗口似乎不太顺利,因为它是拖来拖去,相比于解决方案,我发现网上。
我希望有来自非客户端的解决方案的流畅性。有没有一种方法可以使用它们来拖动窗口,并同时接收WM_LBUTTONUP
消息?谢谢阅读!
在线找到的第一个非客户端方法示例:
case WM_LBUTTONDOWN:
mouseState = 1;
break;
case WM_LBUTTONUP:
mouseState = 0;
break;
case WM_MOUSEMOVE:
{
if (mouseState)
{
POINT CursPt;
GetCursorPos(&CursPt);
PostMessage(hwnd, WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(CursPt.x, CursPt.y));
//mouseState = 0;
}
}break;
在线找到的第二个非客户端方法示例:
case WM_NCHITTEST:
{
LRESULT hit = DefWindowProc(hWnd, message, wParam, lParam);
if (hit == HTCLIENT) hit = HTCAPTION;
return hit;
}
1条答案
按热度按时间p3rjfoxz1#
第一个“例子”是荒谬的,我不会使用它。
第二个“例子”可能有效,但你必须意识到,如果你使用它,你将永远不会收到WM_LBUTTONDOWN或WM_LBUTTONUP,你将只收到WM_NCLBUTTONDOWN和WM_NCLBUTTONUP。所以,你将不得不凑合着使用WM_NCLBUTTONUP,并祈祷你的窗口中没有其他东西依赖于正确的客户端鼠标事件。
另一种方法(事实证明,这不会产生好的结果,见评论中的讨论吹,)是做你自己的窗口移动:
SetWindowPos()
。