HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2021
0926
ねんねこドライブ:\Users\ユーザー名\AppData\Local\Microsoft\Windows\Fontsの中身を取得したい11解決


ねんねこ

リンク

2021/9/26(Sun) 10:42:31|NO.93974

ドライブ:\Users\ユーザー名\AppData\Local\Microsoft\Windows\Fontsの中身を取得したいです
どうすれば良いですか



この記事に返信する


ねんねこ

リンク

2021/9/26(Sun) 10:43:45|NO.93975

一応ソースはこれです

#include "user32.as" dir=dirinfo($1001A) dialog dir chdir dir dialog dir_cur chdir ".." dialog dir_cur chdir "Local\Microsoft\Windows\Fonts" dirlist list,"k8x12s.ttf" if list=""{ MessageBox hwnd,"フォント k8x12s.ttfがインストールされていません\nフォントはFontフォルダにあります","ERROR",16:end } font "k8x12S",20



zrs90(5さい)

リンク

2021/9/26(Sun) 11:42:02|NO.93978

① フォントを見たいだけなら
exec "fonts",16

...または、フリーソフトを使って閲覧する。


② フォントを指定したいならHSP3.6では
色指定が出来ない等のバグがありますが
mod_fontdlg.asを使う。
(解決法と原因?は最近の掲示板の中にあります)


③ フォントファイルの存在自体を知りたいなら
私なら、標準命令の exist 命令を使います。

①から③の中に、使える回答があれば
良いですが。



UT-X

リンク

2021/9/26(Sun) 11:45:38|NO.93980

Windows10の場合、インストールされているフォントは C:\Windows\Fonts にあります。
#include "user32.as"
chdir "C:\\Windows\\Fonts" dirlist list,"k8x12s.ttf" if list=""{ MessageBox hwnd,"フォント k8x12s.ttfがインストールされていません\nフォントはFontフォルダにあります","ERROR",16:end } font "k8x12S",20



沢渡

リンク

2021/9/26(Sun) 12:12:00|NO.93981

まず、文字列の中に「\」を含めたいのなら、「\\」と2個連続で書く必要があります。
それから、フォントのインストール場所ですが、
「C:\Users\ユーザー名\AppData\Local\Microsoft\Windows\Fonts」と
「C:\Windows\Fonts」の2箇所がありますので、ユーザーフォルダだけを
チェックしてもそれだけでは足りません。
(実際私の環境でも「C:\Users\ユーザー名\AppData\Local\Microsoft\Windows」に
 Fontsというフォルダはありませんでした)
また、ユーザー名にUnicodeが含まれている場合ですと、
hsp3utfを利用しないと、普通のやり方ではフォルダにアクセスすることはできません。
(アクセスできないこともないが、WinAPIを駆使するなど、だいぶ話が面倒になる)

「フォントを同梱し、そのフォントを使いたい」ということなら、
私が過去に「インストールなしでフォントを使用するモジュール」を
作りましたので、それを利用するのはどうでしょうか?

//フォントをインストールせずに使用するモジュール #include "gdi32.as" #module #const use_fonts 10 //登録できるフォントの最大数(変更可能) #const global FR_PRIVATE 0x10 //「登録したフォントをこのプログラムだけで使用する」オプション #const global FR_NOT_ENUM 0x20 //「登録したフォントがフォント選択ダイアログ等で表示されないようにする」オプション #deffunc font_file_init l_flag=0 dim l_opt,use_fonts sdim l_name,64,use_fonts return //font_file p1,p2,p3 //指定したファイル名のフォントを一時的に使えるように登録する。 //p1はフォントのファイル名。 //p2を1にした場合はこれまでの登録を解除。(省略時は0) //p3はFR_PRIVATEかFR_NOT_ENUMか、もしくは0かを指定。(省略時はFR_PRIVATEとFR_NOT_ENUMの両方とも有効) #define global font_file(%1,%2=0,%3=0x30) _font_file %1,%2,%3 #deffunc _font_file str file,int cl_flag,int opt if cl_flag : font_clean if l_flag>=use_fonts : return 0 l_opt(l_flag)=opt l_name(l_flag)=file l_flag++ AddFontResourceEx file,opt,0 if stat=0 : l_flag-- return stat #deffunc font_clean onexit repeat if l_flag<=0 : break l_flag-- RemoveFontResourceEx l_name(l_flag),l_opt(l_flag),0 loop return #global font_file_init //←最初に実行する //以下、使用例 //サブフォルダ「font」に「k8x12S.ttf」があるものとする。 font_file "font\\k8x12S.ttf" //フォントのファイル名を指定 font "k8x12S",20 mes "東京特許許可局"



ねんねこ

リンク

