|
Вопрос # 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)
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|