如何通过服务更改Windows机器的墙纸(C#)

k2fxgqgv  于 2022-12-14  发布在  Windows
关注(0)|答案(1)|浏览(130)
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上运行
已尝试更改计时器、图像路径

c9qzyr3d

c9qzyr3d1#

Windows可以让多个用户同时登录,所以我不确定在服务中放置这样的东西是否有意义。
墙纸是每个用户的设置。服务是否应该更改所有用户的墙纸?
当使用者登入工作阶段1及更高版本时,服务会在工作阶段0中执行。即使您仿真使用者,也无法广播更新消息,因为工作阶段/ windows 工作站有问题。
如果您只想在 Boot 时和/或每次用户注销时更新墙纸,我想您可以直接写入HKEY_USERS键。
如果你想根据计时器动态更新,我想你可以使用CreateProcessAsUser在正确的会话中使用用户令牌生成一个助手进程,但这比忘记自己是一个服务,而只是将应用程序设置为在启动时作为一个正常程序运行要多得多...

相关问题