2021/9/26(Sun) 12:16:28|NO.93982

ありがとうございます。解決しました。



zrs90(5さい)

リンク

2021/9/26(Sun) 13:04:28|NO.93987

私も勉強になりました。
皆様、ありがとうございました。

沢渡さんの回答は、os環境によるフォント
ディレクトリの違い等や、フォントがない
環境への配慮までしてあり、すごいです。
後、ソースの可視性や、コメントが読みやすい
ので、回答されている時は時々
参考にさせてもらってます。



GENKI

リンク

2021/9/26(Sun) 14:50:12|NO.93990

もう解決しているようですが、ちょっと気になったので調べました。
環境変数を使うとこんな書き方ができます。

#include "hspinet.as" getenv flder, "LOCALAPPDATA" chdir flder + "\\Microsoft\\Windows\\Fonts" dirlist list,"k8x12s.ttf" if list=""{ dialog "フォント k8x12s.ttfがインストールされていません\nフォントはFontフォルダにあります", 1, "ERROR" end } font "k8x12S",20
フォントフォルダは環境変数に設定されてないんですね。


環境変数が設定されていない特殊フォルダへのパスを取得する方法もありました。
CSIDL 値という値を使って SHGetFolderPathA 関数を使うといいようです。この方法ならWindowsのバージョンに関係なく取得できるはずです。

#include "shell32.as" ; http://chokuto.ifdef.jp/urawaza/prm/CSIDL.html #define CSIDL_FONTS 0x0014 flder = "" ; http://chokuto.ifdef.jp/urawaza/api/SHGetFolderPath.html SHGetFolderPath hwnd, CSIDL_FONTS, 0, 0, varptr(flder) mes "パス:" + flder

font命令使ってみてstatが -1 なら存在していないフォント…とも考えたんですが、ほとんどの場合は代用のフォントが割り当てられてしまって 0 になっちゃうんですよね。ちょっと困る仕様。



zrs90(5さい)

リンク

2021/9/26(Sun) 16:02:16|NO.93991

GENKIさん 以前、emes の投稿の件では
お世話になりました。
今回の投稿を見て、思い出した事が
あったので、私も、また書きます。

ウチの環境だけかも、知れませんが
hspext.dll で
ヘルプには載ってないんですが

#include "hspext.as"
sdim a,260
fxdir a.20
mes ""+a

...で、フォントのディレクトリが表示されました。
他の特殊ディレクトリも、別の数値入れたら表示されます。

repeat〜loopで0〜64回程廻したら何十個か表示されました。
結構、意外な特殊ディレクトリが確保出来るようです。

飛んでる数値や、ダブり?もあります。
後、廻す数ですが64以上指定してもムダ。
Windows8/10は分かりませんが。

ただし、公式には、載ってないので、使えなくなる可能性が
あります。



zrs90(5さい)

リンク

2021/9/26(Sun) 16:15:23|NO.93992

訂正。
 fxdir a,20
です。. と , を間違えました。
申し訳ありません。



GENKI

リンク

2021/9/26(Sun) 21:00:36|NO.93993

>> zrs90(5さい) さん
ありがとうございます。
あ、本当だ。CSIDL 値と対応しているようなので中身は同じっぽいですね。この命令は知りませんでした。
ダブリなどは引数が正しくない場合なので、stat値を見て弾けばいいようです。

#include "hspext.as" sdim a,260 s = "" repeat 0x30 + 1 fxdir a,cnt if stat = 0 : s += strf("0x%02X", cnt) + " " + a + "\n" loop mesbox s, ginfo_winx, ginfo_winy
fxdir命令の説明を充実してほしいですね。

となると回答例はこうか。(もう解決してるけど今後同じ事で悩む方のために記載。)

#include "hspext.as" ; フォントフォルダ sdim f,260 fxdir f, 0x14 ; フォント検索 chdir f dirlist list, "k8x12s.ttf" if list = ""{ dialog "フォント k8x12s.ttfがインストールされていません\nフォントはFontフォルダにあります", 1, "ERROR" end } font "k8x12S",20



zrs90(5さい)

リンク

2021/9/26(Sun) 22:05:06|NO.93994

私がコレに気がついたのは、HSP3.32の頃
ヤケクソになって、repeat〜loopに
つっこんだら、何故か、エラーにならず
色々な、フォルダが取得出来たんで
驚きました。...ソースはpc内に置いてあったんですが
今回の件がなければ、完全に忘れてました。
...動作確認、ありがとうございます。

ただ、沢渡さんが書いていたように、ユニコードの対応や
osインストール状態の違い等による、フォントフォルダが
違う場合はどうなるか、分かりません。



ONION software Copyright 1997-2025(c) All rights reserved.