Как сменить обои на рабочем столе если картинка в JPEG формате.
Как изменить запись в реестре я знаю, а вот как обновить
рабочий стол, чтоб обои поменялись на новые никак не могу понять.
Здравствуйте CeproBan, Вы писали:
CB>Как сменить обои на рабочем столе если картинка в JPEG формате. CB>Как изменить запись в реестре я знаю, а вот как обновить CB>рабочий стол, чтоб обои поменялись на новые никак не могу понять.
Как вариант: убить все процессы explorer.exe, а потом запустить один...
он автоматом поднимется Shell'ом, и, соотв. перерисуется с новыми обоями.
Еще вариант — протрассируй, какие оконные сообщения шлются окошкам Хплорера, когда в paint выбираеш Файл-сделать обои (или типа того)
ЗЫ при первом способе все иконки из трея пропадут...
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Здравствуйте CeproBan, Вы писали:
CB>Как сменить обои на рабочем столе если картинка в JPEG формате. CB>Как изменить запись в реестре я знаю, а вот как обновить CB>рабочий стол, чтоб обои поменялись на новые никак не могу понять.
IMHO гемморно менять параметры в реестре. Для этого существует специальный API интерфейс IActiveDesktop — если нужно поменять обои на ActiveDesktop. И функция API существует для смены на обычном рабочем столе. Иными словами, тебе прямая дорога к MSDN. Ща у меня под рукой нет подходящего примера, и негде уточнить что конкретно надо делать, но завтра, если интересно, могу притащить живой примерчик.
APIшная SystemParametersInfo с параметром SPI_SETDESKWALLPAPER в моем случае не подходит, так как работает только с БИТМАПами а JPEGов знать не хочет.
А вот про IActiveDesktop поподробнее пожалуста...
CB>Такой код я уже пробовал — не пашет. CB>CoCreateInstance не срабатывает, интересно почему?
HRESULT hr;
IActiveDesktop* pIAD;
char *n_file="c:\\image.jpg"; // Полный путь к изображению
WCHAR wc[100];
// Инициализируем интерфейс IActiveDesktop
CoInitialize(NULL); // Вот почему не срабатывает CoCreateInstance
hr = CoCreateInstance (Shlobj::CLSID_ActiveDesktop,
NULL,
CLSCTX_INPROC_SERVER,
IID_IActiveDesktop,
(void**) &pIAD );
if (SUCCEEDED(hr))
{
// Получаем ссылку на текущий Wallpaper
hr = pIAD->GetWallpaper ( wszWallpaper, MAX_PATH, 0 );
if (SUCCEEDED(hr))
{
// Приводим путь к изображению к типу WideChar
MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,n_file,-1,wc,100);
// Тут, думаю, все говорит само за себя
pIAD->SetWallpaper(wc,0);
pIAD->ApplyChanges(AD_APPLY_ALL);
pIAD->Release();
CoUninitialize();
}
}