Windows2003-3790/windows/appcompat/shims/general/fakethememetrics.cpp
2020-09-30 16:53:55 +02:00

148 lines
3.9 KiB
C++

/*++
Copyright (c) 2000 Microsoft Corporation
Module Name:
FakeThemeMetrics.cpp
Abstract:
This Shim will allow the Skemers group to shim applications that do not behave
well with "Themed" system metrics
History:
11/30/2000 a-brienw Converted to shim frame work version 2.
--*/
#include "precomp.h"
#ifndef ARRAYSIZE
#define ARRAYSIZE(x) sizeof(x)/sizeof((x)[0])
#endif
IMPLEMENT_SHIM_BEGIN(FakeThemeMetrics)
#include "ShimHookMacro.h"
// Add APIs that you wish to hook to this enumeration. The first one
// must have "= USERAPIHOOKSTART", and the last one must be
// APIHOOK_Count.
APIHOOK_ENUM_BEGIN
APIHOOK_ENUM_ENTRY(GetSysColor)
APIHOOK_ENUM_END
#define F_TYPE_RGB 0
#define F_TYPE_MAP 1
#define F_TYPE_PERCENT 2
#define F_TYPE_MAX 3
#define F_TYPE_NOTEQUAL 4
typedef struct
{
int nIndex;
DWORD fType;
COLORREF rgb;
int nMap; // If mapping we need to use the post processed color. Call HookedGetSysColor. See note
int iPercent;
} GETSYSCOLOR_MAP;
const static GETSYSCOLOR_MAP s_ColorMap[] =
{
{COLOR_MENU, F_TYPE_MAP, RGB(212, 208, 200), COLOR_BTNFACE, 10},
{COLOR_BTNFACE, F_TYPE_MAX, RGB(227, 227, 227), 0, 0},
{COLOR_3DDKSHADOW, F_TYPE_NOTEQUAL, RGB(0,0,0), COLOR_BTNFACE, 20}
};
COLORREF AdjustPercent(COLORREF crOld, int iPercent)
{
return RGB(GetRValue(crOld) - (GetRValue(crOld) * iPercent) / 100,
GetGValue(crOld) - (GetGValue(crOld) * iPercent) / 100,
GetBValue(crOld) - (GetBValue(crOld) * iPercent) / 100);
}
// NOTE: If you are mapping a color (i.e. a direct map), then you need to call HookedGetSysColor. For example
// MSDEV calls GetSysColor(COLOR_BTNFACE). It then calls GetSysColor(COLOR_MENU) and compares the two.
// If they are different then it pukes. However we hook both COLOR_MENU and COLOR_BTNFACE. So we need to get the mapped color.
DWORD HookedGetSysColor(int nIndex)
{
for (int i = 0; i < ARRAYSIZE(s_ColorMap); i++)
{
if (nIndex == s_ColorMap[i].nIndex)
{
switch (s_ColorMap[i].fType)
{
case F_TYPE_RGB:
return (DWORD)s_ColorMap[i].rgb;
break;
case F_TYPE_MAP:
return HookedGetSysColor(s_ColorMap[i].nMap);
break;
case F_TYPE_PERCENT:
{
COLORREF crOld = (COLORREF)ORIGINAL_API(GetSysColor)(nIndex);
return (DWORD)AdjustPercent(crOld, s_ColorMap[i].iPercent);
}
case F_TYPE_MAX:
{
COLORREF crOld = (COLORREF)ORIGINAL_API(GetSysColor)(nIndex);
BYTE r = GetRValue(crOld);
BYTE g = GetGValue(crOld);
BYTE b = GetBValue(crOld);
if (r > GetRValue(s_ColorMap[i].rgb))
r = GetRValue(s_ColorMap[i].rgb);
if (g > GetGValue(s_ColorMap[i].rgb))
g = GetGValue(s_ColorMap[i].rgb);
if (b > GetBValue(s_ColorMap[i].rgb))
b = GetBValue(s_ColorMap[i].rgb);
return RGB(r,g,b);
}
case F_TYPE_NOTEQUAL:
{
COLORREF crOld = (COLORREF)ORIGINAL_API(GetSysColor)(nIndex);
COLORREF crNotEqual = (COLORREF)HookedGetSysColor(s_ColorMap[i].nMap);
if (crOld == crNotEqual)
{
crOld = AdjustPercent(crOld, s_ColorMap[i].iPercent);
}
return crOld;
}
}
break;
}
}
return ORIGINAL_API(GetSysColor)( nIndex );
}
DWORD
APIHOOK(GetSysColor)(int nIndex)
{
return HookedGetSysColor(nIndex);
}
/*++
Register hooked functions
--*/
HOOK_BEGIN
APIHOOK_ENTRY(USER32.DLL, GetSysColor)
HOOK_END
IMPLEMENT_SHIM_END