Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Не сохраняются настройки отображения значков в Windows: Поиск проблемы с `SHGetSetSettings`

Delphi , Синтаксис , Справочник по API-функциям

Как сделать настройки отображения значков рабочего стола в 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):

PostMessage(FindWindow('Progman', nil), WM_KEYDOWN, VK_F5, 3);

Скрытие и показ окна Progman

Другой способ скрыть значки рабочего стола и обновить экран - это скрыть и затем показать окно 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




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Справочник по API-функциям ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-01-13 19:15:53/0.0059199333190918/1