Code to refresh desktop programmatically






1.41/5 (9 votes)
Feb 17, 2005

56100

544
C++ code to refresh desktop programmatically using only Win32 API.
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) { //temp string str1024 szi = ""; //copy character that represent number or negative sign only to temp string for(unsigned int cnt = 0; cnt < strlen(sz); cnt++) { //if not 0 to 9 or negative sign then break 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 negative sign but not in first letter then break if((sz[cnt] == 45) && (cnt != 0)) break; //add to temp string 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 length of temp string = 0 then return FALSE if(!strlen(szi)) { *ires = 0; return FALSE; } //if length of temp string = 1 but only negative sign in it, return FALSE else if((strlen(szi) == 1) && !strcmp(szi, "-")) { *ires = 0; return FALSE; } //flag for negative or positive number BOOL flag = FALSE; //if there is negative sign in temp string then flag = TRUE if(strchr(szi, '-')) flag = TRUE; int ii = 0; strrev(szi); //convert temp string to number 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 flag and number > 0 then negative the number if((ii > 0) && flag) ii /= -1; *ires = ii; return TRUE; } void F5Desk() { str1024 szres = ""; //read current icon size, usually 32 (in Windows® XP) ReadString(HKCU, "Control Panel\\Desktop\\WindowMetrics", "Shell Icon Size", szres); int ii = 0; //translate to number StringToInt(szres, &ii); //increase it by 1 ii++; //convert back to string wsprintf(szres, "%i", ii); //now, change the icon size SetString(HKCU, "Control Panel\\Desktop\\WindowMetrics", "Shell Icon Size", szres); //find taskbar and make it can't redraw HWND hwndtask = FindWindow("Shell_traywnd", ""); SendMessage(hwndtask, WM_SETREDRAW, FALSE, 0); //broadcast the icon size change, so the desktop will be refreshed SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, SPI_SETNONCLIENTMETRICS, 0, SMTO_ABORTIFHUNG, 100000, NULL); //make the icon size go back to original number 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); //make taskbar can redraw again 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.