.net - 如何检测由于 Windows 7 幻灯片放映而导致的墙纸变化?

标签 .net wpf winapi windows-7 wallpaper

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

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

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

最佳答案

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

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

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

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

关于.net - 如何检测由于 Windows 7 幻灯片放映而导致的墙纸变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5537836/

相关文章:

asp.net - 这个设计有bug吗?

.net - 用于.NET的写后缓存的Redis可扩展性

wpf - 在 WPF StatusBar 中显示抓取器?

c# - 为什么 Window.FindName() 不发现 x :Name of a button in a child UserControl? AKA NameScopes 如何工作?

c# - 如何以编程方式将文本框大小分配给自动?

c++ - 是否可以启动命令行应用程序而不显示其窗口?

c# - 使用 ExecuteScalar 插入时使用 Npgsql 检索序列号

.net - 插件内的 CEFSharp - "Cannot pass a GCHandle across AppDomains"

winapi - GetWindowRect 返回包含 "invisible"边框的大小

c++ - 检测窗口何时与来自相同或不同进程的另一个窗口重叠