Как быстро зарегистрировать в 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;
}