смена wallpaper на VC++

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
emx2000
Сообщения: 15
Зарегистрирован: 12 дек 2004, 09:21

Нужно написать прогу которая меняет рисунок рабочего стола. SPI_SETDESKWALLPAPER.
На msdn.microsoft.com нашёл описание этой функции.
Подскажите как её использовать.

P.S. Это моя первая прога на vc++
Заранее спасибо
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

Собственно вся программа сводится к вызову одной WinAPI функции (ну, может, если это должнабыть самостоятельная прога, то какая-то логика у тебя будет в полуучении имени файла того "обоя", который нужно установить. В простейшем случае - можно передать как параметр командной строки):

SystemParametersInfo(
UINT uiAction, // system parameter to retrieve or set
UINT uiParam, // depends on action to be taken
PVOID pvParam, // depends on action to be taken
UINT fWinIni // user profile update option
);

Вызов именно для установки обоев будет выглядеть так:

Код: Выделить всё

bool blOK = SystemParametersInfo (
   SPI_SETDESKWALLPAPER,
   0,
   <твое_имя_файла_рисунка>,
   SPIF_UPDATEINIFILE);
ПРИМЕЧАНИЕ: Насколько я понимаю, <файл_рисунка> ДОЛЖЕН быть в BMP-формате.

Еще такое воспоминание из области "шаманства", когда я писал сееб такую прогу. После компиляции этого текста на Microsoft C++ и запуск получившейся EXE-шки на, по-моему, Win98 эта функция (SystemParametersInfo) возвращала ошибку (точно не помню какую). А на Win2000 нормально устанавливала.
Скомпилировал на Borland C++ - работает без проблем!
Загадка, блин! :)
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

Можно использовать интерфейс IActiveDesktop.
Только сначала нужно для рабочего стола установить флаг Show Web Content. (Клик правой кнопкой мыши по рабочему столу и в пункте меню Active Desktop выбирается соответствующая позиция).

Код: Выделить всё

#include "stdafx.h"
#include <wininet.h>
#include <shlobj.h>
#include <atlbase.h>

struct _COINITIALIZE
{
	 _COINITIALIZE() {::CoInitialize(NULL);}
	~_COINITIALIZE() {::CoUninitialize();}
};

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
 	struct _COINITIALIZE co_init;
	CComPtr<IActiveDesktop> pAD;
	::CoCreateInstance(CLSID_ActiveDesktop, NULL, CLSCTX_ALL, IID_IActiveDesktop, (LPVOID*)&pAD);
	pAD->SetWallpaper(L"C:\\WINNT\\Web\\Wallpaper\\Paradise.jpg", 0);
	pAD->ApplyChanges(AD_APPLY_ALL);
	return 0;
}
emx2000
Сообщения: 15
Зарегистрирован: 12 дек 2004, 09:21

Спасибо всем!!!
to BBB: Разобрался. Всё работает.
to WinMain: не всё пока понятно. Ещё буду Разбираться)))
Ответить