当DPI设置为150%时,全屏窗口仅在Aero(Windows 7)关闭时覆盖任务栏

时间:2016-02-04 08:26:50

标签: c windows winapi dpi aero

我有一个相当标准的C ++程序,我在其中创建一个全屏窗口(带有两个子窗口)。在使用Windows 10的开发计算机上,此窗口填充整个屏幕并覆盖任务栏。

在Windows 7上,它不包括任务栏。经过一些实验后,似乎如果我关闭Aero,程序将覆盖任务栏!

我还创建了一个快速的C#/ WPF应用程序,无论Aero的状态如何,此应用程序都可以覆盖任务栏。

我是否错过了窗口的窗口消息或创建选项?

以下是定位和创建Window

的代码
// 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  

以下是处理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);
}

更新 经过一些谷歌搜索后,我发现这个问题也可能与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%:任务栏未涵盖 No Areo + DPI @!150%:任务栏覆盖 Areo + DPI @ 100%:任务栏覆盖 没有区域+ DPI @ 100%:任务栏覆盖

这让我感到非常困惑......

1 个答案:

答案 0 :(得分:0)

在我发现DPI发挥作用后,我偶然发现了解决方案。我们需要告诉Windows我们的应用程序是DPI识别的。如果我们不这样做,Windows将尝试重新调整我们的应用程序的UI元素。我仍然不知道为什么这只会在启用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>

然后在属性页面中更改所有配置的以下选项

  • 链接器 - &gt;清单文件
    • 生成清单:
  • 清单工具 - &gt;输入和输出
    • 其他清单文件: manifest.xml
    • 嵌入清单: