Как предотвратить SetWindowPos () сделать окно полноэкранным? - PullRequest
0 голосов
/ 10 апреля 2020

Когда я передаю размеры моего экрана и позицию (0, 0) в функции SetWindowPos() или MooveWindow(), они работают, но заставляют мое окно (оно имеет флаги WS_POPUP и WS_EX_LAYERED) вести себя по-разному : обычно, если у окна есть область, которая перекрывается с панелью задач, панель задач будет отображаться поверх окна, но в этом случае окно полностью скрывает панель задач. И цветовой ключ не работает правильно. Такое поведение напоминает полноэкранное окно. Моя проблема заключается в том, что я хочу, чтобы моя программа могла сделать так, чтобы 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);

1 Ответ

1 голос
/ 10 апреля 2020

Когда вы используете NULL значение для hWndInsertAfter, лучше установить SWP_NOZORDER, если только вы не хотите поместить свое окно сверху (не самое верхнее windows). Значение 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 change
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...