Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 801

/ вопрос решён /

Здравствуйте, уважаемые эксперты!
Как поменять обои на робочем столе? Я использую Windows.SystemParametersInfo(SPI_SetDeskWallPaper, 0, PChar(\'C:\1.jpe\'), SpiF_UpdateIniFile);
но экран становится пустым, без обоев.

Евгений Eklmn Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: Евгений Eklmn (статус: Посетитель)
Вопрос отправлен: 30 июля 2007, 13:20
Состояние вопроса: решён, ответов: 2.

Ответ #1. Отвечает эксперт: Aleksey P. Kharitonov

Здравствуйте, Трофимов Евгений!
Предвательно подключив модули ShlObj и ComObj, воспользуйтесь следующей процедурой:

Приложение:
  1.  
  2. const
  3. CLSID_ActiveDesktop: TGUID = '{75048700-EF1F-11D0-9888-006097DEACF9}';
  4. var
  5. ActiveDesktop: IActiveDesktop;
  6. begin
  7. ActiveDesktop := CreateComObject(CLSID_ActiveDesktop)
  8. as IActiveDesktop;
  9. ActiveDesktop.SetWallpaper(PWideChar(WideString(Path)), 0);
  10. ActiveDesktop.ApplyChanges(AD_APPLY_ALL or AD_APPLY_FORCE);
  11. end;
  12.  


Ответ отправил: 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

Dron (статус: Студент), 30 июля 2007, 13:26 [#1]:

"C:\1.jpej" - это случайная опечатка?
С уважением.
Dron

Dron (статус: Студент), 30 июля 2007, 13:26 [#2]:

* jpeg - вдобавок сам опечатался :-)
С уважением.
Евгений Eklmn

Евгений 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

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)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 12:02
Выполнено за 0.03 сек.