Поделиться через


Как быстро зарегистрировать в Windows шрифт, а затем быстро удалить его по месту расположения

Зачем это мне было нужно

Создавал я шрифт в редакторе шрифтов, а потом проверял, как он отображается в другой программе. Проверку я делал чуть-ли не для каждого символа. Поэтому приходилось выполнять множество таких операций, как: установка шрифта в систему, удаление шрифта из системы. Делать это с помощью стандартных средств Windows было несложно, но муторно - из-за большого количества повторяющихся операций. Требовалось минимизировать количество кликов во избежание закипания серого вещества.

Решение

 В недрах Windows API были найдены две функции - AddFontResource и RemoveFontResource. При помощи Visual Studio были созданы две простые программки на С++, использующие их (как автор, разрешаю их использовать, как вам заблагорассудится): AddFont.exe - для регистрации шрифта в системе; RemoveFont.exe - для удаления шрифта из системы.

Использование программ

Обозначим путь, по которому находятся программы как <Program path>, а шрифт aFont.ttf, который нужно зарегистрировать/удалить из системы, находится по пути, обозначенному как <Font Path>.
 Тогда ,для регистрации шрифта, нужно в командной строке набрать:
<Program path>\AddFont.exe <Font Path>\aFont.ttf
или, если в путях и именах содержатся пробелы
"<Program path>\AddFont.exe" "<Font Path>\aFont.ttf "

Для удаления шрифта из системы (физически файл шрифта не удаляется) набираем:
<Program path>\RemoveFont.exe <Font Path>\aFont.ttf
или, если в путях и именах содержатся пробелы
"<Program path>\RemoveFont.exe" "<Font Path>\aFont.ttf "

Для этих же команд, можно создать ярлыки на рабочем столе, а ярлыкам присвоить горячие клавиши. Так что регистрация в системе и удаление шрифта из системы будут происходить за доли секунды по нажатию соответствующих горячих клавиш.

Файл шрифта всегда остаётся там, где был и ни куда не копируется.

Код программ

// AddFont.cpp
#include "stdafx.h"
#include <iostream>

int _tmain(int argc, _TCHAR* argv[])
{
    if (argc==1)
    {
        std::cout<<"No parameters"<<std::endl;
        MessageBox(NULL,L"Первым параметром должен быть путь к файлу шрифта!",L"НЕУДАЧА",MB_ICONWARNING);
     return 1;
    }
    PWSTR pwsFontPath=argv[1];   // путь к файлу шрифта
    
    int numAddedFonts=AddFontResource(pwsFontPath);
    if(numAddedFonts>0)
    {
     SendMessage(HWND_BROADCAST,WM_FONTCHANGE,0,0);
     std::cout<<"Added "<<numAddedFonts<<" font"<<std::endl;
    }else
    {
     std::cout<<"No font added"<<std::endl;
     MessageBox(NULL,L"Этот шрифт не установился!\nМожет такой уже установлен?",pwsFontPath,MB_ICONWARNING);
     return 2;
    }
    return 0;
}


// RemoveFont.cpp

#include "stdafx.h"
#include <iostream>

int _tmain(int argc, _TCHAR* argv[])
{
    if (argc==1)
    {
        std::cout<<"No parameters"<<std::endl;
        MessageBox(NULL,L"Первым параметром должен быть путь к файлу шрифта!",L"НЕУДАЧА",MB_ICONWARNING);
     return 1;
    }
    PWSTR pwsFontPath=argv[1];   // путь к файлу шрифта
    if(RemoveFontResource(pwsFontPath))
    {
     SendMessage(HWND_BROADCAST,WM_FONTCHANGE,0,0);
     std::cout<<"Font removed"<<std::endl;
     //если был установлен несколько раз, делаем соответствующее количество удалений
     while(RemoveFontResource(pwsFontPath))
     {
      SendMessage(HWND_BROADCAST,WM_FONTCHANGE,0,0);
      std::cout<<"Font removed"<<std::endl;     
     }
    }else
    {
     std::cout<<"Font NOT removed"<<std::endl;
     MessageBox(NULL,L"Этот шрифт не удалился!\nМожет он и не был установлен?",L"НЕУДАЧА",MB_ICONWARNING);
     return 2;
    }

    return 0;
}