C 如何删除任意HWND边框(WinAPI)?

C 如何删除任意HWND边框(WinAPI)?,c,windows,winapi,border,nonclient-area,C,Windows,Winapi,Border,Nonclient Area,长话短说,我正在构建一个i3风格的平铺窗口管理器,需要覆盖任意窗口的chrome,以强制删除边框、标题栏和相关按钮 在尝试了几乎所有与镀铬相关的WS_样式和WS_EX样式的逻辑组合后,我对大多数应用程序一无所获。简单的本机程序(终端按预期工作)没问题,但对于绝大多数其他应用程序,同样的问题也会出现 上述结果在大多数情况下都存在。周围有一个大小相同的边框,但每个应用程序的行为各不相同。据我所知,这是用于鼠标拖动测试的“透明”(在本例中显然不是)边框(尽管在样式设置中禁用了框架,但不应该出现)。该

长话短说,我正在构建一个i3风格的平铺窗口管理器,需要覆盖任意窗口的chrome,以强制删除边框、标题栏和相关按钮

在尝试了几乎所有与镀铬相关的WS_样式和WS_EX样式的逻辑组合后,我对大多数应用程序一无所获。简单的本机程序(终端按预期工作)没问题,但对于绝大多数其他应用程序,同样的问题也会出现

上述结果在大多数情况下都存在。周围有一个大小相同的边框,但每个应用程序的行为各不相同。据我所知,这是用于鼠标拖动测试的“透明”(在本例中显然不是)边框(尽管在样式设置中禁用了框架,但不应该出现)。该区域中的帧缓冲区似乎未被清除(即,如果将窗口调整为自身大小,则该位置的边框将填充以前的像素)

这是一个快速的周末项目-我的工作与WinAPI编程无关,所以这对我来说是全新的,但如果我假设正确,那么这个边界实际上是非客户端区域?换句话说,非客户端区域必须归零,以便客户端区域占据整个窗口区域。我试图通过使用GWL_WNDPROC对所有目标窗口进行子类化并将WM_NCCALCSIZE归零来处理这个问题,但我得到了相同的结果


如何强制任意窗口(不是我自己创建的)完全删除其整个非客户端区域?

我使用以下功能删除/恢复窗口的边框:

void WndSetFrame(HWND hWnd, int bSmall)
{
    static int wwStyle=0;       // remember initial style
    int ww= GetWindowLong(hWnd, GWL_STYLE);

    if (bSmall) {
        wwStyle= ww;
        ww &= ~(WS_OVERLAPPED|WS_CAPTION|WS_MAXIMIZEBOX|WS_MINIMIZEBOX|WS_SIZEBOX|WS_SYSMENU);
        ww |=  (WS_POPUP /*|WS_DLGFRAME*/);
        if (ww==wwStyle) return;
        SetWindowLong(hWnd, GWL_STYLE, ww);
    }
    else {
        if (!wwStyle || ww==wwStyle) return;
        SetWindowLong(hWnd, GWL_STYLE, wwStyle);
    }
    SetWindowPos (hWnd,0,0,0,0,0,SWP_DRAWFRAME|SWP_FRAMECHANGED|SWP_NOACTIVATE|SWP_NOMOVE|SWP_NOOWNERZORDER|SWP_NOSIZE|SWP_NOZORDER);

}
您看到了吗?应用程序可以处理消息以删除标准窗框。但是我们不能保证一个任意的窗口句柄以及如何处理这个消息。