【问题标题】:Handling Window Movement after setting GWL_STYLE to 0将 GWL_STYLE 设置为 0 后处理窗口移动
【发布时间】:2026-01-22 15:50:01
【问题描述】:

我想要一个没有边框和标题的窗口,所以我做了 SetWindowLongPtrW(window_handle, GWL_STYLE, 0);

在那之后我不能移动我的窗口所以在我的 WndProc 中我这样做了

if( message == WM_NCHITTEST ) {
        RECT rc;
        GetClientRect( hwnd, &rc );
        MapWindowPoints( hwnd, GetParent( hwnd ), (LPPOINT)&rc, 2 );

        int mouseX = LOWORD( lParam ) - rc.left;
        int mouseY = HIWORD( lParam ) - rc.top;
        POINT p;
        p.x = mouseX;
        p.y = mouseY;

        return PtInRect( &rc, p ) ? HTCAPTION : DefWindowProc( hwnd, message, wParam, lParam );
}

它工作,我第一次移动窗口。在我停止用鼠标点击后,它不会再次移动:/

【问题讨论】:

标签: windows winapi window wndproc


【解决方案1】:

SetWindowLongPtrW( window_handle, GWL_STYLE, 0 ); 将隐藏窗口,假设它不会导致更严重的问题。使用GetWindowLongPtr 并将其与有效的窗口样式结合,或者使用ShowWindow 隐藏窗口

您描述的错误与此无关。您正在尝试使用GetClientRectMapWindowPoints 查找窗口的屏幕坐标。结果将不准确,因为窗口可能有边框和标题栏。

请改用GetWindowRect。这将为您提供窗口的屏幕坐标。

您可以将其与鼠标位置LOWORD(lParam)HIWORD(lParam) 进行比较。这已经是屏幕坐标了。此代码将在鼠标落在窗口的每个位置移动屏幕:

RECT rc;
GetWindowRect(hwnd, &rc);
int mouseX = LOWORD(lparam);
int mouseY = HIWORD(lparam);

不要从鼠标位置减去rc.leftrc.top。这将转换客户端坐标中的坐标(大致)。当窗口位于屏幕左上角时,您的代码可能会工作,但稍后移动窗口时将无法工作。

如果您希望在客户端窗口坐标中工作,请使用 ScreenToClient

【讨论】: