我正在编写一个程序,需要知道桌面壁纸何时发生变化。经过一番搜索,我发现了一个部分解决方案: http://www.neowin.net/forum/topic/567779-net-detect-wallpaper-change/
基本上,它说要听WM_SETTINGCHANGE
message,并检查壁纸。不幸的是,当Windows 7壁纸幻灯片显示更改壁纸时,似乎不会发送此消息。事实上,似乎没有任何消息发送到我的应用程序(我唯一一次看到WndProc
不获取常量消息:))。
所以我的问题是,如果没有轮询注册表和壁纸文件进行更改,有没有办法检测何时发生这种情况?有谁知道我在哪里可以找到列出调用哪个函数的API文档?
答案 0 :(得分:2)
实际上我找到了解决这个问题的方法。实际上有一个注册表通知机制,因此可以在指定的键/值更改时引发事件。
HKEY_CURRENT_USER\Control Panel\Desktop\Wallpaper
是关键。幻灯片显示更改壁纸时,这不会更改,但该位置的文件确实会更改。通过监视文件的更改,您可以实际收到此更改的通知。
顺便说一句,我编写的应用程序的重点都依赖于它,所以省略它不是一个选项:)。
感谢您的回复 - 帮助我的良心休息,不得不经历如此迂回的做事方式。
答案 1 :(得分:1)
这是一个很好的问题,我有一段时间没有回答,看看是否有人知道我不知道的事情。
但不幸的是,我认为你会发现收到与此事件相对应的通知消息是不可能的。壁纸幻灯片显示实际上不会更改系统主题或任何系统设置,因此不会发送WM_SETTINGCHANGE
消息。它旨在在后台发生,不要求通知任何应用程序。如果用户选择了“幻灯片放映”选项,则可以合理地假设他们期望定期更改背景,不需要任何交互或通知。简而言之,在至少99%的情况下,由于幻灯片显示选项产生的壁纸更改,您的应用程序不会有任何不同的响应。
我能想到的最好的事情是确定他们指定的壁纸应该更改的间隔,然后让应用程序在该时间过后做出相应的响应。基本上,您必须创建并回复自己的通知。
不鼓励强烈轮询注册表。这不仅完全没有文档记录,因而在未来的Windows版本(甚至是Windows更新版本)上也有所突破,但它也不是一个可靠的指标。如果有任何替代方案(包括完全省略功能),那就是我要采取的路径。
答案 2 :(得分:1)
我有一个更好的想法,不久之前我写了一个小程序,自动更改我在LogonScreen上的背景,并希望通过自动检测背景上的壁纸并在窗口更改背景时设置相同来改善这一点。所以,我开始调查,发现:
所以,算法如下: