FontList Plus

martyn-k

New Member
Есть такой скрипт FontList Plus. Как он получил список всех шрифтов???
Т е я хочу дать пользователю навыбирать своих любимых шрифтов, но не из тех, что перечислены мной в теле скрипта, а из тех шрифтов, которые У ПОЛЬЗОВАТЕЛЯ установлены. Но для этого через скрипт нужно получить список всех системных шрифтов. К это сделать??
 

Rey

New Member
Через Flash компонент.
Уже никак, Flash не поддерживается в новых версиях.
 

martyn-k

New Member
угу. так и есть. проверил. не работает.
Мой товарищ каким-то скриптом из афтера калькулятор запускал. Не может ли такое внешнее взаимодействие помочь? Например запустить из афтера батник, или флеш, который exe? Чтоб флеш не встраивался, а раз он умеет получать список шрифтов, то выудить из него список.
 

Rey

New Member
Может.
Код:
var cmd = '"' + fullPathToOSFontsExe + '" ' + param;
var oSFonts = system.callSystem(cmd);
 

martyn-k

New Member
Спасибо. До решения пока ни руки ни мозги не доходят.
Из того, что выдает списокк шрифтов (из простых ср
[System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
(New-Object System.Drawing.Text.InstalledFontCollection).Familiesot;System.Drawing")
(New-Object System.Drawing.Text.InstalledFontCollection).Families

(Пока не могу записать список ни в файл, ни как-от иначе использовать, print">
syst
system.callSystem("cmd.exe /c cscript.exe D:\ae\scripts\TEST_TEMP_SCRIPTS\fonts/p>


const HKEY_LOCAL_MACHINE = &H80000002

strKeyPath = "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts"

Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")


wscript.echo "File Name" & vbTab & vbTab & "Font Family Name"

wscript.echo "---------------------------------------------------------------"


oReg.EnumValues HKEY_LOCAL_MACHINE, strKeyPath, arrValueNames

For each strValueName in arrValueNames

oReg.GetStringValue HKEY_LOCAL_MACHINE,strKeyPath,strValueName,strValue

wscript.echo strValue & vbTab & vbTab & ValueName in arrValueNames

oReg.GetStringValue HKEY_LOCAL_MACHINE,strKeyPath,strValueName,strValue

wscript.echo strValue & vbTavbTab & ValueName in arrValueNames

oReg.GetStringValue HKEY_LOCAL_MACHINE,strKeyPath,strValueName,strValue

wscript.echo strValue & vbTa
Все одним блоком опубликовалось. Вот линки на ресурсы по теме, кому интересно
http://superuser.com/questions/760627/how-to-list-installed-font-families
https://www.experts-exchange.com/questions/23948739/List-font-names-and-their-appropriate-family-font-names.html
 

martyn-k

New Member
Кому интересно, как получить список шрифтов в Windows (в маке не знаю, возможно ли):

var fonts_arr = get_font_list (false).replace(/& /g, "\n").split("\n");
var w = new Window("palette {preferredSize: [300, 200]}", "", undefined, {resizeable:true});
w.add("dropdownlist", undefined, fonts_arr);
w.show();

function get_font_list (replace)
{
var data_folder_name = "u_data";
var fonts_file_name = "font_list.txt";
var script_name = "get_fonts.vbs";
if ($.os.indexOf("Windows") != -1)
{
var data_folder = new Folder("~" + "\\" + data_folder_name);
if (!data_folder.exists) data_folder.create();

var data_folder_fs_name = data_folder.fsName.replace(/\\/g, "\\\\");

var system_fonts_folder = Folder(Folder.system.parent.fsName + "\\Fonts");

var font_list_file = new File(data_folder_fs_name + "\\" + fonts_file_name);

if (font_list_file.exists && (font_list_file.modified.getTime() > system_fonts_folder.modified.getTime()))
{
return read_txt (font_list_file);
}

var script_fs_name = data_folder_fs_name + "\\" + script_name;

var script_file = new File(script_fs_name);
if (!script_file.exists)
{
var vbs_code = 'GetObject("winmgmts:{impersonationLevel=impersonate}!\\\\.\\root\\default:StdRegProv")._\
EnumValues &H80000002, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Fonts", arrNames\
n = UBound(arrNames)\
Do\
nn = -1\
For j = LBound(arrNames) to n - 1\
If arrNames(j) > arrNames(j + 1) Then : TempValue = arrNames(j + 1) : arrNames(j + 1) = arrNames(j) : arrNames(j) = TempValue : nn = j : End If\
Next\
n = nn\
Loop Until nn = -1\
For Each Name In arrNames : strValue = strValue & vbCrLf & Name : Next\
CreateObject("Scripting.FileSystemObject").CreateTextFile("' + data_folder_fs_name + '\\\\' + fonts_file_name + '",1).Write Mid(strValue, 2)';
script_file.open("w");
script_file.write(vbs_code);
script_file.close();
}
system.callSystem("wscript.exe " + data_folder_fs_name + "\\" + script_name);
return read_txt (font_list_file);
}
else
{
//system.callSystem();//тут пока пусто
}
}

function read_txt (txt_file)
{
txt_file.open("r");
var content = txt_file.read();
txt_file.close();
return content;
}


Самую сложную часть помогли вот тут: http://forum.script-coding.com/viewtopic.php?pid=113004#p113004
Там же можно заглянуть в детали.
 
  • Like
Реакции: Rey

Rey

New Member
Серьезная работа. :up:
А напрямую (без записи в файл) можно ответ от VBS получить?
 

martyn-k

New Member
Спасибо, Rey, Вы ж задали направление!
Да, можно код VBS или JS впихнуть напрямую в system.callSystem(), но мне было сложно правильно передать параметры, а это строка в строке в строке.., да и чувствитьельное оно, короче, я устал экспериментировать...
Еще бы такое придумать и для мака... :)
 
Верх