启动服务的时候提示:
本地计算机上的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函数有吗?
你的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帐户的壁纸,而不是你登录帐户的壁纸。
要想解决的话可以把服务的登录帐户设置为你自己的帐户。
以上是我分析。没有验证过,不知道对不对。
你修改注册表是修改的当前用户的注册表值,而服务程序的启动帐户一般是system。也就是说做成服务后修改的是system帐户的壁纸,而不是你登录帐户的壁纸。
要想解决的话可以把服务的登录帐户设置为你自己的帐户。
以上是我分析。没有验证过,不知道对不对。
#3
楼上说的有道理 窗口程序和服务程序不一样的噢 窗口程序不需要main函数
#4
窗口程序也需要Main()方法
#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);方法注释掉,马上就能正常启动,所以,和程序入口没关系
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
这是什么问题阿
#7
我又试了一下,问题就出在
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函数有吗?
你的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帐户的壁纸,而不是你登录帐户的壁纸。
要想解决的话可以把服务的登录帐户设置为你自己的帐户。
以上是我分析。没有验证过,不知道对不对。
你修改注册表是修改的当前用户的注册表值,而服务程序的启动帐户一般是system。也就是说做成服务后修改的是system帐户的壁纸,而不是你登录帐户的壁纸。
要想解决的话可以把服务的登录帐户设置为你自己的帐户。
以上是我分析。没有验证过,不知道对不对。
#3
楼上说的有道理 窗口程序和服务程序不一样的噢 窗口程序不需要main函数
#4
楼上说的有道理 窗口程序和服务程序不一样的噢 窗口程序不需要main函数
窗口程序也需要Main()方法
#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);方法注释掉,马上就能正常启动,所以,和程序入口没关系
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
楼上说的有道理 窗口程序和服务程序不一样的噢 窗口程序不需要main函数
窗口程序也需要Main()方法
这是什么问题阿
#7
我又试了一下,问题就出在
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);方法注释掉,马上就能正常启动,所以,和程序入口没关系
这是什么问题啊??!!