Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何检测Windows 7幻灯片放映导致的墙纸变化?_.net_Wpf_Winapi_Windows 7_Wallpaper - Fatal编程技术网

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

.net 如何检测Windows 7幻灯片放映导致的墙纸变化?,.net,wpf,winapi,windows-7,wallpaper,.net,Wpf,Winapi,Windows 7,Wallpaper,我正在写一个程序,需要知道桌面墙纸何时改变。经过一些搜索,我找到了部分解决方案: 基本上,它说的是听录音,然后检查壁纸。不幸的是,当Windows 7壁纸幻灯片放映导致壁纸更改时,此消息似乎不会发送。事实上,我的应用程序似乎根本没有收到任何消息(这是我唯一一次看到WndProc没有收到固定消息:) 所以我的问题是,除了轮询注册表和墙纸文件的更改外,是否有方法检测何时发生这种情况?有人知道我在哪里可以找到列出调用什么函数的API文档吗?这是一个很好的问题,我暂时没有回答,看看有没有人知道我不知道

我正在写一个程序,需要知道桌面墙纸何时改变。经过一些搜索,我找到了部分解决方案:

基本上,它说的是听录音,然后检查壁纸。不幸的是,当Windows 7壁纸幻灯片放映导致壁纸更改时,此消息似乎不会发送。事实上,我的应用程序似乎根本没有收到任何消息(这是我唯一一次看到
WndProc
没有收到固定消息:)


所以我的问题是,除了轮询注册表和墙纸文件的更改外,是否有方法检测何时发生这种情况?有人知道我在哪里可以找到列出调用什么函数的API文档吗?

这是一个很好的问题,我暂时没有回答,看看有没有人知道我不知道的东西

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

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


强烈反对对注册表进行轮询。这不仅完全没有文档记录,因此可能会破坏未来版本的Windows(甚至Windows更新!),而且这也不是一个可靠的指标。如果有其他选择(包括完全省略功能),那就是我要走的道路。

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

顺便说一句,我编写的应用程序的全部要点都依赖于这一点,所以省略它将不是一个选项:)


不过,谢谢你的回复——这让我对不得不以如此迂回的方式做事感到良心不安

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

  • %USERDIR%\AppData\Roaming\Microsoft\Windows\Themes-用于存放bg和slideshow.ini中当前转码图像的位置,其中包含有关当前主题的少量信息
  • %USERDIR%\AppData\Local\Microsoft\Windows\Themes-包含此系统上安装的主题的文件夹
  • 因此,算法如下所示:

  • 读取slideshow.ini并获取[slideshow]下的值
  • 读取所有主题文件,比较每个主题的[Slideshow]值,如果相等,则找到当前的主题文件
  • 从当前主题的文件中读取间隔值=1800000(在我的例子中是30分钟)(顺便说一句,间隔放在[幻灯片放映]之后,因此可以在相同的行迭代中完成)
  • 从bg上的当前图像读取修改时间:%USERDIR%\AppData\Roaming\Microsoft\Windows\Themes\TranscodedWallpaper.jpg
  • 因此,我们有下一次更改的时间(当前时间-修改时间+间隔),可以在墙纸更改时执行任何代码(如果设置更改或更改被禁用,也不要忘记捕获情况,因为这可能会导致异常,因为改进后,我们可以每分钟或类似的方式重新检查此文件)
  • 如果您想编写相同的程序,请不要忘记压缩图像大小,因为它最多需要256Kb

  • 啊,你是说那个?是的,这绝对是一个比自己投票更优雅的选择。一定要小心这样的实施细节;如果Windows的未来版本更改位置,您的应用程序可能会中断。FileSystemWatcher类在此处可能很有用。我成功地使用了此处描述的技术,但请记住,如果您在运行Desktops 2.0之类的应用程序,它将为每个桌面生成一个资源管理器外壳。每个资源管理器实例可以以不同的速率和不同的幻灯片循环,因此文件可能会与当前正在查看的桌面上的内容不同步。该文件由所有资源管理器实例更新。不幸的是,我还没有找到解决方案,但这是需要注意的。我刚刚了解到,多个监视器将具有与我上面描述的多个explorer实例相同的行为。我无法确定最新背景显示在哪个显示器上。有什么想法吗?对于任何新的人。