//Copyright (c) 1997-2000 Microsoft Corporation #include "pch.hxx" // pch #pragma hdrstop #include "resource.h" #include "CurSchme.h" DWORD g_dwSchemeSource; static LPCTSTR g_rgszCursorNames[] = { __TEXT("Arrow"), __TEXT("Help"), __TEXT("AppStarting"), __TEXT("Wait"), __TEXT("Crosshair"), __TEXT("IBeam"), __TEXT("NWPen"), __TEXT("No"), __TEXT("SizeNS"), __TEXT("SizeWE"), __TEXT("SizeNWSE"), __TEXT("SizeNESW"), __TEXT("SizeAll"), __TEXT("UpArrow"), __TEXT("Hand"), NULL // This is the default value }; #define CCURSORS (sizeof(g_rgszCursorNames) / sizeof(g_rgszCursorNames[0])) TCHAR g_szOrigCursors[CCURSORS][_MAX_PATH]; DWORD g_dwOrigSchemeSource = 0; const TCHAR g_szCursorRegPath[] = REGSTR_PATH_CURSORS; const TCHAR szSchemeSource[] = TEXT("Scheme Source"); TCHAR g_szSchemeNames[8][100]; // HACK - We have to make sure the scheme names are less than 100 characters typedef LANGID (WINAPI *pfnGetUserDefaultUILanguage)( void ); typedef LANGID (WINAPI *pfnGetSystemDefaultUILanguage)( void ); BOOL IsMUI_Enabled() { OSVERSIONINFO verinfo; LANGID rcLang; HMODULE hModule; pfnGetUserDefaultUILanguage gpfnGetUserDefaultUILanguage; pfnGetSystemDefaultUILanguage gpfnGetSystemDefaultUILanguage; static g_bPFNLoaded=FALSE; static g_bMUIStatus=FALSE; if(g_bPFNLoaded) return g_bMUIStatus; g_bPFNLoaded = TRUE; verinfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx( &verinfo) ; if (verinfo.dwMajorVersion == 5) { hModule = GetModuleHandle(TEXT("kernel32.dll")); if (hModule) { gpfnGetSystemDefaultUILanguage = (pfnGetSystemDefaultUILanguage)GetProcAddress(hModule,"GetSystemDefaultUILanguage"); if (gpfnGetSystemDefaultUILanguage) { rcLang = (LANGID) gpfnGetSystemDefaultUILanguage(); if (rcLang == 0x409 ) { gpfnGetUserDefaultUILanguage = (pfnGetUserDefaultUILanguage)GetProcAddress(hModule,"GetUserDefaultUILanguage"); if (gpfnGetUserDefaultUILanguage) { if (rcLang != (LANGID)gpfnGetUserDefaultUILanguage() ) { g_bMUIStatus = TRUE; } } } } } } return g_bMUIStatus; } void LoadCursorSchemeNames() { static BOOL g_bSchemeNamesLoaded = FALSE; if(g_bSchemeNamesLoaded) return; g_bSchemeNamesLoaded = TRUE; if (!IsMUI_Enabled()) { LoadString(g_hInstDll, IDS_CURSOR_SCHEME_WINDOWS_STANDARD_LARGE , g_szSchemeNames[0], 100); LoadString(g_hInstDll, IDS_CURSOR_SCHEME_WINDOWS_STANDARD_EXTRALARGE, g_szSchemeNames[1], 100); LoadString(g_hInstDll, IDS_CURSOR_SCHEME_WINDOWS_BLACK , g_szSchemeNames[2], 100); LoadString(g_hInstDll, IDS_CURSOR_SCHEME_WINDOWS_BLACK_LARGE , g_szSchemeNames[3], 100); LoadString(g_hInstDll, IDS_CURSOR_SCHEME_WINDOWS_BLACK_EXTRALARGE , g_szSchemeNames[4], 100); LoadString(g_hInstDll, IDS_CURSOR_SCHEME_WINDOWS_INVERTED , g_szSchemeNames[5], 100); LoadString(g_hInstDll, IDS_CURSOR_SCHEME_WINDOWS_INVERTED_LARGE , g_szSchemeNames[6], 100); LoadString(g_hInstDll, IDS_CURSOR_SCHEME_WINDOWS_INVERTED_EXTRALARGE, g_szSchemeNames[7], 100); } else { lstrcpy(g_szSchemeNames[0],IDSENG_CURSOR_SCHEME_WINDOWS_STANDARD_LARGE); lstrcpy(g_szSchemeNames[1],IDSENG_CURSOR_SCHEME_WINDOWS_STANDARD_EXTRALARGE); lstrcpy(g_szSchemeNames[2],IDSENG_CURSOR_SCHEME_WINDOWS_BLACK); lstrcpy(g_szSchemeNames[3],IDSENG_CURSOR_SCHEME_WINDOWS_BLACK_LARGE); lstrcpy(g_szSchemeNames[4],IDSENG_CURSOR_SCHEME_WINDOWS_BLACK_EXTRALARGE); lstrcpy(g_szSchemeNames[5],IDSENG_CURSOR_SCHEME_WINDOWS_INVERTED); lstrcpy(g_szSchemeNames[6],IDSENG_CURSOR_SCHEME_WINDOWS_INVERTED_LARGE); lstrcpy(g_szSchemeNames[7],IDSENG_CURSOR_SCHEME_WINDOWS_INVERTED_EXTRALARGE); } // Load the current cursor settings HKEY hkCursors; if (ERROR_SUCCESS == RegOpenKey( HKEY_CURRENT_USER, g_szCursorRegPath, &hkCursors )) { for(int i=0;i<CCURSORS;i++) { g_szOrigCursors[i][0] = 0; DWORD dwCount = _MAX_PATH * sizeof(TCHAR); DWORD dwType; RegQueryValueEx( hkCursors, g_rgszCursorNames[i], NULL, &dwType, (LPBYTE)g_szOrigCursors[i], &dwCount ); } // Get the scheme source value DWORD dwLen = sizeof(g_dwOrigSchemeSource); if (RegQueryValueEx( hkCursors, szSchemeSource, NULL, NULL, (unsigned char *)&g_dwOrigSchemeSource, &dwLen ) != ERROR_SUCCESS) g_dwOrigSchemeSource = 1; RegCloseKey(hkCursors); } else _ASSERTE(FALSE); } static const TCHAR c_szRegPathCursorSchemes[] = REGSTR_PATH_CURSORS TEXT( "\\Schemes" ); static const TCHAR c_szRegPathSystemSchemes[] = REGSTR_PATH_SETUP TEXT("\\Control Panel\\Cursors\\Schemes"); // ApplyScheme(int nScheme) // '0' Scheme loaded in g_szOrigScheme // '1' Windows Default // '2' Standard Large // '3' Standard Ex Large // '4' Black // '5' Black Large // '6' Black Ex Large // '7' Inverted // '8' Inverted Large // '9' Inverted Ex Large void ApplyCursorScheme(int nScheme) { LoadCursorSchemeNames(); HKEY hkCursors; DWORD dwPosition; // Initially for default cursor, The registry "\\ControlPanel\Cursors" is not created // so. Create the registry values: a-anilk if(ERROR_SUCCESS != RegCreateKeyEx( HKEY_CURRENT_USER, g_szCursorRegPath, 0L, TEXT(""), REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hkCursors, &dwPosition )) return; int i; DWORD dwSchemeSource; switch(nScheme) { case 0: // Original scheme dwSchemeSource = g_dwOrigSchemeSource; for(i=0;i<CCURSORS;i++) RegSetValueEx( hkCursors, g_rgszCursorNames[i], 0L, REG_SZ, (CONST LPBYTE)g_szOrigCursors[i], (lstrlen(g_szOrigCursors[i])+1)*sizeof(TCHAR)); break; case 1: // Windows default dwSchemeSource = 0; for(i=0;i<CCURSORS;i++) RegSetValueEx( hkCursors, g_rgszCursorNames[i], 0L, REG_SZ, (CONST LPBYTE)"", sizeof(TCHAR)); break; case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: { dwSchemeSource = 2; // Assume System schemes HKEY hkScheme; // Try to find the 'system' schemes first if(ERROR_SUCCESS != RegOpenKey( HKEY_LOCAL_MACHINE, c_szRegPathSystemSchemes, &hkScheme )) { // Couldn't find system schemes, try looking in user schemes dwSchemeSource = 1; // User schemes if(ERROR_SUCCESS != RegOpenKey( HKEY_CURRENT_USER, c_szRegPathCursorSchemes, &hkScheme )) return; } DWORD dwCount = 0; DWORD dwType; long nResult; if(ERROR_SUCCESS != (nResult = RegQueryValueEx( hkScheme, g_szSchemeNames[nScheme - 2], NULL, &dwType, NULL, &dwCount ))) dwCount = 1; // The value probably was not there. Fake it and allocate 1 byte. LPTSTR lpszData = (LPTSTR)new BYTE[dwCount]; // NOTE: For Unicode, RegQueryValueEx still returns the 'Byte' size not 'Char count' lpszData[0] = 0; if(ERROR_SUCCESS == nResult) RegQueryValueEx( hkScheme, g_szSchemeNames[nScheme - 2], NULL, &dwType, (LPBYTE)lpszData, &dwCount ); LPTSTR lpszCurrentValue = lpszData; LPTSTR lpszFinalNULL = lpszData + lstrlen(lpszData); // Parse the information for(i=0;i<CCURSORS;i++) { // Hack to set the default value if(CCURSORS - 1 == i) { lpszCurrentValue = g_szSchemeNames[nScheme - 2]; RegSetValueEx( hkCursors, NULL, 0L, REG_SZ, (CONST LPBYTE)lpszCurrentValue, (lstrlen(lpszCurrentValue)+1)*sizeof(TCHAR)); } else { // Find next comma LPTSTR lpszComma = _tcschr(lpszCurrentValue, __TEXT(',')); // Turn it into a zero if(lpszComma) *lpszComma = 0; RegSetValueEx( hkCursors, g_rgszCursorNames[i], 0L, REG_SZ, (CONST LPBYTE)lpszCurrentValue, (lstrlen(lpszCurrentValue)+1)*sizeof(TCHAR)); lpszCurrentValue = min(lpszFinalNULL, lpszCurrentValue + lstrlen(lpszCurrentValue) + 1); } } delete [] lpszData; RegCloseKey(hkScheme); } break; default: _ASSERTE(FALSE); } // Save the 'Scheme Source' RegSetValueEx(hkCursors, szSchemeSource, 0, REG_DWORD, (unsigned char *)&dwSchemeSource, sizeof(dwSchemeSource)); RegCloseKey(hkCursors); SystemParametersInfo( SPI_SETCURSORS, 0, 0, SPIF_SENDCHANGE ); }