Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 无边界窗口覆盖任务栏_C++_Windows_Winapi_Borderless - Fatal编程技术网

C++ 无边界窗口覆盖任务栏

C++ 无边界窗口覆盖任务栏,c++,windows,winapi,borderless,C++,Windows,Winapi,Borderless,我有一个定制的无边框窗户。当最大化时,它会覆盖任务栏。这不是我想要的。我已经使用了WM_GETMINMAXINFO消息。但是,我发现Windows10会在底部和右侧留出额外的8像素间隙。这是一个全有或全无的命题。以下是我尝试的第一个代码: case WM_GETMINMAXINFO: PMINMAXINFO pmm; pmm = (PMINMAXINFO)lParam; pmm->ptMaxSize.x = GetSystemMetrics(SM_CXSCRE

我有一个定制的无边框窗户。当最大化时,它会覆盖任务栏。这不是我想要的。我已经使用了
WM_GETMINMAXINFO
消息。但是,我发现Windows10会在底部和右侧留出额外的8像素间隙。这是一个全有或全无的命题。以下是我尝试的第一个代码:

case WM_GETMINMAXINFO:
     PMINMAXINFO pmm;
     pmm = (PMINMAXINFO)lParam;
     pmm->ptMaxSize.x = GetSystemMetrics(SM_CXSCREEN);
     pmm->ptMaxSize.y = GetSystemMetrics(SM_CYSCREEN);
     return 0;
这样做的结果与我得到的结果相同,没有挂接
WM_GETMINMAXINFO
消息。因此,我从底部去掉了两个像素,这样我就可以访问任务栏(处于“自动隐藏”模式):

突然,我在底部有一个10像素的间隙,在右侧有一个新的8像素间隙!这似乎是Windows 10的事情,因为Win7从未发生过这种情况。我还尝试了
systemparameters info
,调用
SPI\u GETWORKAREA
(而不是
GetSystemMetrics()
),得到了相同的结果

据我所知,问题不在于
WM_GETMINMAXINFO
。相反,我需要在代码中输入一个命令,以保持任务栏在顶部。我已经搜索了windows样式。但是,我没有找到任何帮助


“谁知道如何解决这个关键问题。”< P> > P>我在一个最不可能的地方找到了答案。有人试图用Python代码来操纵边界。在他们的尝试下,我能够设计出一个C++中无边界窗口的解决方案。 首先,我创建了一个带有
WS_OVERLAPPEDWINDOW | WS_VISIBLE
样式的窗口,以启用所有Windows功能。然后,我用以下代码处理
WM_NCCALCSIZE
消息:

case WM_NCCALCSIZE:
 {
    WINDOWPLACEMENT      wp;
    LPNCCALCSIZE_PARAMS  szr;

    wp.length = sizeof(WINDOWPLACEMENT);
    GetWindowPlacement(hWnd, &wp);
    szr = LPNCCALCSIZE_PARAMS(lParam);
    if (wp.showCmd == SW_SHOWMAXIMIZED)  szr->rgrc[0].bottom -= (WFRAME+2);
    return 0;
 }
在上面的代码中,我从第一个矩形的底部减去了边框的宽度。添加了额外的2个像素,以显示自动隐藏任务栏的位。最大化窗口现在可以正常工作,允许访问任务栏

为了在这个无边界窗口中创建我的虚拟客户端区域,我将这段代码添加到
WM_create
WM_SIZE
处理程序中:

WINDOWPLACEMENT  wp;
GetWindowRect(hWnd, &rWnd);
GetClientRect(hWnd, &rClient);
wp.length = sizeof(WINDOWPLACEMENT);
GetWindowPlacement(hWnd, &wp);
rClient.left += WFRAME;  rClient.right -= WFRAME;    rClient.top += (WFRAME+cyMenu);
if (wp.showCmd == SW_SHOWNORMAL)  rClient.bottom -= WFRAME;
cxClient = rClient.right-rClient.left;
cyClient = rClient.bottom-rClient.top;

元素
cyMenu
是为我的虚拟菜单栏保留的空间。它将包含一系列按钮,模拟菜单和最小/最大/关闭按钮。

如何处理和调整那里的窗口大小?链接后面的文档告诉你如何操作。也许可以看看GLFW。这是一个非常好的窗口抽象库,可以可能应该处理此类问题()Windows在非最大化的窗口周围添加了一个不可见的边框。您可以使用
DWMWA\u EXTENDED\u FRAME\u BOUNDS
标志使用
DWMWA\u EXTENDED\u FRAME\u BOUNDS
来获取此边框的大小。我很高兴您得到了您的解决方案,感谢您的分享,如果您将其标记为答案,我将不胜感激,这将有利于其他合作伙伴社区。是的,我会将其标记为答案。不幸的是,当我回答自己的一个问题时,该网站将不允许我将其标记为“答案”,直到24小时后。
WINDOWPLACEMENT  wp;
GetWindowRect(hWnd, &rWnd);
GetClientRect(hWnd, &rClient);
wp.length = sizeof(WINDOWPLACEMENT);
GetWindowPlacement(hWnd, &wp);
rClient.left += WFRAME;  rClient.right -= WFRAME;    rClient.top += (WFRAME+cyMenu);
if (wp.showCmd == SW_SHOWNORMAL)  rClient.bottom -= WFRAME;
cxClient = rClient.right-rClient.left;
cyClient = rClient.bottom-rClient.top;