首先,任何想大声疾呼的人-只需针对每个监视器目标.NET 4.6.2,默认情况下就会启用DPI感知-这是不对的。
在.NET 4.6.2中默认情况下启用的是幕后的样板代码-窗口声明代码中非常讨厌的c ++钩子可启用对每个显示器dpi的感知支持。
您仍然必须通过app.manifest声明您支持每个显示器的dpi感知,但ClickOnce不支持。
(请注意,除非您手动添加样板代码,否则即使使用应用程序清单,.NET的早期版本也不支持每个监视器的dpi意识)
现在来回答:
[assembly: DisableDpiAwareness]using System.Windows.Media;
不要取消关于DPI意识的部分的注释(再进一步)!如果您这样做,ClickOnce将引发错误。现在,您将在项目中的某处需要以下c#代码,我建议为此创建一个新的静态类:
internal static class NativeMethods
{
[DllImport("user32.dll", SetLastError = true)]
internal static extern bool SetProcessDpiAwarenessContext(int dpiFlag);
[DllImport("SHCore.dll", SetLastError = true)]
internal static extern bool SetProcessDpiAwareness(PROCESS_DPI_AWARENESS awareness);
[DllImport("user32.dll")]
internal static extern bool SetProcessDPIAware();
internal enum PROCESS_DPI_AWARENESS
{
Process_DPI_Unaware = 0,
Process_System_DPI_Aware = 1,
Process_Per_Monitor_DPI_Aware = 2
}
internal enum DPI_AWARENESS_CONTEXT
{
DPI_AWARENESS_CONTEXT_UNAWARE = 16,
DPI_AWARENESS_CONTEXT_SYSTEM_AWARE = 17,
DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE = 18,
DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 = 34
}
}
Run Code Online (Sandbox Code Playgroud)最后一部分是调用上述p / invoke方法并声明dpi感知支持。我们需要在运行任何其他代码之前执行此操作。为此,请在SolutionExplorer中右键单击app.xaml,然后选择。然后添加以下代码:View Code
protected override void OnStartup(StartupEventArgs e)
{
if (Environment.OSVersion.Version >= new Version(6, 3, 0)) // win 8.1 added support for per monitor dpi
{
if (Environment.OSVersion.Version >= new Version(10, 0, 15063)) // win 10 creators update added support for per monitor v2
{
NativeMethods.SetProcessDpiAwarenessContext((int)NativeMethods.DPI_AWARENESS_CONTEXT.DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2);
}
else NativeMethods.SetProcessDpiAwareness(NativeMethods.PROCESS_DPI_AWARENESS.Process_Per_Monitor_DPI_Aware);
}
else NativeMethods.SetProcessDPIAware();
base.OnStartup(e);
}
Run Code Online (Sandbox Code Playgroud)确保其余代码可以正确处理DPI。从.NET 4.6.2开始,您可以使用OnDpiChanged事件和VisualTreeHelper.GetDpi()方法。
请享用 :)
小智 6
@Marko - 很好的答案!但这里有一个小细节:如果您将 WinForms 与 WPF 混合,则必须添加 WinForms 配置。请更新你的答案,我没有足够的观点发表评论......
<System.Windows.Forms.ApplicationConfigurationSection>
<add key="DpiAwareness" value="PerMonitorV2" />
</System.Windows.Forms.ApplicationConfigurationSection>
Run Code Online (Sandbox Code Playgroud)
参考: https: //learn.microsoft.com/en-us/dotnet/framework/winforms/high-dpi-support-in-windows-forms
| 归档时间: |
|
| 查看次数: |
1883 次 |
| 最近记录: |