4

我正在编写一个需要知道桌面墙纸何时更改的程序。经过一番搜索,我找到了部分解决方案:http: //www.neowin.net/forum/topic/567779-net-detect-wallpaper-change/

本质上,它说要收听WM_SETTINGCHANGE消息,然后检查墙纸。不幸的是,当由于 Windows 7 壁纸幻灯片放映而更改壁纸时,似乎不会发送此消息。事实上,似乎根本没有向我的应用程序发送任何消息(我见过的唯一一次WndProc 没有收到持续的消息:))。

所以我的问题是,没有轮询注册表和壁纸文件以进行更改,有没有办法检测何时发生这种情况?有谁知道我在哪里可以找到列出调用什么函数的 API 文档?

4

3 回答 3

2

这是一个很好的问题,我暂时没有回答它,看看是否有人知道我不知道的事情。

但不幸的是,我想您会发现无法接收到与此事件对应的通知消息。墙纸幻灯片实际上不会更改系统主题或任何系统设置,因此WM_SETTINGCHANGE不会发送消息。它被设计为在后台发生,不需要通知任何应用程序。如果用户选择了“幻灯片”选项,可以合理地假设他们希望背景定期更改,无需交互或通知。简而言之,在至少 99% 的情况下,您的应用程序不应幻灯片选项引起的壁纸更改而做出任何不同的响应。

我能想到的最好的事情是确定他们指定的墙纸应该更改的时间间隔,然后让您的应用程序在该时间过去后做出相应的响应。本质上,您必须创建并响应您自己的通知。

强烈建议不要对注册表进行轮询。这不仅完全没有记录,因此可能会在未来的 Windows 版本(甚至 Windows 更新!)上被破坏,而且它也不是一个可靠的指标。如果有任何替代方案(包括完全省略该功能),这就是我要采取的路径。

于 2011-04-20T03:56:03.057 回答
2

其实我想出了一个解决这个问题的方法。实际上有一个注册表通知机制,因此可以在指定的键/值更改时引发事件。 HKEY_CURRENT_USER\Control Panel\Desktop\Wallpaper是关键。当幻灯片更改墙纸时,这不会更改,但该位置的文件确实会更改。通过监视文件的更改,您实际上可以收到有关此更改的通知。

顺便说一句,我正在编写的应用程序的全部意义都依赖于此,因此省略它不是一个选择:)。

不过,感谢您的回复 - 让我的良心得以安息,因为我不得不经历如此迂回的做事方式。

于 2011-04-20T11:40:37.893 回答
1

我有一个更好的想法,不久前我编写了一个小程序,可以自动更改我在 LogonScreen 上的背景,并希望通过自动检测背景上的墙纸并在 Windows 更改我的背景时设置相同的能力来改进这一点。所以,我开始调查并发现:

  1. %USERDIR%\AppData\Roaming\Microsoft\Windows\Themes - 存放来自 bg 和 slideshow.ini 的当前转码图像的位置,其中包含有关当前主题的少量信息
  2. %USERDIR%\AppData\Local\Microsoft\Windows\Themes - 包含此系统上安装的主题的文件夹

所以,算法如下:

  1. 阅读 slideshow.ini 并在 [Slideshow] 下获取值
  2. 读取所有主题文件并比较每个主题的 [Slideshow] 值以及是否相等 - 我们找到了当前主题文件
  3. 从当前主题的文件读取间隔= 1800000的值(在我的情况下是30分钟)(顺便说一句,间隔放置在[幻灯片]之后,因此可以在同一行迭代中完成)
  4. 从 bg 上的当前图像读取修改时间:%USERDIR%\AppData\Roaming\Microsoft\Windows\Themes\TranscodedWallpaper.jpg
  5. 因此,我们有下一次更改的时间(current_time - modify_time + Interval)并且可以在墙纸更改时执行任何代码(如果设置更改或更改被禁用,也不要忘记捕获情况 - 因为它可能导致异常,因为改进我们可以重新检查这个文件每分钟或类似的东西)
  6. 如果您尝试编写相同的程序,请不要忘记压缩图像大小,因为它需要最大 256Kb。
于 2015-09-03T17:13:57.070 回答