Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Смена обоев на рабочем столе. [D7, WinXP]


Ugrael ©   (2004-11-12 11:46:00) 

Доброго времени суток.
Дабы разобраться хочу еаписать типовой сменщик обоев\календарь на рабочий стол.Столкнулся с такой проблемой-из тутошнего FAQ взял код по изменению обоев. Запускаю - визуально ничего не происходит, хотя в свойствах рабочего стола обои меняются.
Может где чего обновить(refresh)надо ?
у меня XP+StyleXP. Но ведь остальные проги работают ?


Ugrael   (2004-11-12 16:02:00) [1]

млин, все, разобрался. для получения pwidechar из string используем функцию function StringToOleStr(const Source: string): PWideChar;


Ugrael   (2004-11-12 15:45:00) [2]

требует pwidechar. Что это за хрень ?!
и еще - пример из FAQ и пример -=SS=- заработали. в них понимается только формат BMP. а стандартно винда понимает ведь JPG. Да и в твоем (S@lik ©) примере если явно указать jpg все работает. если давать переменные , то см. самую первую строку.


S@lik   (2004-11-12 15:16:00) [3]

попробуй Pchar(s)


Ugrael   (2004-11-12 14:44:00) [4]

всех уже достал наверное 8)
ActiveDesktop.SetWallpaper(s, 0)
в этой строчке пишет что несовместимые типы .
а если сделать pwidechar(s) - проходит, но не кажет.


S@lik   (2004-11-12 14:01:00) [5]

procedure ChangeActiveWallpaper(S:string);
const
CLSID_ActiveDesktop: TGUID = '{75048700-EF1F-11D0-9888-006097DEACF9}';
var
ActiveDesktop: IActiveDesktop;
begin
ActiveDesktop := CreateComObject(CLSID_ActiveDesktop)
  as IActiveDesktop;
ActiveDesktop.SetWallpaper(s, 0);
ActiveDesktop.ApplyChanges(AD_APPLY_ALL or AD_APPLY_FORCE);
end;

Вызываеш процедуру вот так
if OpenDialog1.Execute then
ChangeActiveWallpaper(OpenDialog1.FileName);


Ugrael   (2004-11-12 13:51:00) [6]

мистика, компилятор пропускает, но не работает. а если вывести пенременную S то там такая абракадабра... это же врое как Unicod ?


-=SS=-   (2004-11-12 13:26:00) [7]

Ну так в чем проблемы
Var
 S:String;
begin
 ....
 S:=OpenDialog1.FileName;
 ActiveDesktop.SetWallpaper(PWideChar(S), 0);
поидее должно работать


Ugrael   (2004-11-12 13:23:00) [8]

вариант от S@lik у меня работает, кроме одного нюанса - если я явно указываю путь к файлу. А мне надо что бы ну хотя бы через opendialog.filename. Вот тут возникает проблема - пишкт что тип string а нужен pwidechar.
уж извините за глупые вопросы ...


-=SS=-   (2004-11-12 13:07:00) [9]

Или так

procedure ChangeWallpaper(bitmap: string);       {имя файла с изображением: *.bmp}
var pBitmap : pchar;
begin
bitmap:=bitmap+#0;
pBitmap:=@bitmap[1];
SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, pBitmap, SPIF_UPDATEINIFILE);
end;


S@lik   (2004-11-12 11:55:00) [10]

вот у меня работает отлично

uses
 ComObj, ShlObj;

procedure ChangeActiveWallpaper;
const
 CLSID_ActiveDesktop: TGUID = '{75048700-EF1F-11D0-9888-006097DEACF9}';
var
 ActiveDesktop: IActiveDesktop;
begin
 ActiveDesktop := CreateComObject(CLSID_ActiveDesktop)
   as IActiveDesktop;
 ActiveDesktop.SetWallpaper('c:\windows\forest.bmp', 0);
 ActiveDesktop.ApplyChanges(AD_APPLY_ALL or AD_APPLY_FORCE);
end;


Наверх

Титульная страница Поиск, карта сайта Написать письмо