我有一个相当标准的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%:任务栏覆盖
这让我感到非常困惑......
答案 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>
然后在属性页面中更改所有配置的以下选项