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

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

Проблемма с установкой фона рабочего стола [D7]


zero-g ©   (2005-04-13 15:17:00) 

Доброго времени суток, дело вобщем такое...
Написал программку для установки фона рабочего стола по времени...
Под ХП работает без проблем, в 98 и 2k (линолиум не тестил, т.к. негде) Фон не устанавливается, если быть точнее он устанавливается, но рабочий стол не обновляет фон!
Хоть убей, мурыжил мурыжил, так и ничего недо шло...
В прошедуре установки редактирую реестр, сообщаю системе что мол готово и обновляю раб стол, и нифига...
Вот процедура...

uses Registry, WinProcs,Messages;
....
procedure SetWallpaper(sWallpaperBMPPath : String; bTile : byte);
 var
   reg : TRegIniFile;
 begin
   reg := TRegIniFile.Create('Control Panel\Desktop' );
   with reg do begin
     WriteString( '', 'Wallpaper', sWallpaperBMPPath );
     if bTile = 1 then //по центру
     begin
       WriteString('', 'TileWallpaper', '0' );
       WriteString('', 'WallpaperStyle', '0' );
     end;
     if bTile = 2 then //по замостить
     begin
       WriteString('','TileWallpaper', '1');
       WriteString('','WallpaperStyle', '0');
     end;
     if bTile = 3 then // растянуть
     begin
       WriteString('', 'TileWallpaper', '0' );
       WriteString('', 'WallpaperStyle', '2' );
     end;
   end;
   reg.Free;
  SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, Nil,SPIF_SENDWININICHANGE );
  SendMessage(FindWindow('Progman', 'Program Manager'),WM_COMMAND,$A065,0);
 end;
....

А вот сама програмка, если кому интересно...
http://alexshad.pisem.net/file/wallp.zip

Помогите кто чем сможет...


zero-g   (2005-04-18 16:50:00) [1]

to Virgo_Style

Спасибо


Virgo_Style   (2005-04-18 14:28:00) [2]

http://www.interface.ru/fset.asp?Url=/borland/decom_3.htm:

// Создаем COM-объект и запрашиваем у него интерфейс
    ComServer := CreateComObject(IComServer) as IComServer;
    // Работаем с интерфейсом
    ComServer.DoSomething;
    // Освобождаем интерфейс
    ComServer := NIL;


Virgo_Style   (2005-04-18 14:20:00) [3]

Посмотрел несколько примеров - убиения не обнаружил %-)

Попробовал CreateComObject несколько раз - возрастания потребления памяти не заметил.

Честно говоря - больше помочь ничем не могу, некомпетентен %-).


zero-g   (2005-04-18 13:05:00) [4]

to Virgo_Style
>По идее, ActiveDesctop.Release ?

Такого нет.


Virgo_Style   (2005-04-18 08:43:00) [5]

По идее, ActiveDesctop.Release ?


zero-g   (2005-04-18 05:45:00) [6]

Да, у меня еще один вопрос по выше написанной процедуре...
А как убить com-объект из памяти, что потребление RAM шло не по возрастающей, а обновил (потребление памяти взлетело), по завершению размер потребляемой памяти стал прежним.

Т.е. мы создаем объект
ActiveDesktop := CreateComObject(CLSID_ActiveDesktop) as IActiveDesktop;
А как теперь в конце его убить?
дык ActiveDesktop.Free; Неканает.... И получается что у нас потребление памяти ростет по возрастающей....
А хотелось бы чтоб, создал - убил, создал - убил... ну и тд :)))


zero-g   (2005-04-17 20:12:00) [7]

Спасиб всем, я сделал :)

uses  ComObj,ShlObj;
****
procedure SetWallpaper(sWallpaperBMPPath : String; bTile : byte);
const
CLSID_ActiveDesktop: TGUID = '{75048700-EF1F-11D0-9888-006097DEACF9}';
var
ActiveDesktop: IActiveDesktop;
t_ : WideString;
wp   : _tagWALLPAPEROPT;
begin
t_ := sWallpaperBMPPath;
ActiveDesktop := CreateComObject(CLSID_ActiveDesktop) as IActiveDesktop;
wp.dwSize := sizeof(_tagWALLPAPEROPT);
if bTile = 3 then //растянуть
 wp.dwStyle := WPSTYLE_STRETCH;
if bTile = 2 then //замостить
 wp.dwStyle := WPSTYLE_MAX;
if bTile = 1 then //поцентру
 wp.dwStyle := WPSTYLE_CENTER;
ActiveDesktop.SetWallpaperOptions(wp,0);
ActiveDesktop.SetWallpaper(PWideChar(t_),0);
ActiveDesktop.ApplyChanges(AD_APPLY_ALL or AD_APPLY_FORCE);
end;


kami   (2005-04-14 14:54:00) [8]

Объяви sWallpaperBMPPath как WideString.


zero-g   (2005-04-14 06:12:00) [9]

to kami

Что то я понять не могу

Делаешь так
ActiveDesktop.SetWallpaper(PWideChar(sWallpaperBMPPath),0);
где sWallpaperBMPPath путь до bmp
Он ставит нашу бмп в PrevWallpaper в на десктопе все фон уберается, в реестве остается таже самая, что была по умолчанию...

Длеаешь так
ActiveDesktop.SetWallpaper('C:\Delphi\walp\mywallp.bmp',0);
Все работает как надо.... и редетите все что надо...

Почему через переменну не прокатывает???


zero-g   (2005-04-13 17:38:00) [10]

to Lin7
Сенкс :)


Lin7   (2005-04-13 17:02:00) [11]


> zero-g ©   (13.04.05 15:17)


Забыл:
DeskTopHandle - хенд ListView'а рабочего стола:
Function GetDeskTop:HWND;
var stt:string;
begin
  result := FindWindow('ProgMan', nil);
  result := GetWindow(Result, GW_CHILD);  // это root десктопа
  result := GetWindow(Result, GW_CHILD);  // это ListView с иконками
  SetLength(Stt, 40);
  GetClassName(Result, PChar(Stt), 39);
  if PChar(Stt) <> 'SysListView32' then result := 0
end;


Lin7   (2005-04-13 16:56:00) [12]


> zero-g ©   (13.04.05 15:17)


Попробуй обновить Desktop так:
PostMessage(DeskTopHandle, WM_KEYDOWN, VK_F5, 0);
PostMessage(DeskTopHandle, WM_KEYUP, VK_F5, 1 shl 31);


zero-g   (2005-04-13 16:31:00) [13]

to kami

Ну вот это я пробывал (если не ошибаюсь), такая же картина
Wallpaper := 'C:\windows\ACD Wallpaper.bmp';
SystemParametersInfo (SPI_SETDESKWALLPAPER, 0, PChar(Wallpaper), SPIF_SENDCHANGE)

А вот за com-интерфейс спасиб :)
Попробую :)


kami   (2005-04-13 15:58:00) [14]

А как насчет
{ для bmp}
Wallpaper := 'C:\windows\ACD Wallpaper.bmp';
 SystemParametersInfo (SPI_SETDESKWALLPAPER, 0, PChar(Wallpaper), SPIF_SENDCHANGE)

или
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.jpg', 0);
 ActiveDesktop.ApplyChanges(AD_APPLY_ALL or AD_APPLY_FORCE);
end;

(c) Delphi Russian KnowLedge Base


Наверх

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