我编了一个Windows服务程序,为什么程序无法启动?

时间:2022-08-29 14:54:36
这是一个壁纸自动换程序,不让启动,哪位高手帮我看一下

启动服务的时候提示:
本地计算机上的Service_Windows服务启动后停止,某些服务在未由其它服务或程序使用时将自动停止。

我用这些代码照般到一个窗口程序中就完全正常,就是编成Windows服务程序就无法启动

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Runtime.InteropServices;
using Microsoft.Win32;
using System.IO;

namespace Service_Windows
{
    public partial class Service_Windows : ServiceBase
    {
        public Service_Windows()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            huanbizhi hbz = new huanbizhi();
            hbz.huan(@"H:\3号机备分\bak\照片", 5, 0);
        }

        protected override void OnStop()
        {
        }
    }
    public class huanbizhi
    {
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern int SystemParametersInfo(int uAction, int uParam, string lpvParam, int fuWinIni);

        [DllImport("user32.dll")]
        public static extern bool SetSysColors(int cElements, int[] lpaElements, int[] lpaRgbValues);




        public void huan(string path, int time, int yangshi)
        {
            string[] filename = Directory.GetFiles(path);
            Random rd = new Random();
            bool b = true;
            while (b)
            {
                ChangeWallPaper(filename[rd.Next(0, filename.Length - 1)], yangshi);
                System.Threading.Thread.Sleep(time * 1000);
            }
        }
        public void ChangeWallPaper(string picturePath, int style)
        {
            try
            {
                //修改壁纸注册表
                RegistryKey myRegKey = Registry.CurrentUser.OpenSubKey("Control Panel\\desktop", true);
                switch (style)
                {
                    case 0: //居中
                        myRegKey.SetValue("TileWallpaper", "0");
                        myRegKey.SetValue("WallpaperStyle", "0");
                        break;
                    case 1: //平铺
                        myRegKey.SetValue("TileWallpaper", "1");
                        myRegKey.SetValue("WallpaperStyle", "0");
                        break;
                    case 2: //拉伸
                        myRegKey.SetValue("TileWallpaper", "0");
                        myRegKey.SetValue("WallpaperStyle", "2");
                        break;
                }
                myRegKey.SetValue("WallPaper", picturePath);
                myRegKey.Close();

                //修改背景色注册表
                RegistryKey bKey = Registry.CurrentUser.OpenSubKey("Control Panel\\Colors", true);
                bKey.SetValue("Background", 0 + " " + 0 + " " + 255);
                int[] elements = { 1 };
                int[] colors = { 0, 0, 255 };
                SetSysColors(elements.Length, elements, colors);
                bKey.Close();

                //更新图片
                if (File.Exists(picturePath))
                {
                    //nResult = SystemParametersInfo(20, 1, @"F:\图片\新建文件夹\1.jpg", 0x1 | 0x2);
                    //nResult = SystemParametersInfo(20, 3, @"F:\exin.JPG", 0x1 | 0x2);
                    if (SystemParametersInfo(20, 1, picturePath, 1) == 0)
                    {
                        throw new Exception("更换壁纸失败");
                    }
                }
            }
            catch
            {
                throw new Exception("更换壁纸失败");
            }
        }
    }
}

7 个解决方案

#1


服务也要有Main函数入口
你的Main函数有吗?

 using System;
 using System.ServiceProcess;


namespace Service_Windows
{
       internal static class Program
    {
        private static void Main()
        {
            ServiceBase.Run(new ServiceBase[] { new Service_Windows () });
        }
    }
}

#2


 RegistryKey bKey = Registry.CurrentUser.OpenSubKey("Control Panel\\Colors", true);
                
你修改注册表是修改的当前用户的注册表值,而服务程序的启动帐户一般是system。也就是说做成服务后修改的是system帐户的壁纸,而不是你登录帐户的壁纸。
要想解决的话可以把服务的登录帐户设置为你自己的帐户。
以上是我分析。没有验证过,不知道对不对。

#3


楼上说的有道理  窗口程序和服务程序不一样的噢 窗口程序不需要main函数

#4


