Изменить настройки шрифта и масштабирования в Windows 10 - PullRequest
0 голосов
/ 31 мая 2019

Наша команда распространяет Windows 10, в которой некоторые функции заблокированы, но для которой мы предоставляем некоторую автоматизацию, одной из которых является изменение разрешения экрана.Меня попросили добавить возможность изменять настройки Дисплей , Увеличить текст и Сделать все больше .

Единственное решение, которое янатолкнулся требует переписать раздел реестра, а затем выйти из системы и затем снова включить.Кроме того, единственное решение, которое я видел, - это PowerShell или CMD.В настоящее время я работаю с .NET

Мои вопросы:

  • Есть ли лучший способ?Изменение реестра достаточно простое, но я бы не стал заставлять пользователей выходить из системы.
  • Несмотря на это, я бы предпочел сделать это в .NET, поэтому мне интересно, может ли кто-нибудь указать мне на существующий пример кода,или предоставьте один.

Пример 1

@echo off
reg add "HKCU\Control Panel\Desktop" /v LogPixels /t reg_dword /d 144
exit /b

Пример 2

cd 'HKCU:\Control Panel\Desktop'
Set-ItemProperty -Path . -Name LogPixels -Value 144
Set-ItemProperty -Path . -Name Win8DpiScaling -Value 1
Set-ItemProperty -Path . -Name FocusBorderHeight -Value 2
Set-ItemProperty -Path . -Name FocusBorderWidth -Value 2
Write-Host 'Sign out and sign back in again to see changes.

1 Ответ

0 голосов
/ 31 мая 2019

Не протестировано с изменениями настроек, но вы можете попробовать функцию ниже

function Refresh-Explorer {
    [CmdletBinding()]
    Param()

    $code = @'
private static readonly IntPtr HWND_BROADCAST = new IntPtr(0xffff); 
private const int WM_SETTINGCHANGE = 0x1a; 
private const int SMTO_ABORTIFHUNG = 0x0002; 

[System.Runtime.InteropServices.DllImport("user32.dll", SetLastError=true, CharSet=CharSet.Auto)]
static extern bool SendNotifyMessage(IntPtr hWnd, uint Msg, UIntPtr wParam, IntPtr lParam);

[System.Runtime.InteropServices.DllImport("user32.dll", SetLastError = true)] 
private static extern IntPtr SendMessageTimeout ( IntPtr hWnd, int Msg, IntPtr wParam, string lParam, uint fuFlags, uint uTimeout, IntPtr lpdwResult ); 

[System.Runtime.InteropServices.DllImport("Shell32.dll")] 
private static extern int SHChangeNotify(int eventId, int flags, IntPtr item1, IntPtr item2);

public static void Refresh() {
    SHChangeNotify(0x8000000, 0x1000, IntPtr.Zero, IntPtr.Zero);
    SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, IntPtr.Zero, null, SMTO_ABORTIFHUNG, 3000, IntPtr.Zero); 
}
'@

    Add-Type -MemberDefinition $code -Namespace MyWinAPI -Name Explorer 
    [MyWinAPI.Explorer]::Refresh()
}
...