using System.Runtime.InteropServices;
using System.Timers;
namespace WindowsServicesManager
{
class WallpaperService
{
[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern int SystemParametersInfo(
Int32 uAction,
Int32 uParam,
String lpvParam,
Int32 fuWinIni);
private readonly System.Timers.Timer _timer;
private Random rand = new();
public WallpaperService()
{
_timer = new System.Timers.Timer(100) {AutoReset = true};
_timer.Elapsed += change;
}
void change(object? sender, EventArgs e)
{
SetWallpaper($"{Environment.CurrentDirectory}/Icon.png");
_timer.Interval = TimeSpan.FromDays(rand.Next(6, 15)).TotalMilliseconds;
}
public void SetWallpaper(String path) => SystemParametersInfo(20, 0, path, 0x01 | 0x02);
public void Start()
{
_timer.Start();
}
public void Stop()
{
_timer.Stop();
}
}
}
当我把它作为一个控制台应用程序运行时,它工作得很好,但一旦我把它作为一个服务安装,它就不工作了,一切都在windows 10上运行
已尝试更改计时器、图像路径
1条答案
按热度按时间c9qzyr3d1#
Windows可以让多个用户同时登录,所以我不确定在服务中放置这样的东西是否有意义。
墙纸是每个用户的设置。服务是否应该更改所有用户的墙纸?
当使用者登入工作阶段1及更高版本时,服务会在工作阶段0中执行。即使您仿真使用者,也无法广播更新消息,因为工作阶段/ windows 工作站有问题。
如果您只想在 Boot 时和/或每次用户注销时更新墙纸,我想您可以直接写入HKEY_USERS键。
如果你想根据计时器动态更新,我想你可以使用
CreateProcessAsUser
在正确的会话中使用用户令牌生成一个助手进程,但这比忘记自己是一个服务,而只是将应用程序设置为在启动时作为一个正常程序运行要多得多...