引用 3 楼 yexihao 的回复:
楼上说的有道理  窗口程序和服务程序不一样的噢 窗口程序不需要main函数


窗口程序也需要Main()方法 我编了一个Windows服务程序,为什么程序无法启动?

#5


我又试了一下,问题就出在

using System.Runtime.InteropServices;




[DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern int SystemParametersInfo(int uAction, int uParam, string lpvParam, int fuWinIni);

if (SystemParametersInfo(20, 1, picturePath, 1) == 0)
                    {
                        throw new Exception("更换壁纸失败");
                    }

这几句上,我把hbz.huan(@"H:\3号机备分\bak\照片", 5, 0);方法注释掉,马上就能正常启动,所以,和程序入口没关系

#6


引用 4 楼 vb763305825 的回复:
Quote: 引用 3 楼 yexihao 的回复:

楼上说的有道理  窗口程序和服务程序不一样的噢 窗口程序不需要main函数


窗口程序也需要Main()方法 我编了一个Windows服务程序,为什么程序无法启动?

这是什么问题阿

#7


引用 5 楼 vkv123 的回复:
我又试了一下,问题就出在

using System.Runtime.InteropServices;




[DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern int SystemParametersInfo(int uAction, int uParam, string lpvParam, int fuWinIni);

if (SystemParametersInfo(20, 1, picturePath, 1) == 0)
                    {
                        throw new Exception("更换壁纸失败");
                    }

这几句上,我把hbz.huan(@"H:\3号机备分\bak\照片", 5, 0);方法注释掉,马上就能正常启动,所以,和程序入口没关系


这是什么问题啊??!!

#1


服务也要有Main函数入口
你的Main函数有吗?

 using System;
 using System.ServiceProcess;


namespace Service_Windows
{
       internal static class Program
    {
        private static void Main()
        {
            ServiceBase.Run(new ServiceBase[] { new Service_Windows () });
        }
    }
}

#2


 RegistryKey bKey = Registry.CurrentUser.OpenSubKey("Control Panel\\Colors", true);
                
你修改注册表是修改的当前用户的注册表值,而服务程序的启动帐户一般是system。也就是说做成服务后修改的是system帐户的壁纸,而不是你登录帐户的壁纸。
要想解决的话可以把服务的登录帐户设置为你自己的帐户。
以上是我分析。没有验证过,不知道对不对。

#3


楼上说的有道理  窗口程序和服务程序不一样的噢 窗口程序不需要main函数

#4


引用 3 楼 yexihao 的回复:
楼上说的有道理  窗口程序和服务程序不一样的噢 窗口程序不需要main函数


窗口程序也需要Main()方法 我编了一个Windows服务程序,为什么程序无法启动?

#5


我又试了一下,问题就出在

using System.Runtime.InteropServices;




[DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern int SystemParametersInfo(int uAction, int uParam, string lpvParam, int fuWinIni);

if (SystemParametersInfo(20, 1, picturePath, 1) == 0)
                    {
                        throw new Exception("更换壁纸失败");
                    }

这几句上,我把hbz.huan(@"H:\3号机备分\bak\照片", 5, 0);方法注释掉,马上就能正常启动,所以,和程序入口没关系

#6


引用 4 楼 vb763305825 的回复:
Quote: 引用 3 楼 yexihao 的回复:

楼上说的有道理  窗口程序和服务程序不一样的噢 窗口程序不需要main函数


窗口程序也需要Main()方法 我编了一个Windows服务程序,为什么程序无法启动?

这是什么问题阿

#7


引用 5 楼 vkv123 的回复:
我又试了一下,问题就出在

using System.Runtime.InteropServices;




[DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern int SystemParametersInfo(int uAction, int uParam, string lpvParam, int fuWinIni);

if (SystemParametersInfo(20, 1, picturePath, 1) == 0)
                    {
                        throw new Exception("更换壁纸失败");
                    }

这几句上,我把hbz.huan(@"H:\3号机备分\bak\照片", 5, 0);方法注释掉,马上就能正常启动,所以,和程序入口没关系


这是什么问题啊??!!