Win32: полный экран и скрывающаяся панель задач

У меня есть окно, который я SetWindowPos(window, HWND_TOP, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), SWP_FRAMECHANGED);

Это покрывает целый экран, хорошо, но это требует времени (0,5 секунды) для покрытия панели задач также.

Существует ли способ сразу прибыть через панель задач? Я нашел ту установку HWND_TOPMOST это сразу, но это остается, прежде всего, другие окна, даже если я переключаю приложение - это - что-то, что я не хочу. Кроме того, если я сначала скрываю окно и затем показываю его, это так или иначе вынуждает окно перерисовать и сразу покрывает панель задач, но это мерцает (из-за сокрытия). Есть ли иначе?

26
задан Lars Kanto 4 March 2010 в 20:23
поделиться

3 ответа

Я считаю, что панель задач не мешает, когда ее обработчик оболочки сообщает ей о "грубом приложении", это может занять некоторое время.

Что, если вы начнете с окна HWND_TOPMOST и сделаете его не самым верхним через 1 секунду?

1
ответ дан 28 November 2019 в 06:55
поделиться
  1. Щелкните правой кнопкой мыши на панели задач
  2. выберите Свойства
  3. снимите флажок "Держать панель задач поверх других окон".

Панель задач принадлежит пользователю, и это их дело - заботиться о том, чтобы она занимала 1/2 секунды для автоматического скрытия, когда ваше приложение переходит в полноэкранный режим. Если они хотят изменить это поведение, то они могут изменить его.

Если вы работаете во встроенной системе, то у вас может быть законная причина скрыть панель задач. Но в этом случае нет причин не настроить панель задач так, чтобы она не всегда была сверху. Вы также можете взглянуть на SystemParametersInfo, если хотите изменить некоторые из этих параметров в своем коде.

-4
ответ дан 28 November 2019 в 06:55
поделиться

Ага, HWND_TOPMOST делает это за меня. Вот фрагмент кода, который позволяет мне хорошо (и быстро) работать в полноэкранном режиме:


bool enterFullscreen(HWND hwnd, int fullscreenWidth, int fullscreenHeight, int colourBits, int refreshRate) {
    DEVMODE fullscreenSettings;
    bool isChangeSuccessful;
    RECT windowBoundary;

    EnumDisplaySettings(NULL, 0, &fullscreenSettings);
    fullscreenSettings.dmPelsWidth        = fullscreenWidth;
    fullscreenSettings.dmPelsHeight       = fullscreenHeight;
    fullscreenSettings.dmBitsPerPel       = colourBits;
    fullscreenSettings.dmDisplayFrequency = refreshRate;
    fullscreenSettings.dmFields           = DM_PELSWIDTH |
                                            DM_PELSHEIGHT |
                                            DM_BITSPERPEL |
                                            DM_DISPLAYFREQUENCY;

    SetWindowLongPtr(hwnd, GWL_EXSTYLE, WS_EX_APPWINDOW | WS_EX_TOPMOST);
    SetWindowLongPtr(hwnd, GWL_STYLE, WS_POPUP | WS_VISIBLE);
    SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, fullscreenWidth, fullscreenHeight, SWP_SHOWWINDOW);
    isChangeSuccessful = ChangeDisplaySettings(&fullscreenSettings, CDS_FULLSCREEN) == DISP_CHANGE_SUCCESSFUL;
    ShowWindow(hwnd, SW_MAXIMIZE);

    return isChangeSuccessful;
}

Обратите внимание, что это изменится разрешение, если вы укажете неправильные настройки. Это то, что я обычно хочу, но если вам это не нравится, вы можете узнать свое разрешение, используя (где mainWindow возвращается из чего-то вроде CreateWindow () или ] CreateWindowEx () ):


windowHDC = GetDC(mainWindow);
fullscreenWidth  = GetDeviceCaps(windowHDC, HORZRES);
fullscreenHeight = GetDeviceCaps(windowHDC, VERTRES);
colourBits       = GetDeviceCaps(windowHDC, BITSPIXEL);
refreshRate      = GetDeviceCaps(windowHDC, VREFRESH);

Если вы хотите выйти из полноэкранного режима, вы делаете что-то вроде этого:


bool exitFullscreen(HWND hwnd, int windowW, int windowY, int windowedWidth, int windowedHeight, int windowedPaddingX, int windowedPaddingY) {
    bool isChangeSuccessful;

    SetWindowLongPtr(hwnd, GWL_EXSTYLE, WS_EX_LEFT);
    SetWindowLongPtr(hwnd, GWL_STYLE, WS_OVERLAPPEDWINDOW | WS_VISIBLE);
    isChangeSuccessful = ChangeDisplaySettings(NULL, CDS_RESET) == DISP_CHANGE_SUCCESSFUL;
    SetWindowPos(hwnd, HWND_NOTOPMOST, windowX, windowY, windowedWidth + windowedPaddingX, windowedHeight + windowedPaddingY, SWP_SHOWWINDOW);
    ShowWindow(hwnd, SW_RESTORE);

    return isChangeSuccessful;
}

Я установил свой код для переключения между полноэкранным и оконным режимами с помощью горячей клавиши, и я сохраните переменные оконного режима как глобальные, чтобы при переходе в оконный режим он оставался неизменным.

Этот код также имеет то преимущество, что он работает в эквиваленте "эксклюзивного режима" (я использую XP , и не пробовал его в более новых версиях Windows), что означает, что это будет намного, намного быстрее. Сообщите мне, если я сделал какие-либо ошибки при сжатии кода (из моего гораздо более крупного кода).

14
ответ дан 28 November 2019 в 06:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: