Introduction
Refresh desktop programmatically
Following code that uses only Win32 API and written in C++ will mimic F5 key action on desktop. This code already tested with BCC55, worked as intended. Please do some error checking yourself in 'F5Desk()
' function.
#include <windows.h>
typedef char str64[64];
typedef char str256[256];
typedef char str1024[1024];
#define HKCU HKEY_CURRENT_USER
BOOL SetString(HKEY hkeymom, str256 pkeyname,
str64 pvalname, str1024 pvaldata)
{ HKEY hkey = 0;
if(RegCreateKeyEx(hkeymom, pkeyname, 0,
NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL,
&hkey, NULL) != ERROR_SUCCESS)
return FALSE;
LONG rtn = RegSetValueEx(hkey, pvalname, 0,
REG_SZ, (BYTE*)pvaldata, lstrlen(pvaldata));
RegCloseKey(hkey);
if(rtn == ERROR_SUCCESS)
return TRUE;
return FALSE;
}
BOOL ReadString(HKEY hkeymom, str256 pkeyname,
str64 pvalname, str1024 pvaldata)
{ HKEY hkey = 0;
DWORD dw;
if(RegOpenKeyEx(hkeymom, pkeyname, 0, KEY_READ, &hkey) != ERROR_SUCCESS)
{ strcpy(pvaldata, "");
return FALSE;
}
LONG rtn = RegQueryValueEx(hkey, pvalname, NULL, &dw, NULL, NULL);
if((rtn != ERROR_SUCCESS) || (dw != REG_SZ))
{ RegCloseKey(hkey);
strcpy(pvaldata, "");
return FALSE;
}
dw = 1024;
RegQueryValueEx(hkey, pvalname, NULL, NULL, (BYTE*)pvaldata, &dw);
RegCloseKey(hkey);
return TRUE;
}
int myexp (int y)
{ int ii = 1;
for (int cnt = 0; cnt < y; cnt++)
ii *= 10;
return ii;
}
BOOL StringToInt(str1024 sz, int* ires)
{
str1024 szi = "";
for(unsigned int cnt = 0; cnt < strlen(sz); cnt++)
{
if((sz[cnt] != 45) && (sz[cnt] != 48) &&
(sz[cnt] != 49) & (sz[cnt] != 50) &&
(sz[cnt] != 51) && (sz[cnt] != 52) &&
(sz[cnt] != 53) && (sz[cnt] != 54) &&
(sz[cnt] != 55) && (sz[cnt] != 56) && (sz[cnt] != 57))
break;
if((sz[cnt] == 45) && (cnt != 0))
break;
switch(sz[cnt])
{ case 45: strcat(szi, "-"); break;
case 48: strcat(szi, "0"); break;
case 49: strcat(szi, "1"); break;
case 50: strcat(szi, "2"); break;
case 51: strcat(szi, "3"); break;
case 52: strcat(szi, "4"); break;
case 53: strcat(szi, "5"); break;
case 54: strcat(szi, "6"); break;
case 55: strcat(szi, "7"); break;
case 56: strcat(szi, "8"); break;
case 57: strcat(szi, "9"); break;
}
}
if(!strlen(szi))
{ *ires = 0;
return FALSE;
}
else if((strlen(szi) == 1) && !strcmp(szi, "-"))
{ *ires = 0;
return FALSE;
}
BOOL flag = FALSE;
if(strchr(szi, '-')) flag = TRUE;
int ii = 0;
strrev(szi);
for(unsigned int cnt = 0; cnt < strlen(szi); cnt++)
{ switch(szi[cnt])
{ case 48: ii += 0 * myexp(cnt); break;
case 49: ii += 1 * myexp(cnt); break;
case 50: ii += 2 * myexp(cnt); break;
case 51: ii += 3 * myexp(cnt); break;
case 52: ii += 4 * myexp(cnt); break;
case 53: ii += 5 * myexp(cnt); break;
case 54: ii += 6 * myexp(cnt); break;
case 55: ii += 7 * myexp(cnt); break;
case 56: ii += 8 * myexp(cnt); break;
case 57: ii += 9 * myexp(cnt); break;
}
}
if((ii > 0) && flag) ii /= -1;
*ires = ii;
return TRUE;
}
void F5Desk()
{ str1024 szres = "";
ReadString(HKCU, "Control Panel\\Desktop\\WindowMetrics",
"Shell Icon Size", szres);
int ii = 0;
StringToInt(szres, &ii);
ii++;
wsprintf(szres, "%i", ii);
SetString(HKCU, "Control Panel\\Desktop\\WindowMetrics",
"Shell Icon Size", szres);
HWND hwndtask = FindWindow("Shell_traywnd", "");
SendMessage(hwndtask, WM_SETREDRAW, FALSE, 0);
SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE,
SPI_SETNONCLIENTMETRICS, 0,
SMTO_ABORTIFHUNG, 100000, NULL);
ii--;
wsprintf(szres, "%i", ii);
SetString(HKCU, "Control Panel\\Desktop\\WindowMetrics",
"Shell Icon Size", szres);
SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE,
SPI_SETNONCLIENTMETRICS, 0,
SMTO_ABORTIFHUNG, 100000, NULL);
SendMessage(hwndtask, WM_SETREDRAW, TRUE, 0);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{ F5Desk();
return 0;
}
Copyright notice
- This code is based on work by Rocky Mountain Computer Consulting, Inc.
- This code is provided free. Use it as you wish, but all responsibilities are yours.
- You should include this Copyright notice in your Copyright notice, or, Readme, or similar thing if you use this code or get know-how from this code and you use it in your program.
- This code is supplied from an anonymous man in Semarang, Indonesia.
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.