Как вариант, вы можете перезапустить приложение и на основе параметра или аргумента командной строки решить, хотите ли вы установить поддержку процесса DPI.
Вы можете создать свойство настройки логического пользователя в файле Settings
в папке Properties
. Этот параметр определяет, включена ли поддержка DPI. Затем при запуске приложения проверьте, включена ли настройка, а затем позвоните SetProcessDPIAware
:
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
static class Program
{
[DllImport("user32.dll", SetLastError = true)]
static extern bool SetProcessDPIAware();
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
if (Environment.OSVersion.Version.Major >= 6 &&
Properties.Settings.Default.DPIAware)
SetProcessDPIAware();
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(true);
Application.Run(new Form1());
}
}
Также в основной форме пользовательского интерфейса вы можете проверить настройку и показать сообщение, подобное следующему, и позволить пользователю перезапустить приложение, включив или отключив поддержку DPI. Для этого достаточно установить значение настройки, сохранить настройки и позвонить Application.Restart()
:
private void Form1_Load(object sender, EventArgs e)
{
if (Properties.Settings.Default.DPIAware)
toolStripLabel1.Text = "DPI-awareness is enabled. Restart to disable DPI-awareness.";
else
toolStripLabel1.Text = "DPI-awareness is disabled. Restart to enable DPI-awareness.";
}
private void toolStripLabel1_Click(object sender, EventArgs e)
{
Properties.Settings.Default.DPIAware = !Properties.Settings.Default.DPIAware;
Properties.Settings.Default.Save();
Application.Restart();
}
Не забудьте создать настройки DPIAware, которые сообщат нам, хотим ли мы вызвать SetProcessDPIAware
в методе main
: