Как определить смену обоев в результате слайд-шоу в Windows 7? - PullRequest
4 голосов
/ 04 апреля 2011

Я пишу программу, которая должна знать, когда обои рабочего стола меняются.После некоторых поисков я нашел частичное решение: http://www.neowin.net/forum/topic/567779-net-detect-wallpaper-change/

По сути, он говорит, чтобы прослушать сообщение WM_SETTINGCHANGE и проверить обои.К сожалению, это сообщение не отправляется при смене обоев в результате слайд-шоу обоев Windows 7.На самом деле, никакое сообщение, похоже, не отправляется в мое приложение для этого (единственный раз, когда я видел WndProc , а не получаю постоянные сообщения :))Вопрос в том, что если не считать опрос реестра и файла обоев на предмет изменений, есть ли способ определить, когда это происходит?Кто-нибудь знает, где я могу найти API-документы, которые перечисляют, какая функция вызывается?

Ответы [ 3 ]

2 голосов
/ 20 апреля 2011

На самом деле я разобрался с этой проблемой.На самом деле существует механизм уведомления реестра, поэтому возможно вызвать событие при изменении указанного ключа / значения.HKEY_CURRENT_USER\Control Panel\Desktop\Wallpaper является ключом.Это не меняется, когда слайд-шоу меняет обои, но файл в этом месте действительно меняется.Контролируя файл на предмет изменений, вы можете быть уведомлены об этом изменении.

Кстати, весь смысл приложения, которое я кодировал, основывался на этом, поэтому опускать его было бы невозможно :).

Спасибо за ваш ответ, хотя - помог моей совести успокоиться в связи с необходимостью пройти такой окольный путь.

1 голос
/ 03 сентября 2015

У меня есть идея получше, недавно я написал небольшую программу, которая автоматически меняет мой фон на LogonScreen, и хотел улучшить это, имея возможность автоматически определять, какие обои находятся на фоне, и устанавливать их, когда окна меняют мой фон. Итак, я начал свое расследование и обнаружил:

  1. % USERDIR% \ AppData \ Roaming \ Microsoft \ Windows \ Themes - место для текущего транскодированного изображения из bg и slideshow.ini, которое содержит небольшую информацию о текущей теме
  2. % USERDIR% \ AppData \ Local \ Microsoft \ Windows \ Themes - папка, содержащая темы, установленные в этой системе

Итак, алгоритм следующий:

  1. прочитайте слайд-шоу.ini и получите значение в разделе [Слайд-шоу]
  2. прочитайте все файлы темы и сравните значение [Slideshow] для каждой темы, и если оно равно - мы нашли файл текущей темы
  3. из файла текущей темы считайте значение Interval = 1800000 (в моем случае это 30 минут) (кстати, интервал помещается после [Slideshow], так что это можно сделать в той же итерации строк)
  4. Чтение времени изменения текущего изображения в bg:% USERDIR% \ AppData \ Roaming \ Microsoft \ Windows \ Themes \ TranscodedWallpaper.jpg
  5. Итак, у нас есть время следующего изменения (current_time - modify_time + Interval) и мы можем выполнить любой код при изменении обоев (также не забывайте ситуации перехвата, если настройки изменены или изменение отключено - потому что это может вызвать исключения, как улучшение мы можем перепроверить этот файл каждую минуту или что-то вроде этого)
  6. И если вы попытаетесь написать ту же программу, не забудьте сжать размер изображения, так как для этого требуется максимум 256 КБ.
1 голос
/ 20 апреля 2011

Это хороший вопрос, и я оставил его без ответа на некоторое время, чтобы узнать, знал ли кто-то что-то, чего я не знал.

Но, к сожалению, я думаю, вы обнаружите, что это невозможнополучать уведомления, соответствующие этому событию.Слайд-шоу обоев фактически не меняет системную тему или какие-либо настройки системы, поэтому сообщение WM_SETTINGCHANGE не отправляется.Он предназначен для работы в фоновом режиме и не требует уведомления любого приложения.Если пользователь выбрал параметр «слайд-шоу», разумно предположить, что они ожидают изменения фона через определенные промежутки времени, никакого взаимодействия или уведомления не требуется.Короче говоря, по крайней мере, в 99% случаев ваше приложение должно , а не реагировать по-другому в результате изменений обоев, возникающих в результате выбора слайд-шоу.чтобы определить интервал, в течение которого они должны быть изменены, а затем попросить ваше приложение ответить соответствующим образом по истечении этого времени.По сути, вам придется создавать свои собственные уведомления и отвечать на них.

Опрашивать реестр настоятельно не рекомендуется.Мало того, что это полностью недокументировано и поэтому может быть взломано в будущих версиях Windows (или даже обновлениях Windows!), Но это также не является надежным показателем.Если есть какая-либо альтернатива (включая полное исключение функциональности), я бы выбрал этот путь.

...