0.确保你不准备兼容Windows XP了
1.找到Program.cs,在类里写这么一句
[DllImport("user32.dll")]
private static extern void SetProcessDPIAware();
2.然后在Main里最开始写这么一句
SetProcessDPIAware();
3.OK
为什么不需要手动缩放呢,这是因为WinForms可以自动缩放(窗体中的AutoScaleMode就是干这个事的)。
为什么后来又不支持了呢?微软考虑有些控件不支持缩放,可能出现问题,所以没给WinForms程序设置为高DPI兼容。
如果你想兼容Windows XP的话,就要麻烦一些了,下面是可以兼容XP的版本,可以参考一下:
<code class="lang-c">using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
static class Program
{
//[DllImport("user32.dll")]
//private static extern void SetProcessDPIAware();
[DllImport("kernel32.dll")]
private static extern IntPtr GetModuleHandle(string name);
// 这个函数只能接受ASCII,所以一定要设置CharSet = CharSet.Ansi,不然会失败
[DllImport("kernel32.dll", CharSet = CharSet.Ansi)]
private static extern IntPtr GetProcAddress(IntPtr hmod, string name);
private delegate void FarProc();
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
//SetProcessDPIAware(); // 不兼容XP
IntPtr hUser32 = GetModuleHandle("user32.dll");
IntPtr addrSetProcessDPIAware = GetProcAddress(hUser32, "SetProcessDPIAware");
if (addrSetProcessDPIAware != IntPtr.Zero)
{
FarProc SetProcessDPIAware = (FarProc)Marshal.GetDelegateForFunctionPointer(addrSetProcessDPIAware, typeof(FarProc));
SetProcessDPIAware();
}
// C#的原有代码
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
}</code>
200字以内,仅用于支线交流,主线讨论请采用回复功能。