BOOL WINAPI CXTPSkinManagerApiHook::OnHookSystemParametersInfoA(UINT uiAction, UINT uiParam, PVOID pvParam, UINT fWinIni){
XTP_SKINFRAMEWORK_MANAGE_STATE();
CXTPSkinManagerApiFunction* pFunction = EnterHookedCall(xtpSkinApiSystemParametersInfoA);
if (NULL == pFunction)
{
return FALSE;
}
typedef BOOL(WINAPI* LPFNSYSTEMPARAMETERSINFO)(UINT uiAction, UINT uiParam, PVOID pvParam, UINT fWinIni);
BOOL bResult = ((LPFNSYSTEMPARAMETERSINFO)pFunction->m_pfnOrig)(uiAction, uiParam, pvParam, fWinIni);
XTP_GUARD_SHARED_(CXTPSkinManager, XTPSkinManager(), pSkinManager)
{
if (!pSkinManager->IsEnabled() || pSkinManager->GetMetrics()->m_bRefreshMetrics)
return bResult;
if (!pSkinManager->HasApplyOptions(xtpSkinApplyMetrics | xtpSkinApplyColors | xtpSkinApplyFrame))
return bResult;
if (uiAction == SPI_GETICONTITLELOGFONT && uiParam == sizeof(LOGFONTA))
{
#ifndef _UNICODE
LOGFONTA* pLogFont = reinterpret_cast<LOGFONTA*>(pvParam);
ASSERT(NULL != pLogFont);
#else
LOGFONTW logFont;
LOGFONTW* pLogFont = &logFont;
#endif
XTP_GUARD_SHARED_(CXTPSkinManagerSchema, XTPSkinManager()->GetSchema(), pSchema)
{
UINT nSysMetrics = pSchema->GetClassCode(_T("SYSMETRICS"));
pSchema->GetFontProperty(nSysMetrics, 0, 0, TMT_ICONTITLEFONT, *pLogFont);
#ifdef _UNICODE
LOGFONTA* pLogFontA = reinterpret_cast<LOGFONTA*>(pvParam);
ASSERT(NULL != pLogFontA);
memcpy(pLogFontA, pLogFont, offsetof(LOGFONTA, lfFaceName));
WCSTOMBS_S(pLogFontA->lfFaceName, pLogFont->lfFaceName, _countof(pLogFontA->lfFaceName));
#endif
}
}
if (uiAction == SPI_GETNONCLIENTMETRICS && uiParam == sizeof(NONCLIENTMETRICSA))
{
XTP_GUARD_SHARED_(CXTPSkinManagerSchema, XTPSkinManager()->GetSchema(), pSchema)
{
UINT nSysMetrics = pSchema->GetClassCode(_T("SYSMETRICS"));
LOGFONT lfMenuFont, lfStatusFont, lfCaptionFont, lfSmCaptionFont;
pSchema->GetFontProperty(nSysMetrics, 0, 0, TMT_MENUFONT, lfMenuFont);
pSchema->GetFontProperty(nSysMetrics, 0, 0, TMT_STATUSFONT, lfStatusFont);
pSchema->GetFontProperty(nSysMetrics, 0, 0, TMT_CAPTIONFONT, lfCaptionFont);
pSchema->GetFontProperty(nSysMetrics, 0, 0, TMT_SMALLCAPTIONFONT, lfSmCaptionFont);
NONCLIENTMETRICSA* pncm = reinterpret_cast<NONCLIENTMETRICSA*>(pvParam);
ASSERT(NULL != pncm);
#ifndef _UNICODE
memcpy(&pncm->lfMenuFont, &lfMenuFont, sizeof(LOGFONTA));
memcpy(&pncm->lfStatusFont, &lfStatusFont, sizeof(LOGFONTA));
memcpy(&pncm->lfCaptionFont, &lfCaptionFont, sizeof(LOGFONTA));
memcpy(&pncm->lfSmCaptionFont, &lfSmCaptionFont, sizeof(LOGFONTA));
#else
memcpy(&pncm->lfMenuFont, &lfMenuFont, offsetof(LOGFONTA, lfFaceName));
WCSTOMBS_S(pncm->lfMenuFont.lfFaceName, lfMenuFont.lfFaceName, _countof(pncm->lfMenuFont.lfFaceName));
memcpy(&pncm->lfStatusFont, &lfStatusFont, offsetof(LOGFONTA, lfFaceName));
WCSTOMBS_S(pncm->lfStatusFont.lfFaceName, lfStatusFont.lfFaceName, _countof(pncm->lfStatusFont.lfFaceName));
memcpy(&pncm->lfCaptionFont, &lfCaptionFont, offsetof(LOGFONTA, lfFaceName));
WCSTOMBS_S(pncm->lfCaptionFont.lfFaceName, lfCaptionFont.lfFaceName, _countof(pncm->lfCaptionFont.lfFaceName));
memcpy(&pncm->lfSmCaptionFont, &lfSmCaptionFont, offsetof(LOGFONTA, lfFaceName));
WCSTOMBS_S(pncm->lfSmCaptionFont.lfFaceName, lfSmCaptionFont.lfFaceName, _countof(pncm->lfSmCaptionFont.lfFaceName));
#endif
}
}
}
return bResult;
}
BOOL WINAPI CXTPSkinManagerApiHook::OnHookSystemParametersInfoW(UINT uiAction, UINT uiParam, PVOID pvParam, UINT fWinIni)
{
XTP_SKINFRAMEWORK_MANAGE_STATE();
CXTPSkinManagerApiFunction* pFunction = EnterHookedCall(xtpSkinApiSystemParametersInfoW);
if (NULL == pFunction)
{
return FALSE;
}
typedef BOOL(WINAPI* LPFNSYSTEMPARAMETERSINFO)(UINT uiAction, UINT uiParam, PVOID pvParam, UINT fWinIni);
BOOL bResult = ((LPFNSYSTEMPARAMETERSINFO)pFunction->m_pfnOrig)(uiAction, uiParam, pvParam, fWinIni);
XTP_GUARD_SHARED_(CXTPSkinManager, XTPSkinManager(), pSkinManager)
{
if (!pSkinManager->IsEnabled() || pSkinManager->GetMetrics()->m_bRefreshMetrics)
return bResult;
if (!pSkinManager->HasApplyOptions(xtpSkinApplyMetrics | xtpSkinApplyColors | xtpSkinApplyFrame))
return bResult;
if (uiAction == SPI_GETICONTITLELOGFONT && uiParam == sizeof(LOGFONTW))
{
#ifdef _UNICODE
LOGFONTW* pLogFont = reinterpret_cast<LOGFONTW*>(pvParam);
ASSERT(NULL != pLogFont);
#else
LOGFONTA logFont;
LOGFONTA* pLogFont = &logFont;
#endif
XTP_GUARD_SHARED_(CXTPSkinManagerSchema, XTPSkinManager()->GetSchema(), pSchema)
{
UINT nSysMetrics = pSchema->GetClassCode(_T("SYSMETRICS"));
pSchema->GetFontProperty(nSysMetrics, 0, 0, TMT_ICONTITLEFONT, *pLogFont);
#ifndef _UNICODE
LOGFONTW* pLogFontW = reinterpret_cast<LOGFONTW*>(pvParam);
ASSERT(NULL != pLogFontW);
memcpy(pLogFontW, pLogFont, offsetof(LOGFONT, lfFaceName));
MBSTOWCS_S(pLogFontW->lfFaceName, pLogFont->lfFaceName, _countof(pLogFontW->lfFaceName));
#endif
}
}
if (uiAction == SPI_GETNONCLIENTMETRICS && uiParam == sizeof(NONCLIENTMETRICSW))
{
XTP_GUARD_SHARED_(CXTPSkinManagerSchema, XTPSkinManager()->GetSchema(), pSchema)
{
UINT nSysMetrics = pSchema->GetClassCode(_T("SYSMETRICS"));
LOGFONT lfMenuFont, lfStatusFont, lfCaptionFont, lfSmCaptionFont;
pSchema->GetFontProperty(nSysMetrics, 0, 0, TMT_MENUFONT, lfMenuFont);
pSchema->GetFontProperty(nSysMetrics, 0, 0, TMT_STATUSFONT, lfStatusFont);
pSchema->GetFontProperty(nSysMetrics, 0, 0, TMT_CAPTIONFONT, lfCaptionFont);
pSchema->GetFontProperty(nSysMetrics, 0, 0, TMT_SMALLCAPTIONFONT, lfSmCaptionFont);
NONCLIENTMETRICSW* pncm = reinterpret_cast<NONCLIENTMETRICSW*>(pvParam);
ASSERT(NULL != pncm);
#ifdef _UNICODE
memcpy(&pncm->lfMenuFont, &lfMenuFont, sizeof(LOGFONTW));
memcpy(&pncm->lfStatusFont, &lfStatusFont, sizeof(LOGFONTW));
memcpy(&pncm->lfCaptionFont, &lfCaptionFont, sizeof(LOGFONTW));
memcpy(&pncm->lfSmCaptionFont, &lfSmCaptionFont, sizeof(LOGFONTW));
#else
memcpy(&pncm->lfMenuFont, &lfMenuFont, offsetof(LOGFONTW, lfFaceName));
MBSTOWCS_S(pncm->lfMenuFont.lfFaceName, lfMenuFont.lfFaceName, _countof(pncm->lfMenuFont.lfFaceName));
memcpy(&pncm->lfStatusFont, &lfStatusFont, offsetof(LOGFONTW, lfFaceName));
MBSTOWCS_S(pncm->lfStatusFont.lfFaceName, lfStatusFont.lfFaceName, _countof(pncm->lfStatusFont.lfFaceName));
memcpy(&pncm->lfCaptionFont, &lfCaptionFont, offsetof(LOGFONTW, lfFaceName));
MBSTOWCS_S(pncm->lfCaptionFont.lfFaceName, lfCaptionFont.lfFaceName, _countof(pncm->lfCaptionFont.lfFaceName));
memcpy(&pncm->lfSmCaptionFont, &lfSmCaptionFont, offsetof(LOGFONTW, lfFaceName));
MBSTOWCS_S(pncm->lfSmCaptionFont.lfFaceName, lfSmCaptionFont.lfFaceName, _countof(pncm->lfSmCaptionFont.lfFaceName));
#endif
}
}
}
return bResult;
}