Смена картинки на рабочем столе
От: KolanT  
Дата: 04.05.04 19:21
Оценка:
Не могу сменить картинку на раб столе:


Reg := TRegIniFile.Create('Control Panel');
Reg.WriteString('desktop', 'Wallpaper', reg_str);
Reg.WriteString('desktop', 'TileWallpaper', reg_type_scr1);
Reg.WriteString('desktop', 'WallpaperStyle', reg_type_scr2);
Reg.Free;

Работает только если картинка в формате *.bmp а мне надо в jpg.
C jpeg-ом в XP экран становится черным а в 98 просто ничего не происходит
Пробовал обновить Экран

   hDesktop := FindWindowEx(FindWindowEx(FindWindow('Progman', 'Program Manager'), 0,'SHELLDLL_DefView', ''), 0, 'SysListView32', '');
   PostMessage(hDesktop, WM_KEYDOWN, VK_F5, 0);
  PostMessage(hDesktop, WM_KEYUP, VK_F5, 1 shl 31);


Тоже ничего что делать
Re: Смена картинки на рабочем столе
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 04.05.04 21:54
Оценка:
Здравствуйте, KolanT, Вы писали:

KT>Не могу сменить картинку на раб столе:


[]

KT>Тоже ничего что делать


Первое: если менять картинку на рабочем столе, а картинка в формате BMP, то лучше все-же юзать SystemParametersInfo с параметром SPI_SETDESKWALLPAPER — это все-же пограмотней, чем напрямую писать в ини-файл, ведь никому неизвестно, что у М$ на уме

Второе: если хотите картинку в формате JPEG, то вам прямая дорога в хелт по Active Desktop, и, в частности, хелп по интерфейсу IActiveDesktop и его методу SetWallpaper. Естественно, что в этом случае Active Desktop должен быть включен на компе у юзера.
Re: Смена картинки на рабочем столе
От: KolanT  
Дата: 06.05.04 18:43
Оценка: 1 (1)
Все разобрался вот так надо (если кому интересно)


procedure ChangeWallpaper(Path:PwideChar);
const
  CLSID_ActiveDesktop: TGUID = '{75048700-EF1F-11D0-9888-006097DEACF9}';
var
  ActiveDesktop: IActiveDesktop;
begin
  if path <> '' then
    begin
      ActiveDesktop := CreateComObject(CLSID_ActiveDesktop)as IActiveDesktop;
      ActiveDesktop.SetWallpaper(path, 0);
      ActiveDesktop.ApplyChanges(AD_APPLY_ALL or AD_APPLY_FORCE);
    end
  else exit;
end;


А в PwideChar переводить вот так:


function StringToPWide( sStr: string; var iNewSize: integer ): PWideChar;
var
  pw : PWideChar;
  iSize : integer;
begin
  iSize := Length( sStr ) + 1;
  iNewSize := iSize * 2;

  pw := AllocMem( iNewSize );

  MultiByteToWideChar( CP_ACP, 0, PChar(sStr), iSize, pw, iNewSize );

  Result := pw;
end;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.