/* ADUTIL.CPP ** ** Copyright (C) Microsoft Corp. 1998-1999, All Rights Reserved. ** ** Utility functions for interfacing with the IActiveDesktop ** services. These services are documented in the Internet SDK. ** ** Created by: David Schott, January 1998 */ #include #include #include #include #include "..\inc\wininet.h" #include "..\inc\shlguid.h" #include "..\inc\shlobj.h" #define MAX_VALUELEN 1024 // Also defined in FROST.H!! // Extern globals extern "C" HWND hWndApp; // Handle to Desktop Themes window // Globals IActiveDesktop *g_pIAD = NULL; // IActiveDesktop interface BOOL InitIAD() { HRESULT hr = E_FAIL; // Bring in the library hr = CoInitialize(NULL); if (FAILED(hr)) { //MessageBox(hWndApp, TEXT("CoInit failed"), TEXT("ADUTIL"), MB_OK | MB_APPLMODAL); return FALSE; } g_pIAD = NULL; hr = CoCreateInstance(CLSID_ActiveDesktop, NULL, CLSCTX_INPROC_SERVER, IID_IActiveDesktop, (void **)&g_pIAD); if(!FAILED(hr)) { //MessageBox(hWndApp, TEXT("CoCreateInsance successful"), TEXT("ADUTIL"), MB_OK | MB_APPLMODAL); return TRUE; } else { //MessageBox(hWndApp, TEXT("CoCreateInstance failed"), TEXT("ADUTIL"), MB_OK | MB_APPLMODAL); CoUninitialize(); return FALSE; } } void IADCleanUp() { if (g_pIAD) g_pIAD->Release(); g_pIAD = NULL; CoUninitialize(); return; } extern "C" BOOL IsActiveDesktopOn() { HRESULT hr = E_FAIL; COMPONENTSOPT ADOptions; SHELLFLAGSTATE sfs; HINSTANCE hInst = 0; typedef VOID (*MYPROC)(LPSHELLFLAGSTATE, DWORD); MYPROC SHGetSettings; // Rumor has it this will help guarantee that our AD interface // is in sync. // SHGetSettings(&sfs, 0); hInst = LoadLibrary(TEXT("SHELL32.DLL")); if (hInst) { SHGetSettings = (MYPROC)GetProcAddress(hInst, "SHGetSettings"); if (SHGetSettings) { //MessageBox(NULL, TEXT("Calling SHGetSettings"), TEXT("ADUTIL"), MB_OK | MB_APPLMODAL); SHGetSettings(&sfs, 0); } FreeLibrary(hInst); } if (!InitIAD()) { //MessageBox(hWndApp, TEXT("INITIAD Failed"), TEXT("ADUTIL"), MB_OK | MB_APPLMODAL); return FALSE; } ZeroMemory(&ADOptions, sizeof(ADOptions)); ADOptions.dwSize = sizeof(ADOptions); // Paranoid check if (!g_pIAD) { IADCleanUp(); return FALSE; } hr = g_pIAD->GetDesktopItemOptions(&ADOptions, 0); if (FAILED(hr)) { IADCleanUp(); return FALSE; } else { //if (ADOptions.fActiveDesktop) // MessageBox(hWndApp, TEXT("ActiveDesktop enabled."), TEXT("ADUTIL"), MB_OK | MB_APPLMODAL); //else MessageBox(hWndApp, TEXT("ActiveDesktop disabled."), TEXT("ADUTIL"), MB_OK | MB_APPLMODAL); if (ADOptions.fActiveDesktop) { IADCleanUp(); return TRUE; } else { IADCleanUp(); return FALSE; } } // SHOULD NEVER FALL THROUGH TO THIS BUT JUST IN CASE IADCleanUp(); return FALSE; } extern "C" BOOL SetADWallpaper(LPTSTR lpszWallpaper, BOOL bForceADOn) { HRESULT hr = E_FAIL; COMPONENTSOPT ADOptions; SHELLFLAGSTATE sfs; HINSTANCE hInst = 0; typedef VOID (*MYPROC)(LPSHELLFLAGSTATE, DWORD); MYPROC SHGetSettings; #ifndef UNICODE WCHAR wszWallpaper[MAX_PATH]; #endif UINT uCodePage; // Rumor has it this will help guarantee that our AD interface // is in sync. // SHGetSettings(&sfs, 0); hInst = LoadLibrary(TEXT("SHELL32.DLL")); if (hInst) { SHGetSettings = (MYPROC)GetProcAddress(hInst, "SHGetSettings"); if (SHGetSettings) { //MessageBox(NULL, TEXT("Calling SHGetSettings"), TEXT("ADUTIL"), MB_OK | MB_APPLMODAL); SHGetSettings(&sfs, 0); } FreeLibrary(hInst); } if (!InitIAD()) { return FALSE; } // Paranoid check if (!g_pIAD) { IADCleanUp(); return FALSE; } uCodePage = _getmbcp(); #ifndef UNICODE //MessageBox(hWndApp, lpszWallpaper, TEXT("SetADWallpaper"), MB_OK | MB_APPLMODAL); MultiByteToWideChar(uCodePage, 0, lpszWallpaper, -1, wszWallpaper, MAX_PATH); #endif #ifdef UNICODE //MessageBox(hWndApp, lpszWallpaper, TEXT("SetADWallpaper"), MB_OK | MB_APPLMODAL); hr = g_pIAD->SetWallpaper(lpszWallpaper, 0); #else hr = g_pIAD->SetWallpaper(wszWallpaper, 0); #endif if (FAILED(hr)) { IADCleanUp(); return FALSE; } if (bForceADOn) { ZeroMemory(&ADOptions, sizeof(ADOptions)); ADOptions.dwSize = sizeof(ADOptions); hr = g_pIAD->GetDesktopItemOptions(&ADOptions, 0); if (FAILED(hr)) { IADCleanUp(); return FALSE; } //if (ADOptions.fActiveDesktop) // MessageBox(hWndApp, TEXT("ActiveDesktop enabled."), TEXT("ADUTIL"), MB_OK | MB_APPLMODAL); //else MessageBox(hWndApp, TEXT("ActiveDesktop disabled."), TEXT("ADUTIL"), MB_OK | MB_APPLMODAL); if (!ADOptions.fActiveDesktop) { // Turn AD on ADOptions.dwSize = sizeof(ADOptions); ADOptions.fActiveDesktop = TRUE; g_pIAD->SetDesktopItemOptions(&ADOptions, 0); } } g_pIAD->ApplyChanges(AD_APPLY_ALL | AD_APPLY_FORCE); IADCleanUp(); return TRUE; } extern "C" BOOL GetADWallpaper(LPTSTR lpszWallpaper) { HRESULT hr = E_FAIL; #ifndef UNICODE WCHAR wszWallpaper[MAX_PATH]; #endif UINT uCodePage; if (!InitIAD()) { // MessageBox(hWndApp, TEXT("INITIAD Failed"), TEXT("ADUTIL"), MB_OK | MB_APPLMODAL); return FALSE; } // Paranoid check if (!g_pIAD) { IADCleanUp(); return FALSE; } uCodePage = _getmbcp(); #ifdef UNICODE hr = g_pIAD->GetWallpaper(lpszWallpaper, MAX_PATH, 0); #else hr = g_pIAD->GetWallpaper(wszWallpaper, MAX_PATH, 0); #endif if (FAILED(hr)) { IADCleanUp(); return FALSE; } else { #ifndef UNICODE WideCharToMultiByte(uCodePage, 0, wszWallpaper, -1, lpszWallpaper, MAX_PATH, NULL, NULL); #endif //MessageBox(hWndApp, lpszWallpaper, TEXT("GetWallpaper"), MB_OK | MB_APPLMODAL); IADCleanUp(); return TRUE; } } extern "C" BOOL GetADWPOptions (DWORD *dwStyle) { WALLPAPEROPT WPOptions; HRESULT hr = E_FAIL; if (!InitIAD()) { // MessageBox(hWndApp, TEXT("INITIAD Failed"), TEXT("ADUTIL"), MB_OK | MB_APPLMODAL); return FALSE; } // Paranoid check if (!g_pIAD) { IADCleanUp(); return FALSE; } ZeroMemory(&WPOptions, sizeof(WALLPAPEROPT)); WPOptions.dwSize = sizeof(WALLPAPEROPT); hr = g_pIAD->GetWallpaperOptions(&WPOptions, 0); if (FAILED(hr)) { IADCleanUp(); return FALSE; } else { *dwStyle = WPOptions.dwStyle; IADCleanUp(); return TRUE; } } extern "C" BOOL SetADWPOptions (DWORD dwStyle) { WALLPAPEROPT WPOptions; HRESULT hr = E_FAIL; if (!InitIAD()) { // MessageBox(hWndApp, TEXT("INITIAD Failed"), TEXT("ADUTIL"), MB_OK | MB_APPLMODAL); return FALSE; } // Paranoid check if (!g_pIAD) { IADCleanUp(); return FALSE; } ZeroMemory(&WPOptions, sizeof(WALLPAPEROPT)); WPOptions.dwSize = sizeof(WALLPAPEROPT); WPOptions.dwStyle = dwStyle; hr = g_pIAD->SetWallpaperOptions(&WPOptions, 0); if (FAILED(hr)) { IADCleanUp(); return FALSE; } else { g_pIAD->ApplyChanges(AD_APPLY_ALL); IADCleanUp(); return TRUE; } } extern "C" BOOL GetADWPPattern (LPTSTR lpszPattern) { HRESULT hr = E_FAIL; #ifndef UNICODE WCHAR wszPat[MAX_VALUELEN]; // Assume this is big enough? #endif UINT uCodePage; if (!InitIAD()) { return FALSE; } // Paranoid check if (!g_pIAD) { IADCleanUp(); return FALSE; } uCodePage = _getmbcp(); #ifdef UNICODE hr = g_pIAD->GetPattern(lpszPattern, MAX_VALUELEN, 0); #else hr = g_pIAD->GetPattern(wszPat, MAX_VALUELEN, 0); #endif if (FAILED(hr)) { IADCleanUp(); return FALSE; } else { #ifndef UNICODE WideCharToMultiByte(uCodePage, 0, wszPat, -1, lpszPattern, MAX_VALUELEN, NULL, NULL); #endif IADCleanUp(); return TRUE; } } extern "C" BOOL SetADWPPattern (LPTSTR lpszPattern) { HRESULT hr = E_FAIL; #ifndef UNICODE WCHAR wszPat[MAX_VALUELEN]; // Assume this is big enough? #endif UINT uCodePage; if (!InitIAD()) { return FALSE; } // Paranoid check if (!g_pIAD) { IADCleanUp(); return FALSE; } uCodePage = _getmbcp(); #ifndef UNICODE MultiByteToWideChar(uCodePage, 0, lpszPattern, -1, wszPat, MAX_VALUELEN); #endif #ifdef UNICODE hr = g_pIAD->SetPattern(lpszPattern, 0); #else hr = g_pIAD->SetPattern(wszPat, 0); #endif if (FAILED(hr)) { IADCleanUp(); return FALSE; } else { g_pIAD->ApplyChanges(AD_APPLY_ALL); IADCleanUp(); return TRUE; } }