Страница 1 из 1

смена wallpaper на VC++

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

P.S. Это моя первая прога на vc++
Заранее спасибо

Добавлено: 09 фев 2006, 09:34
BBB
Собственно вся программа сводится к вызову одной 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++ - работает без проблем!
Загадка, блин! :)

Добавлено: 09 фев 2006, 11:22
WinMain
Можно использовать интерфейс 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;
}

Добавлено: 09 фев 2006, 17:15
emx2000
Спасибо всем!!!
to BBB: Разобрался. Всё работает.
to WinMain: не всё пока понятно. Ещё буду Разбираться)))