使用 WS_EX_NOACTIVATE 标志创建一个窗口,但在我释放鼠标之前无法拖动它

Create a window using the WS_EX_NOACTIVATE flag ,but it can't be dragged until I release the mouse

本文关键字:释放 鼠标 拖动 窗口 标志 NOACTIVATE EX WS 创建 一个 使用      更新时间:2023-10-16

我使用WS_EX_NOACTIVATE标志创建了一个窗口,当您单击该窗口时,它的工作效果很好。然而,当我拖动窗口或尝试调整它的大小时,它不会重新绘制窗口,因为你正在移动和调整它的大小,只有在最后,一旦你释放鼠标按钮。有办法解决这个问题吗?我想在调整窗口大小时看到它。

如果你需要一个在点击时不集中的窗口,但仍然可以与之交互,你需要处理WM_MOUSEACTIVATE,并返回MA_NOACTIVATE

附加信息和完整的工作示例代码已由Raymond Chen发布。请参阅我如何拥有一个拒绝激活但仍接收指针输入的窗口?

这是Windows的bug。您需要呼叫WM_MOVING上的SetWindowPos(hwnd, 0, x, y, width, height, 0)。要设置的坐标在lParam中给出,这是RECT*

请注意,这样做将激活已拥有的窗口并停用所有者,这不是您想要的(并且SWP_NOACTIVATE也没有效果)。

为了避免这种情况,您需要在自己的窗口上设置WS_CHILD。但是通过SetWindowLong()将设置在创建窗口之后,否则您自己的窗口将被剪切,就像任何子窗口一样。

并且,正如您可能已经发现的那样,这只适用于WS_EX_TOOLWINDOW ex样式的windows。我无法使自己的窗口保持停用与任何其他风格的组合,不包括WS_EX_TOOLWINDOW

winapi: