| 
| 
 | Вопрос # 801/ вопрос решён / | 
 |  Здравствуйте, уважаемые эксперты!Как поменять обои на робочем столе? Я использую Windows.SystemParametersInfo(SPI_SetDeskWallPaper, 0, PChar(\'C:\1.jpe\'), SpiF_UpdateIniFile);
 но экран становится пустым, без обоев.
 
|  |   Вопрос задал: Евгений Eklmn (статус: Посетитель)Вопрос отправлен: 30 июля 2007, 13:20
 Состояние вопроса: решён, ответов: 2.
 |  Ответ #1. Отвечает эксперт: Aleksey P. Kharitonov Здравствуйте, Трофимов Евгений!Предвательно подключив модули ShlObj и ComObj, воспользуйтесь следующей процедурой:
 Приложение:Переключить в обычный режим  const  CLSID_ActiveDesktop: TGUID = '{75048700-EF1F-11D0-9888-006097DEACF9}';var  ActiveDesktop: IActiveDesktop;begin  ActiveDesktop := CreateComObject(CLSID_ActiveDesktop)    as IActiveDesktop;  ActiveDesktop.SetWallpaper(PWideChar(WideString(Path)), 0);  ActiveDesktop.ApplyChanges(AD_APPLY_ALL or AD_APPLY_FORCE);end; 
|  | Ответ отправил: Aleksey P. Kharitonov (статус: 3-ий класс)Время отправки: 30 июля 2007, 14:16
 Оценка за ответ: 5
 |  Ответ #2. Отвечает эксперт: Feniks Здравствуйте, Трофимов Евгений!
 ВАРИАНТ 1:
 
 Для смены обоев предусмотрена функция Win32API :
 
 SystemParametersInfo( SPI_SETDESKWALLPAPER, 0, PChar(\'Path\'), SPIF_SENDWININICHANGE );
 
 Где Path - путь к BMP файлу. По умолчанию устанавливает обои \'В центре\'. Если вы захотите убрать обои, то в параметре Path надо указать любой бред, например zzzz. / Только если у вас нет в корне файла с таким именем :) /
 При работе часто требуется обновить рабочий стол. Делается это вот такой функцией:
 
 SendMessage(FindWindow (\'Progman\', \'Program Manager\'), WM_COMMAND, $A065, 0);
 
 Функцией FindWindow находим, и получаем handle на нужное окно. Первый параметр - class name / название класса /, а второй - window name / название окна /
 SendMessage - функция, для посылания сообщений окну или окнам, вот ее параметры :
 
 SendMessage(
 HWND hwnd, // handle на посылаемое окно, его мы нашли функцией FindWindow
 UINT uMsg, // сообщение для посылки
 WPARAM wParam, // первый и
 LPARAM lParam // второй параметры.
 
 ===================================================================
 ВАРИАНТ 2:
 
 program wallpapr;
 uses Registry, WinProcs;
 
 procedure SetWallpaper(sWallpaperBMPPath:String;bTile:boolean);
 var
 reg : TRegIniFile;
 begin
 // Изменяем ключи реестра
 // HKEY_CURRENT_USER
 //   Control Panel\Desktop
 //     TileWallpaper (REG_SZ)
 //     Wallpaper (REG_SZ)
 reg := TRegIniFile.Create(\'Control Panel\Desktop\' );
 with reg do begin
 WriteString( \'\', \'Wallpaper\',
 sWallpaperBMPPath );
 if( bTile )then
 begin
 WriteString(\'\', \'TileWallpaper\', \'1\' );
 end else begin
 WriteString(\'\', \'TileWallpaper\', \'0\' );
 end;
 end;
 reg.Free;
 // Оповещаем всех о том, что мы
 // изменили системные настройки
 SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, Nil,   {Эта строка - продолжение предыдущей}SPIF_SENDWININICHANGE );
 end;
 
 // пример установки WallPaper по центру рабочего стола
 SetWallpaper(\'c:\winnt\winnt.bmp\', False );
 //Эту строчку надо написать где-то в программе.
 
 ===================================================================
 
 Удачи...
 
|  | Ответ отправил: Feniks (статус: Бакалавр)Время отправки: 2 августа 2007, 11:24
 Оценка за ответ: 5
 |  
 Мини-форум вопросаВсего сообщений: 4; последнее сообщение — 30 июля 2007, 18:03; участников в обсуждении: 3. 
|   | Dron (статус: Студент), 30 июля 2007, 13:26 [#1]:"C:\1.jpej" - это случайная опечатка? С уважением. |  
|   | Dron (статус: Студент), 30 июля 2007, 13:26 [#2]:* jpeg - вдобавок сам опечатался   С уважением. |  
|   | Евгений Eklmn (статус: Посетитель), 30 июля 2007, 17:20 [#3]:Ну все вобщем понятно, да вот что значат эти строки CLSID_ActiveDesktop: TGUID = \'{75048700-EF1F-11D0-9888-006097DEACF9}\';
 
 ActiveDesktop := CreateComObject(CLSID_ActiveDesktop)
 as IActiveDesktop;
 и
 AD_APPLY_ALL or AD_APPLY_FORCE
 Генерация случайных чисел - слишком важный вопрос, чтобы оставлять его на волю случая. (Роберт Ковзю, Окриджская лаборатория) |  
|   | Aleksey P. Kharitonov (статус: 3-ий класс), 30 июля 2007, 18:03 [#4]:GUID - это глобальный уникальный идентификатор. CLSID_ActiveDesktop: TGUID =
 \'{75048700-EF1F-11D0-9888-006097DEACF9}\'; - собственно объявление константы типа TGUID
 ActiveDesktop := CreateComObject(CLSID_ActiveDesktop)
 as IActiveDesktop; - создаём экземпляр объекта и преобразуем полученную ссылку на интекрфейс к нужному нам интерфейсу  IActiveDesktop
 
 AD_APPLY_ALL or AD_APPLY_FORCE - чесно говоря не понял что тут
 не понятно. Побитовое сложение, таким образом выставляюся сразу два флага.
 |  31 января 2011, 19:29: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5) Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |