There is one way i dont know it is correct way or not but call this function twice can solve your problem.
I did it in my project :)
void CXYZ::RefreshIcons()
{
CString val;
HKEY hKey;
LONG result = ::RegOpenKeyEx(HKEY_CURRENT_USER,
_T("Control Panel\\Desktop\\WindowMetrics"),
0,KEY_READ,&hKey);
BYTE buff[256];
ZeroMemory(buff,255);
DWORD sz = sizeof buff;
DWORD typ = REG_SZ;
RegQueryValueEx(hKey,_T("Shell Icon Size"),0,&typ,buff,&sz);
RegCloseKey(hKey);
val = buff;
int i = _ttoi(val);
i++;
val.Format(_T("%d"),i);
result = ::RegOpenKeyEx(HKEY_CURRENT_USER,
_T("Control Panel\\Desktop\\WindowMetrics"),
0,KEY_WRITE,&hKey);
RegSetValueEx(hKey,_T("Shell Icon Size"),0,REG_SZ,
(const BYTE*)val.GetBuffer(0),val.GetLength());
val.ReleaseBuffer();
RegCloseKey(hKey);
::SendMessageTimeout(HWND_BROADCAST ,
WM_SETTINGCHANGE,0,0,SPI_SETNONCLIENTMETRICS,1000,NULL);
i = _ttoi(val);
i--;
val.Format(_T("%d"),i);
result = ::RegOpenKeyEx(HKEY_CURRENT_USER,
_T("Control Panel\\Desktop\\WindowMetrics"),
0,KEY_WRITE,&hKey);
RegSetValueEx(hKey,_T("Shell Icon Size"),0,REG_SZ,
(const BYTE*)val.GetBuffer(0),val.GetLength());
val.ReleaseBuffer();
RegCloseKey(hKey);
::SendMessageTimeout(HWND_BROADCAST ,
WM_SETTINGCHANGE,0,0,SPI_SETNONCLIENTMETRICS,1000,NULL);
}
This code is working fine on Window7 and Vista.