Полноэкранное окно закрывает панель задач, только когда Aero (Windows 7) выключен, когда для параметра DPI установлено значение 150%.

У меня есть довольно стандартная программа на C ++, в которой я создаю полноэкранное окно (с двумя дочерними окнами). На моем компьютере разработчика с Windows 10 это окно заполняет весь экран и закрывает панель задач.

В Windows 7 он не закрывает панель задач. После некоторых экспериментов кажется, что если я выключу Aero, программа закроет панель задач!

Я также создал быстрое приложение C # / WPF, и это приложение может закрывать панель задач независимо от состояния Aero.

Мне не хватает оконного сообщения или опции создания для окна?

Вот код, который позиционирует и создает окно

// Get a handle to the primary monitor, which by definition has its top
// left corner at (0, 0).
const POINT ptZero = { 0, 0 };
HMONITOR hmon = MonitorFromPoint(ptZero, MONITOR_DEFAULTTOPRIMARY);
MONITORINFO mi = { sizeof(mi) };
GetMonitorInfo(hmon, &mi);

// Fill the entire screen
layout->left   = mi.rcMonitor.left;
layout->right  = mi.rcMonitor.right;
layout->top    = mi.rcMonitor.top;
layout->bottom = mi.rcMonitor.bottom; 

// Create a full screen window
m_hwnd = CreateWindowEx(
  WS_EX_TOPMOST,
  className,
  windowName,
  WS_POPUP | WS_VISIBLE,
  layout.left,
  layout.top,
  layout.right - layout.left,
  layout.bottom - layout.top,
  NULL,
  NULL,
  GetModuleHandle(NULL),
  this); // LPARAM is used in WM_CREATE to associate the class instance with the Window  

Вот код, который обрабатывает сообщения окна

switch (uMsg)
{
case WM_PAINT:
    OnPaint(hwnd); // Draws a black background 
    return DefWindowProc(hwnd, uMsg, wParam, lParam);
default:
    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

Обновление: после некоторого поиска в Google я обнаружил, что эта проблема также может быть связана с DPI: http://forums.pcsx2.net/Thread-Fullscreen-Windows-7-Taskbar-does-not-auto-hide-w-aero https://productforums.google.com/forum/#!topic/chrome/5dMYLChXeWk

Что работает, а что не работает в данный момент:

Areo + DPI @ 150%: панель задач не закрыта Нет области + DPI @! 150%: панель задач закрыта Areo + DPI @ 100%: панель задач закрыта Нет области + DPI @ 100%: панель задач закрыта

Это меня сильно сбило с толку ...


person Roy T.    schedule 04.02.2016    source источник
comment
Ознакомьтесь с утилитой Spy ++, вы увидите флаги стиля, которые использует приложение C #.   -  person Hans Passant    schedule 04.02.2016
comment
Вы пробовали добавить WS_MAXIMIZE? И, возможно, WS_EX_TOPMOST тоже поможет.   -  person Simon Kraemer    schedule 04.02.2016
comment
Спасибо @HansPassant, проверю. @SimonKraemer, я уже использую WS_EX_TOPMOST (правда, в этом нет необходимости). Я тоже попробую WS_MAXIMIZE.   -  person Roy T.    schedule 04.02.2016
comment
Не думаю, что смогу вызвать сюда @RaymondChen? :). В соответствии с этим, мне не нужно так много думать об этом: blogs.msdn.microsoft.com/oldnewthing/20050505-04/?p=35703   -  person Roy T.    schedule 04.02.2016


Ответы (1)


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

Добавьте в проект файл с именем manifest.xml (имя не имеет значения) со следующим содержимым:

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" >
  <asmv3:application>
    <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
      <dpiAware>true</dpiAware>
    </asmv3:windowsSettings>
  </asmv3:application>
</assembly>

Затем на страницах свойств измените следующие параметры для всех конфигураций

  • Компоновщик-> Файл манифеста
    • Generate Manifest: Yes
  • Инструмент манифеста -> Ввод и вывод
    • Additional Manifest Files: manifest.xml
    • Embed Manifest: Yes
person Roy T.    schedule 04.02.2016