Есть ли обратная функция SetProcessDPIAware с поддержкой Windows 7?Или как вернуться к тому, что было? - PullRequest
2 голосов
/ 29 апреля 2019

Я использую функцию SetProcessDPIAware() из user32.dll в моем приложении WinForms. После вызова SetProcessDPIAware() мне нужно вернуться к предыдущей осведомленности о DPI для этого процесса.

Я прочитал статью Настройка поддержки DPI по умолчанию для процесса . SetProcessDpiAwareness() и SetProcessDpiAwarenessContext() не работают с Windows 7 или Windows Vista.

Как мне вернуться к предыдущему значению DPI для процесса после вызова SetProcessDPIAware() для него?

1 Ответ

0 голосов
/ 29 апреля 2019

Как вариант, вы можете перезапустить приложение и на основе параметра или аргумента командной строки решить, хотите ли вы установить поддержку процесса 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():

enter image description here

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:

enter image description here

...