C 如何防止SetWindowPos()使窗口全屏显示?

C 如何防止SetWindowPos()使窗口全屏显示?,c,winapi,C,Winapi,当我将屏幕尺寸和0,0位置传递给SetWindowPos或MooveWindow函数时,它们可以工作,但它们使我的窗口具有WS_弹出窗口和WS_EX_分层标志的行为不同:通常,如果窗口的某个区域与任务栏重叠,任务栏将呈现在窗口顶部,但在这种情况下,窗口完全隐藏了任务栏。而且颜色键不正确。这些行为让人想起一个全屏窗口。我的问题是,我希望我的程序能够使windonw覆盖没有任务栏的显示器的所有像素,但保持使用颜色键的能力,这是不可能的,因为调用这样的函数会使窗口全屏,从而破坏颜色键。因此,我想知道如

当我将屏幕尺寸和0,0位置传递给SetWindowPos或MooveWindow函数时,它们可以工作,但它们使我的窗口具有WS_弹出窗口和WS_EX_分层标志的行为不同:通常,如果窗口的某个区域与任务栏重叠,任务栏将呈现在窗口顶部,但在这种情况下,窗口完全隐藏了任务栏。而且颜色键不正确。这些行为让人想起一个全屏窗口。我的问题是,我希望我的程序能够使windonw覆盖没有任务栏的显示器的所有像素,但保持使用颜色键的能力,这是不可能的,因为调用这样的函数会使窗口全屏,从而破坏颜色键。因此,我想知道如何防止SetWindowPos使窗口全屏,即使我通过屏幕的尺寸,例如使用标志或使用其他功能

编辑:若并没有解决方案,屏幕尺寸的窗口必须是全屏的,请告诉我

如何创建窗口:

WindowClass.cbSize = sizeof(WNDCLASSEX);
WindowClass.lpfnWndProc = WindowProcedure;
WindowClass.lpszClassName = L"WindowsClass";
WindowClass.hbrBackground = CreateSolidBrush(RGB(30, 30, 30));

// ...

HWND Window = CreateWindowEx(WS_EX_APPWINDOW | WS_EX_LAYERED,
    L"WindowsClass", L"FinalWindow", WS_POPUP | WS_MINIMIZEBOX |
    WS_MAXIMIZEBOX, 100, 100, 500, 500, NULL, NULL, NULL, NULL);

SetLayeredWindowAttributes(Window, RGB(30, 30, 30), 0, LWA_COLORKEY);
如何使用SetWindowPos:

int ScreenWidth = GetDeviceCaps(FinalWindowDeviceContext, HORZRES);
int ScreenHeight = GetDeviceCaps(FinalWindowDeviceContext, VERTRES);
SetWindowPos(FinalWindow, NULL, 0, 0, ScreenWidth, ScreenHeight, 0);
当您对HwnInsertafter使用NULL值时,最好设置SWP_NOZORDER,除非您希望将窗口置于非顶层窗口之上。空值表示HWND_TOP

若要通过排除任务栏覆盖的区域来缩小窗口,请使用GetMonitorInfo获取MONOTRINFO。rcWork字段包含任何appbar(如任务栏)未使用的监控区域的RECT

POINT       point = {0, 0};
HMONITOR    monitor = MonitorFromPoint(point, MONITOR_DEFAULTTONEAREST);
MONITORINFO mi;
mi.cbSize = sizeof(mi);
GetMonitorInfo(monitor, &mi);
RECT        work_area = mi.rcWork;

SetWindowPos(
    FinalWindow,
    NULL,
    work_area.left,
    work_area.top,
    work_area.right - work_area.left;
    work_area.bottom - work_area.top,
    SWP_NOZORDER); // To prevent z-order change

窗口需要无边框才能与任务栏重叠。恢复边框功能有点痛苦,但很多网页都展示了如何做到这一点。这个窗口是无边框的。我不想让它变小,我知道如何检索到工作区,这不是我需要的,我应该提到这一点。我想要的是一个具有屏幕尺寸的窗口这是必要的,例如,如果我想最大化没有任务栏的显示器上的窗口。我想要的是一个具有屏幕尺寸的窗口-这是您的原始代码所做的。也许你不喜欢这样的结果,即使用大小为ScreenWidth、ScreenHeight的活动窗口将ABN_FULLSCREENAPP消息发送到任务栏,任务栏会自动下降到z顺序的底部,并进入窗口下方。如果你坚持让窗口位于任务栏下方,请使用ScreenHeight-1。你们还应该详细说明颜色键不正确,因为它似乎至少可以在透明窗口上画一些矩形。
POINT       point = {0, 0};
HMONITOR    monitor = MonitorFromPoint(point, MONITOR_DEFAULTTONEAREST);
MONITORINFO mi;
mi.cbSize = sizeof(mi);
GetMonitorInfo(monitor, &mi);
RECT        work_area = mi.rcWork;

SetWindowPos(
    FinalWindow,
    NULL,
    work_area.left,
    work_area.top,
    work_area.right - work_area.left;
    work_area.bottom - work_area.top,
    SWP_NOZORDER); // To prevent z-order change