Как сделать настройки отображения значков рабочего стола в Windows актуальными?
Иногда пользователи Windows сталкиваются с проблемой, когда настройки отображения значков на рабочем столе не сохраняются должным образом. Одним из способов управления этими настройками является использование функции SHGetSetSettings, которая позволяет скрыть или показать значки. В данном руководстве мы рассмотрим, почему этот метод может не работать, и предложим альтернативные решения.
Проблема с использованием SHGetSetSettings
Код, представленный ниже, вызывает функцию SHGetSetSettings для скрытия значков рабочего стола, но вместо этого просто снимает галочку с пункта меню "Показать значки рабочего стола".
var
lpss: SHELLSTATE;
begin
lpss.Data := High(cardinal);
lpss.Data2 := Low(cardinal);
SHGetSetSettings(lpss, SSF_HIDEICONS, True);
SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_FLUSHNOWAIT, nil, nil);
end;
Попытка обновить рабочий стол с помощью SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_FLUSHNOWAIT, nil, nil) не приводит к желаемому результату.
Альтернативные решения
Отправка сообщения WM_KEYDOWN
Для обновления рабочего стола можно отправить сообщение WM_KEYDOWN с кодом VK_F5 в окно Progman (Program Manager):
Другой способ скрыть значки рабочего стола и обновить экран - это скрыть и затем показать окно Progman:
ShowWindow(FindWindow('Progman', nil), SW_HIDE); // скрыть значки рабочего стола и обновить экран
ShowWindow(FindWindow('Progman', nil), SW_SHOW); // показать значки рабочего стола и обновить
Скрытие и показ контрола SysListView32
Окно рабочего стола имеет следующую иерархию:
Progman - Program Manager
SHELLDLL_DefView
FolderView - SysListView32
Контрол SysListView32 отвечает за отображение значков. Вы можете скрыть и показать этот контрол, чтобы скрыть или показать значки соответственно.
function GetDesktopListView: HWnd;
begin
Result := GetWindow(GetWindow(FindWindow('Progman', nil), GW_CHILD), GW_CHILD);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowWindow(GetDesktopListView, SW_SHOW);
end;
Вызов GetDesktopListView, передав результат в ShowWindow(SW_SHOW), покажет скрытые значки обратно.
Изменение типов сообщений SHChangeNotify
Возможно, выбран не тот тип сообщения для SHChangeNotify. Вместо SHCNE_ASSOCCHANGED (изменение ассоциаций файлов), которое не соответствует изменению настроек оболочки, попробуйте использовать SHCNE_ALLVENTS, SHCNE_UPDATEDIR или SHCNE_UPDATEITEM с рабочим столом.
Отправка сообщения WM_SETTINGCHANGE
Попытка отправки сообщения WM_SETTINGCHANGE может быть еще одним способом обновления настроек рабочего стола.
Заключение
Если настройки отображения значков на рабочем столе не сохраняются после использования SHGetSetSettings, попробуйте альтернативные методы, предложенные выше. В случае, если ни один из этих методов не решает проблему, возможно, стоит обратить внимание на другие системные настройки, такие как автоматическая смена обоев рабочего стола, которая может мешать корректному отображению значков.
Приведенные примеры кода написаны на Object Pascal, который используется в среде разработки Delphi, что делает их пригодными для использования в проектах, связанных с Pascal и Delphi.
Вопрос касается проблем с сохранением настроек отображения значков рабочего стола в Windows и предложение альтернативных способов их обновления.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.