概要

EnumFontFamiliesExを用いてフォントの一覧を標準出力に出力します。コマンドプロンプトで動作します。
以下に動作例を示します。フォントの数が多いので途中を一部省略して記述しています。
System  日本語 ラスターフォント
@System m 日本語 ラスターフォント
Terminal  日本語 ラスターフォント
@Terminal l 日本語 ラスターフォント
FixedSys  日本語 ラスターフォント
@FixedSys s 日本語 ラスターフォント
        ~
@HGPゴシックE 標準 日本語 TrueTypeフォント
HGSゴシックE 標準 日本語 TrueTypeフォント
@HGSゴシックE 標準 日本語 TrueTypeフォント
Arial Unicode MS Regular 日本語 TrueTypeフォント
@Arial Unicode MS Regular 日本語 TrueTypeフォント
154個のフォントが見つかりました。
いずれかのキーを押すと終了します。
          

テスト環境

コンパイラ

Visual C++ 2013 Express 32/64bit

プログラムソースの概要

_tmain関数

Windowsから最初に_tmain関数が呼び出されます。
ディスクトップのハンドルを取得しhdcに保存します。
LOGONT構造体に検索条件を設定してEnumFontFamiliesEx APIを呼び出します。
コールバック関数EnumFontFamProcがフォント1個に対して1回呼び出されますので、EnumFontFamProc関数側で標準出力に表示します。

EnumFontFamProc関数

フォントが見つかるたびに呼び出されるので引数よりフォントの種類等を調べて標準出力に出力します。

プログラムソース

// フォント名の一覧を標準出力に表示
// Visual C++ 2013 32/64bit

#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <locale.h>

int count;

int CALLBACK EnumFontFamProc(const LOGFONT * lpelf, const TEXTMETRIC FAR* lpntm, DWORD FontType, LPARAM lParam){
	ENUMLOGFONTEX *lpelfe = (ENUMLOGFONTEX  *)lpelf;
	TCHAR* ft=_TEXT("");
	switch (FontType){
	case DEVICE_FONTTYPE:
		ft = _TEXT("デバイスフォント");
		break;
	case RASTER_FONTTYPE:
		ft = _TEXT("ラスターフォント");
		break;
	case TRUETYPE_FONTTYPE:
		ft = _TEXT("TrueTypeフォント");
		break;
	}
	_tprintf(_TEXT("%s %s %s %s¥n"), lpelfe->elfFullName, lpelfe->elfStyle, lpelfe->elfScript,ft);
	++count;
	return 1;
}


void _tmain(void){
	//	UNICODE文字を標準出力に正しく表示させるためにロケールを設定
	_tsetlocale(LC_ALL, _TEXT(""));
	count = 0;
	LOGFONT lf;
	HDC hdc = GetDC(0);
	lf.lfFaceName[0] = _T('¥0'); // 全てのフォント名
	lf.lfPitchAndFamily = DEFAULT_PITCH;
	lf.lfCharSet = SHIFTJIS_CHARSET; 
	EnumFontFamiliesEx(hdc, &lf, (FONTENUMPROC)EnumFontFamProc, (LONG_PTR)&lf, 0);
	ReleaseDC(0, hdc);
	_tprintf(_TEXT("%d個のフォントが見つかりました。¥nいずれかのキーを押すと終了します。¥n"),count);
	getchar();
}

ソースファイルと実行ファイルのダウンロード

ダウンロード enumfont.zip(54.7kByte)
ZIPファイルに含まれるファイル
enumfont.cpp
enumfont.exe