获取系统已安装字体?该如何处理
获取系统已安装字体?
去年做的东西,需要获取系统当期已经安装的字体名称,通过查询注册表实现,程序运行正常。但是今天测试莫名其妙不行了。程序已经用管理员身份执行,注册表可以打开,但是RegEnumValue()返回失败,并且返回值每次都不一样:
郁闷阿,请大侠出手。
------解决思路----------------------
出错时,GetLastError获取的错误码是什么
------解决思路----------------------
retval = RegEnumValue(。。。);
这里的retval的返回值是什么?对应的MSDN看看
------解决思路----------------------
EnumFonts
https://msdn.microsoft.com/en-us/library/dd162622
------解决思路----------------------
去年做的东西,需要获取系统当期已经安装的字体名称,通过查询注册表实现,程序运行正常。但是今天测试莫名其妙不行了。程序已经用管理员身份执行,注册表可以打开,但是RegEnumValue()返回失败,并且返回值每次都不一样:
LONG Ctest::GetNextNameValue(HKEY key, LPCTSTR subkey, LPTSTR szName, LPTSTR szData)
{
HKEY hkey = NULL;
DWORD dwIndex = 0;
LONG retval;
if (subkey == NULL && szName == NULL && szData == NULL)
{
if (hkey)
RegCloseKey(hkey);
hkey = NULL;
return ERROR_SUCCESS;
}
if (subkey && subkey[0] != 0)
{
retval = RegOpenKeyEx(key, subkey, 0, KEY_ALL_ACCESS, &hkey);
if (retval != ERROR_SUCCESS)
{
//TRACE(_T("RegOpenKeyEx failed\n"));
MessageBox(NULL, _T("RegOpenKeyEx failed!"), NULL, 0);
return retval;
}
else
{
MessageBox(NULL, _T("RegOpenKeyEx succeed!"), NULL, 0);
}
dwIndex = 0;
}
else
{
dwIndex++;
}
ASSERT(szName != NULL && szData != NULL);
*szName = 0;
*szData = 0;
TCHAR szValueName[MAX_PATH];
DWORD dwValueNameSize = sizeof(szValueName)-1;
TCHAR szValueData[MAX_PATH];
DWORD dwValueDataSize = sizeof(szValueData)-1;
DWORD dwType = 0;
memset(szValueName, 0, sizeof(szValueName));
memset(szValueData, 0, sizeof(szValueData));
retval = RegEnumValue(hkey, dwIndex, szValueName, &dwValueNameSize, NULL,
&dwType, (LPBYTE)szValueData, &dwValueDataSize);
if (retval == ERROR_SUCCESS)
{
lstrcpy(szName, szValueName);
lstrcpy(szData, szValueData);
}
else
{
CString str;
str.Format(_T("RegEnumValue failed! return value = 0x%x", retval));
MessageBox(NULL, str, NULL, 0);
}
return retval;
}
郁闷阿,请大侠出手。
------解决思路----------------------
出错时,GetLastError获取的错误码是什么
------解决思路----------------------
retval = RegEnumValue(。。。);
这里的retval的返回值是什么?对应的MSDN看看
------解决思路----------------------
EnumFonts
https://msdn.microsoft.com/en-us/library/dd162622
------解决思路----------------------
int CALLBACK EnumFontFamExProc(
ENUMLOGFONTEX *lpelfe, // pointer to logical-font data
NEWTEXTMETRICEX *lpntme, // pointer to physical-font data
int FontType, // type of font
LPARAM lParam // application-defined data
)
{
CEdit* pEdit=(CEdit*)lParam;
lpelfe->elfFullName;
int L=pEdit->GetWindowTextLength();
pEdit->SetSel(L,L);
if(L>0)
{
pEdit->ReplaceSel(_T("\n"));
L=pEdit->GetWindowTextLength();
pEdit->SetSel(L,L);
}
pEdit->ReplaceSel(lpelfe->elfFullName);
return 1;
}
void CEnumFontsTestDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
LOGFONT lf;
lf.lfCharSet=DEFAULT_CHARSET;
lf.lfFaceName[0]=0;
lf.lfPitchAndFamily=0;
CDC* pDC=GetDC();
EnumFontFamiliesEx(pDC->m_hDC,&lf,(FONTENUMPROC)EnumFontFamExProc,(LPARAM)&TxEdit,0);//TxEdit:CEdit类对象
ReleaseDC(pDC);
}