You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何禁用Windows/C++窗口调整时出现的透明预览矩形?

禁用Windows窗口大小调整预览矩形的方法

你遇到的这个透明矩形是Windows系统默认的窗口大小调整预览框,针对自定义无边框GUI,可通过以下几种方式禁用:

方法一:自定义窗口大小调整逻辑,拦截系统默认处理

在窗口过程(WndProc)中处理WM_NCHITTEST和WM_SIZING消息,完全接管窗口大小调整的逻辑,系统就不会触发默认的预览框:

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
        case WM_NCHITTEST:
        {
            // 自定义边缘检测,返回对应区域让系统允许拖动调整大小
            POINT pt = { LOWORD(lParam), HIWORD(lParam) };
            ScreenToClient(hWnd, &pt);
            RECT rc;
            GetClientRect(hWnd, &rc);
            
            const int edgeSize = 8; // 边缘触发区域大小
            if (pt.x <= edgeSize && pt.y <= edgeSize) return HTTOPLEFT;
            if (pt.x >= rc.right - edgeSize && pt.y <= edgeSize) return HTTOPRIGHT;
            if (pt.x <= edgeSize && pt.y >= rc.bottom - edgeSize) return HTBOTTOMLEFT;
            if (pt.x >= rc.right - edgeSize && pt.y >= rc.bottom - edgeSize) return HTBOTTOMRIGHT;
            if (pt.x <= edgeSize) return HTLEFT;
            if (pt.x >= rc.right - edgeSize) return HTRIGHT;
            if (pt.y <= edgeSize) return HTTOP;
            if (pt.y >= rc.bottom - edgeSize) return HTBOTTOM;
            
            return HTCAPTION; // 允许拖动窗口区域
        }
        case WM_SIZING:
        {
            // 拦截此消息,阻止系统绘制预览框
            return 0;
        }
        // 其他消息处理...
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

方法二:使用DWM属性禁用非客户区渲染

如果窗口依赖DWM(桌面窗口管理器),可通过DwmSetWindowAttribute设置DWMWA_NCRENDERING_POLICY为DWMNCRP_DISABLED,禁用系统默认的非客户区渲染(包括大小调整预览):

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
    HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_POPUP | WS_VISIBLE,
        CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);

    if (!hWnd)
    {
        return FALSE;
    }

    // 禁用DWM非客户区渲染
    DWMNCRENDERINGPOLICY policy = DWMNCRP_DISABLED;
    DwmSetWindowAttribute(hWnd, DWMWA_NCRENDERING_POLICY, &policy, sizeof(policy));

    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);

    return TRUE;
}

注意事项

  • 方法一需完全接管窗口的拖动和大小调整逻辑,适合高度自定义的无边框窗口;
  • 方法二会禁用所有DWM相关的非客户区效果(如窗口阴影),需根据GUI需求选择;
  • 确保窗口样式设置为WS_POPUP(无边框),避免系统默认边框干扰。

内容的提问来源于stack exchange,提问作者Cesar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 03:18:23