当我将屏幕的尺寸和(0, 0)位置传递给SetWindowPos()或MooveWindow()函数时,它们可以工作,但它们使我的窗口(它具有WS_POPUP和WS_EX_LAYERED标志)的行为有所不同:通常情况下,如果窗口具有与任务栏重叠的区域,则任务栏将呈现在窗口的顶部,但在这种情况下,窗口将完全隐藏任务栏。而且色键也不能正常工作。这些行为让人联想到全屏窗口。我的问题是,我希望我的程序能够让window覆盖没有任何任务栏的监视器的所有像素,但保留使用颜色键的能力,这是不可能的,因为调用这样的函数会使窗口全屏显示,这会破坏颜色键。所以我想知道如何防止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);发布于 2020-04-10 13:31:28
当您为hWndInsertAfter使用NULL值时,最好设置SWP_NOZORDER,除非您想要将窗口放在(非顶部窗口的)顶部。NULL值表示HWND_TOP。
SetWindowPos(FinalWindow, NULL, x, y, w, h, SWP_NOZORDER);要通过排除任务栏覆盖的区域来缩小窗口,可以使用GetMonitorInfo获取MONOTRINFO。rcWork字段包含未被任何应用程序栏(例如任务栏)使用的监视器区域的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 changehttps://stackoverflow.com/questions/61131782
复制相似问题