我有一个WPF应用程序,可以在辅助显示中全屏打开另一个WPF窗口。我遇到的问题是,当我尝试获取辅助显示范围时,它们带有错误的值,例如:我的笔记本电脑显示器的分辨率为1920x1080,在我的应用中它是正确的,但是在辅助显示中,即一台分辨率为1920x1080的电视,则返回2400x1350
代码:
foreach (var monitor in System.Windows.Forms.Screen.AllScreens)
{
i++;
if (monitor.Primary)
{
cbMonitors.Items.Add("Monitor (Primary) " + i + " - " + monitor.Bounds.Width + " x " + monitor.Bounds.Height.ToString());
}
else
{
cbMonitors.Items.Add("Monitor " + i + " - " + monitor.Bounds.Width + " x " + monitor.Bounds.Height.ToString());
}
}
cbMonitors.SelectedIndex = 0;
环顾互联网后,我发现问题是由笔记本电脑屏幕缩放引起的
并通过创建app.manifest文件并添加/取消注释以下行来修复该问题:
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings>
<!-- fallback for Windows 7 and 8 -->
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true/pm</dpiAware>
<!-- falls back to per-monitor if per-monitor v2 is not supported -->
<dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">permonitorv2,permonitor</dpiAwareness>
</windowsSettings>
</application>
现在,组合框显示了预期的值,但是当我尝试启动窗口时,它们会出现在错误的位置: 数字应位于每个屏幕的中心,红色边框代表屏幕边界。
再次通过在app.manifest中启用GDI DPI缩放来“修复”它。
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings>
<!-- fallback for Windows 7 and 8 -->
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true/pm</dpiAware>
<!-- falls back to per-monitor if per-monitor v2 is not supported -->
<dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">permonitorv2,permonitor</dpiAwareness>
<!-- enables GDI DPI scaling -->
<gdiScaling xmlns="http://schemas.microsoft.com/SMI/2017/WindowsSettings">true</gdiScaling>
</windowsSettings>
</application>
但是现在我遇到了另一个问题,我无法解决。
现在笔记本电脑屏幕(比例为125%)的边界显示错误,并且电视边界正确。
表格都是“模糊的”
最重要/最严重的是,单击组合框时会“闪烁”,并且不允许您选择项目。
创建组合框
<ComboBox Name="cbMonitors" HorizontalAlignment="Left" Margin="169,244,0,0" VerticalAlignment="Top" Width="506" />
组合框填充(后面的代码):
int i = 0;
foreach (var monitor in System.Windows.Forms.Screen.AllScreens)
{
i++;
if (monitor.Primary) { cbMonitors.Items.Add("Monitor (Primary) " + i + " - " + monitor.Bounds.Width + " x " + monitor.Bounds.Height.ToString()); }
else { cbMonitors.Items.Add("Monitor " + i + " - " + monitor.Bounds.Width + " x " + monitor.Bounds.Height.ToString()); }
}
cbMonitors.SelectedIndex = 0;
以及用于设置窗口位置的代码
System.Windows.Forms.Screen s = System.Windows.Forms.Screen.AllScreens[number];
System.Drawing.Rectangle r = s.Bounds;
Top = r.Top;
Left = r.Left;
Height = s.Bounds.Height;
Width = s.Bounds.Width;
此外,如果需要,这是我的应用程序的完整源代码: https://mega.nz/#!iZ1kCApa!0yAfWY5PDUqdVGzcetbaXZFnb-tdAWmW4WUkYw6KIhI