Visual Studio: Шрифт для фрагмента кода в HelpViewer (часть 3)

Впервые я столкнулся с проблемой некорректного отображения шрифтов в HelpViewer, еще когда у меня был Windows 7. Когда я установил Windows 10, это решение мне не подошло, т.к. для отображения фрагментов исходного кода (Source code snippet) на этот раз HelpViewer использовал защищенный системный шрифт Times New Roman (times.ttf), a не batang.ttf. Я его конечно мог удалить, хоть это было несколько сложнее, чем удалять обычный шрифт, но это бы не спасло ситуацию, т.к. глючный HelpViewer сразу же начинал использовать следующий шрифт, который по его мнению «очень удачно» подходил для отображения исходного кода. Этим следующим шрифтом уже был курсив Times New Roman, потом жирный курсив и т.д.
А использовать файл стилей ie.css я не хотел, т.к. после его применения фрагмент кода становился нормальным, а весь остальной текст становился Times New Roman…
Разработчики из отдела HelpViewer в принципе знают об этом баге, но что-то не торопятся его исправлять.

После еще одного долгого копания в реестре и использовании Process Monitor, выяснилось, что баг связан с некорректной обработкой данных «System locale…».
Теперь стало «легче». То есть, для того, чтобы HelpViewer отображал фрагмент кода шрифтом БЕЗ засечек, нужно было установить язык системы на английский.
В принципе, об этом я писал еще в первой части, сейчас же это лишь подтвердилось на примере. В этот раз я решил найти более простое решение для этой задачи…

После обновления KB3124200 этот метод уже не работает! То есть для смены языка системы требуется перезагрузить компьютер, а значит придется выбирать английский язык, если хочется отображать нормальный шрифт в текстах исходных кодов

1. В текстовом редакторе создаем PowerShell скрипт ResetSystemLocale.ps1:

Set-WinSystemLocale en-US
Set-WinSystemLocale ru-RU

Здесь мы устанавливаем Язык системы сначала на Английский, а потом на тот, в котором будем работать (у меня это русский).

2. Открываем Планировщик заданий:

taskschd.exe

3. Создаем задачу «Reset System Locale»: с помощью пункта Create Task
4. На вкладке General отмечаем галочкой пункт «Run with highest privileges»:
ResetSystemLocale01
5. На вкладке Triggers создаем триггер, который будет запускать наш скрипт при входе пользователя в систему:
ResetSystemLocale02
6. На вкладке Actions указываем действие для триггера:
ResetSystemLocale03

Правда здесь нужно не напрямую указывать наш скрипт из пункта 1, а в качестве программы указываем строку:

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe

А в качестве аргумента к ней указываем путь до нашего скрипта (я его сохранил в папку Windows\System32:

C:\Windows\System32\ResetSystemLocale.ps1

Если вы пытаетесь запустить скрипт из папки, путь до которой содержит в имени пробелы, то нужно использовать короткое имя (Посмотреть его можно командой dir /x. Например для «Program files (x86)» в моей системе ее короткое имя PROGRA~2)

Если в системе установлено ограничение на запуск только подписанных скриптов, то скрипт нужно подписать!

Теперь при входе пользователя в систему происходит установка языка системы сначала английского, потом русского (я настроил триггеры только для входе моего пользователя, для всех остальных скрипт не запускается). Это позволяет HelpViewer думать, что мы сидим в Windows с языком системы English US, при этом это никак не отражается на деятельности других программ.

Если скрипт запускать не через планировщик, а вручную, то изменения в отображении шрифтов будут видны сразу же после его запуска!