Windows API触发壁纸随机更换

6

有没有一种方法可以在Windows壁纸幻灯片中触发随机播放?最好是我可以从.NET使用的东西。

编辑:所以我正在尝试使用IActiveDesktop接口,我从这里获得了它,我尝试像这样使用它:

public static IActiveDesktop GetActiveDesktop()
{
    Type typeActiveDesktop = Type.GetTypeFromCLSID(new Guid("{75048700-EF1F-11D0-9888-006097DEACF9}"));
    return (IActiveDesktop) Activator.CreateInstance(typeActiveDesktop);
}

然后这样调用它:
IActiveDesktop dt = GetActiveDesktop();
dt.ApplyChanges(AD_APPLY.ALL | AD_APPLY.FORCE | AD_APPLY.BUFFERED_REFRESH);

当我运行代码时,什么也没有发生,也没有错误。


我怀疑是否有适用于此的API。 - Tamara Wijsman
5个回答

3

请尝试以下操作:

你的主题位于C:\Users\USERNAME\AppData\Local\Microsoft\Windows\Themes\.theme。

打开.theme文件并在[Slideshow]部分更新Shuffle标志:

[Slideshow]     
Shuffle=1

使用IActiveDesktop接口重新加载主题,调用ApplyChange方法,并使用以下参数:
AD_APPLY_ALL | AD_APPLY_FORCE | AD_APPLY_BUFFERED_REFRESH

你应该使用个性化控制面板来切换洗牌,而不是编辑主题文件。 - BoltClock
不能保证用户的个人资料目录与其用户名完全对应。如果我要编写代码来解决这个问题,我不会依赖路径的一致性。首先,我会获取当前用户的个人资料目录以构建字符串。 - ShiggityShiggityShwa
我从这里获取了接口,但似乎并不起作用。我创建了一个新实例Type typeActiveDesktop = Type.GetTypeFromCLSID(new Guid("{75048700-EF1F-11D0-9888-006097DEACF9}")) - Madd0g

1

哦,等等,刚发现你只想要洗牌。Flot2011的回答 是正确的方法。

您可以通过以下方式找到当前用户主题的完整路径:

HKCU\Software\Microsoft\Windows\CurrentVersion\Themes\CurrentTheme

如果有任何API可以实现这一点,它可能还没有被公开。如果我是你,我会模拟单击“桌面上一个背景”选项在桌面上下文菜单中。有几种方法可以做到这一点,但我建议您使用GetDesktopWindow api,模拟鼠标右键单击并发送“n”键。我不完全确定这将产生什么效果,但应该可以工作。

另外看看这个:http://www.technixupdate.com/keyboard-shortcut-or-hotkey-to-switch-to-next-windows-7-desktop-wallpaper/


0
如果有人只需要一个快速的、hacky脚本,这个powershell脚本似乎对我有效,如果你不介意几秒钟的延迟和窗口的关闭和重新打开。
Function Next-Slide() {

   $shellApp = New-Object -ComObject  Shell.Application
   $wScript = New-Object -ComObject WScript.Shell

   # stack.push(...)
   # I guess this is assuming we aren't on the desktop already...
   $shellApp.ToggleDesktop();

   # This doesn't seem to be needed...
   #$desktopLoc = $wScript.SpecialFolders('Desktop');
   #$wScript.AppActivate($desktopLoc);

   #Give time to get to the desktop
   sleep 1;

   # Hack to make sure something is selected on the desktop
   # if there is something to select.
   $wScript.SendKeys('{RIGHT}');
   $wScript.SendKeys('{UP}');
   $wScript.SendKeys('{LEFT}');
   $wScript.SendKeys('{DOWN}');

   # Now undo the selection so that we get the desktop context
   # menu, not the icon one. This toggles selection on desktop.
   $wScript.SendKeys("^ ");


   # Open a context menu and select the option to see the next slide
   $wScript.SendKeys("+{F10}");
   $wScript.SendKeys("n");
   $wScript.SendKeys("~"); #This is ENTER

   # Give the key commands time to be read
   sleep 1;

   # stack.pop()
   $shellApp.ToggleDesktop();
}

注意:当我运行这段代码时,屏幕右下角会弹出数字键盘开/关指示器。我不确定原因,可能正在发生变化。

0

我使用AutoHotkey通过COM调用IDesktopWallpaper :: AdvanceSlideshow。这也可以通过各种 方式以编程方式完成。

我不能为这个AHK实现负责,我相信最初的功劳归功于AHK论坛上的qwerty12

#^w::  ; Ctrl-Win-W to advance to next wallpaper
   try if ((pDesktopWallpaper := ComObjCreate("{C2CF3110-460E-4fc1-B9D0-8A1C0C9CC4BD}", "{B92B56A9-8B55-4E14-9A89-0199BBB6F93B}"))) {
      DllCall(NumGet(NumGet(pDesktopWallpaper+0)+16*A_PtrSize), "Ptr", pDesktopWallpaper, "Ptr", 0, "UInt", 0) ; IDesktopWallpaper::AdvanceSlideshow - https://msdn.microsoft.com/en-us/library/windows/desktop/hh706947(v=vs.85).aspx
      ObjRelease(pDesktopWallpaper)
   }
return

0

注册表键

HKEY_CURRENT_USER\Control Panel\Personalization\Desktop Slideshow

包含值,应该让您控制该功能的几个方面。


我从未尝试通过更改这些值来触发当前环境中的更改,因此我不能保证在编辑它们后立即看到差异。 - ShiggityShiggityShwa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接