Как я могу обнаружить изменение обоев в результате слайд-шоу в Windows 7?
Я пишу программу, которая должна знать, когда обои рабочего стола меняются. После некоторых поисков я нашел частичное решение: http://www.neowin.net/forum/topic/567779-net-detect-wallpaper-change/
По сути, он говорит, чтобы слушать WM_SETTINGCHANGE
сообщение и проверьте обои. К сожалению, это сообщение не отправляется при смене обоев в результате слайд-шоу обоев Windows 7. На самом деле, никакое сообщение, похоже, не отправляется в мою заявку для этого (единственный раз, когда я видел WndProc
не получать постоянных сообщений:)).
Итак, мой вопрос, если не считать опрос реестра и файла обоев на предмет изменений, есть ли способ определить, когда это произойдет? Кто-нибудь знает, где я могу найти API-документы, которые перечисляют, какая функция вызывается?
3 ответа
На самом деле я нашел обходной путь к проблеме. На самом деле существует механизм уведомления реестра, поэтому возможно вызвать событие при изменении указанного ключа / значения. HKEY_CURRENT_USER\Control Panel\Desktop\Wallpaper
это ключ. Это не изменяется, когда слайд-шоу меняет обои, но файл в этом месте действительно меняется. Контролируя файл на предмет изменений, вы можете быть уведомлены об этом изменении.
Кстати, весь смысл приложения, которое я кодировал, основывался на этом, так что опускать его было бы невозможно:).
Спасибо за ваш ответ, хотя - помог успокоить мою совесть в отношении того, чтобы пройти через такой окольный способ делать вещи.
Это хороший вопрос, и я оставил его без ответа на некоторое время, чтобы узнать, знал ли кто-то что-то, чего не знал я.
Но, к сожалению, я думаю, вы обнаружите, что невозможно получать уведомления, соответствующие этому событию. Слайд-шоу обоев фактически не меняет системную тему или какие-либо настройки системы, поэтому WM_SETTINGCHANGE
сообщение не отправлено. Он предназначен для работы в фоновом режиме и не требует уведомления любого приложения. Если пользователь выбрал параметр "слайд-шоу", разумно предположить, что они ожидают, что фон будет меняться через определенные промежутки времени, не требуется никакого взаимодействия или уведомления. Короче говоря, по крайней мере, в 99% случаев ваше приложение не должно реагировать по-другому в результате изменений обоев, возникающих в результате показа слайдов.
Лучшее, что я могу придумать, - это определить интервал, который они указали для смены обоев, и затем соответствующим образом отреагировать на ваше приложение по истечении этого времени. По сути, вам придется создавать и отвечать на свои собственные уведомления.
Опрос реестра не рекомендуется. Мало того, что это полностью недокументировано и поэтому может быть взломано в будущих версиях Windows (или даже обновлениях Windows!), Но это также не является надежным показателем. Если есть какая-либо альтернатива (включая полное исключение функциональности), я бы выбрал этот путь.
У меня есть идея получше, недавно я написал небольшую программу, которая автоматически меняет мой фон на LogonScreen, и хотел улучшить это, имея возможность автоматически определять, какие обои находятся на заднем плане, и устанавливать то же самое, когда окна меняют мой фон. Итак, я начал свое расследование и обнаружил:
- % USERDIR% \ AppData \ Roaming \ Microsoft \ Windows \ Themes - место для текущего транскодированного изображения из bg и slideshow.ini, которое содержит немного информации о текущей теме
- %USERDIR%\AppData\Local\Microsoft\Windows\Themes - папка, содержащая темы, установленные в этой системе
Итак, алгоритм следующий:
- прочитайте slideshow.ini и получите значение в разделе [Slideshow]
- прочитайте все файлы темы и сравните значение [Slideshow] для каждой темы и, если оно равно, мы нашли текущий файл темы
- из файла текущей темы прочитайте значение Interval=1800000 (в моем случае это 30 мин) (кстати, интервал после [Slideshow], так что это можно сделать в той же итерации строк)
- Прочитайте время изменения текущего изображения в bg: %USERDIR%\AppData\Roaming\Microsoft\Windows\Themes\TranscodedWallpaper.jpg
- Итак, у нас есть время следующего изменения (current_time - modify_time + Interval) и мы можем выполнить любой код при смене обоев (также не забывайте ситуации перехвата, если настройки изменены или изменение отключено - потому что это может вызвать исключения, а улучшение, мы можем перепроверить этот файл каждую минуту или как то так)
- И если вы попытаетесь написать ту же программу, не забудьте сжать размер изображения, так как для этого требуется максимум 256 КБ.