`
buliedian
  • 浏览: 1238375 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论
阅读更多

作者:文斌
主页:文斌程序网 http://www.wenbinweb.com

Windows服务是独立于登录用户而工作的Windows应用程序,它通常在计算机启动时开始执行,且常常连续执行,直到计算机关闭为止。像Exchange Server,IIS和杀毒软件等都使用这种方式,这样就可以独立于某一用户而且可以在任何用户登录前来运行,同时也可以服务于所有的进程,从而以一种服务的形式存在。
正因为Windows服务有着这么多的特性,因此,当需要一些特殊功能的时候就可以考虑使用Windows服务来解决问题。比如下面我们要做的这个例子。对于我们这些程序设计人员,计算机是在一起工作时间最长的伙伴,每天都会对着它的屏幕八个小时以上,还不包括下班后在家打游戏的时间,因此,保护眼睛是最重要的了。问题的起因来源于本人周六去眼科对激光手术的复查,大夫一再向我强调眼睛的自我调节能力,就是说只要你能保证你每隔一个小时左右就闭眼休息或向远处眺望,离开电脑屏幕,那么已经治好的近视就不会反弹。本人虽是自律性比较强的人,但在计算机屏幕面前就不再如此了,往往几个小时也不抬头一次,为了眼睛的健康,我决定把这个艰巨的任务交由计算机来完成,让它在一小时左右自动提醒我休息五分钟。如此一来,岂不是再也不用顾虑这件事了。
功能虽然简单,但要写个程序放在启动组里每天自动运行也不是一个好的办法,正巧以前也没做过Windows服务,不如索性来试一试,同进也看看.NET为我们提供了多么先进的功能吧,于是决定,就用C#来做一个提醒我保护眼睛的Windows服务,取名就叫CareEye吧。
运行Visual Studio.NET 2003,建立一个C#的Windows服务项目,在CareEye.cs的设计视图提示可以把需要的控件和组件拖动到这上面,假如想要做系统日志的话当然就可以把EventLog组件拖过来了,不过这个程序好像不需要这些东西,还是算了吧。那么计时要不要采用计时器控件呢?想了一下,这个控件虽然好用,但太常用了,本着学习新知识的原则,最恰当的恐怕就是线程了,而且在以后做其他Windows服务的时候线程肯定是必需的,所以还是用线程好,这样我只要在线程中完成对时间的监测,把线程的启动和停止交给服务的启动和停止,呵,很方便啊。
再来看CareEye.cs的源程序,一大堆没见过的东西,不过仔细分析一下也就没什么了。CareEye类派生于ServiceBase类,因此继承了基本服务类的特性,显然Main()方法会由SCM(服务控制管理程序)调用,在这个方法中Run一个新的CareEye实例,这样就运行了一个Windows服务,OnStart()和OnStop()明显是用于启动和停止服务的响应函数了。
注意在Main()方法中有一个ServiceBase[]的数组,它是为那些一个服务进程包含多个服务准备的,对于这个程序来说,它只有一个CareEye服务,因此完全可以把这个数组删除,而只是使用System.ServiceProcess.ServiceBase.Run(new CareEye());一句就够了。
接下来为了使用线程,需要引入System.Threading命名空间,为了使用对话框,还需要引入System.Windows.Forms命名空间,这是为了将来提示用户时显示对话框而准备的。
下面为类CareEye添加一个成员字段private Thread MainThread;同时在构造函数中对其进行初始化:
MainThread=new Thread(new ThreadStart(ThreadFunc));
MainThread.Priority=ThreadPriority.Lowest;
这里把线程的优先级设到最低,这样不会耗用过多的系统性能。这个线程对象使用ThreadFunc作为线程函数,因此将这个线程函数补充完整:
public static void ThreadFunc()
{
int LastHour=DateTime.Now.Hour;
while (true)
{
System.Threading.Thread.Sleep(60000);
if (DateTime.Now.Hour-1==LastHour)
{
MessageBox.Show("为了爱护您的眼睛,请您暂时休息5分钟并向远处眺望!","警告",MessageBoxButtons.OK,MessageBoxIcon.Warning,MessageBoxDefaultButton.Button1,
MessageBoxOptions.DefaultDesktopOnly);
LastHour=DateTime.Now.Hour;
}
}
}
余下的代码就简单了,只要在OnStart中启动线程,在OnStop中停止线程就行了。
以上的服务程序虽然很简单,线程的处理上也不很恰当,也违背了很多服务程序的原则比如界面显示等,但对于本人的需求而言是足够了,因此就如此制作了。如果你有需要,当然可以把对话框改为其他的提醒方式如响铃等,线程也可以使用内核对象同时使用更好的处理方法。
Windows服务就做完了,余下的就是要测试了,但发现这个EXE无法运行,它会提示你该EXE需要使用安装程序来安装服务,看来不可能写一个程序就算是Windows服务了,还要把它注册到Windows才行。
接下来,右击CareEye.cs的设计视图,添加安装程序,(VS.NET想得就是挺周到的),这下又出来一批代码,不过好在不用改代码了,只要把Account的账户类型设成LocalSystem,把StartType设成手动启动就行了,这里用手动是为了方便调试,以后可以改成自动类型。
编译完后,还是无法运行,此处还需要一步,就是运行installutil来安装这个服务,其安装和卸载的用法为:
installutil CareEye.exe
installutil /u CareEye.exe
安装完后能过系统的服务管理器你就可以看到你的服务了,只要点击启动就可以把它启动,把时间向前改一个小时它就会提醒你需要休息了,呵呵,够简单了吧。
如果你想制作成安装包分发给自己的朋友,只需要再添加个部署项目就行了,不过为了完成自注册,要在自定义操作编辑器中的安装阶段添加一个自定义的安装操作,把InstallerClass属性设成TRUE即可。
余下的事情,就是自己动手试试吧,这回不用担心用眼超时了!有空到文斌程序网座座吧!
以下是careeye.cs的源程序:
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.ServiceProcess;
using System.Threading;
using System.Windows.Forms;

namespace CareEye
{
public class CareEye : System.ServiceProcess.ServiceBase
{
private Thread MainThread;
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.Container components = null;

public CareEye()
{
// 该调用是 Windows.Forms 组件设计器所必需的。
InitializeComponent();

// TODO: 在 InitComponent 调用后添加任何初始化
MainThread=new Thread(new ThreadStart(ThreadFunc));
MainThread.Priority=ThreadPriority.Lowest;
}

// 进程的主入口点
static void Main()
{
//System.ServiceProcess.ServiceBase[] ServicesToRun;

// 同一进程中可以运行多个用户服务。若要将
//另一个服务添加到此进程,请更改下行
// 以创建另一个服务对象。例如,
//
// ServicesToRun = New System.ServiceProcess.ServiceBase[] {new CareEye(), new MySecondUserService()};
//
//ServicesToRun = new System.ServiceProcess.ServiceBase[] { new CareEye() };

System.ServiceProcess.ServiceBase.Run(new CareEye());
}

/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器
/// 修改此方法的内容。
/// </summary>
private void InitializeComponent()
{
//
// CareEye
//
this.ServiceName = "CareEye";

}

/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}

/// <summary>
/// 设置具体的操作,以便服务可以执行它的工作。
/// </summary>
protected override void OnStart(string[] args)
{
// TODO: 在此处添加代码以启动服务。
MainThread.Start();
}

/// <summary>
/// 停止此服务。
/// </summary>
protected override void OnStop()
{
// TODO: 在此处添加代码以执行停止服务所需的关闭操作。
MainThread.Abort();
}
public static void ThreadFunc()
{
int LastHour=DateTime.Now.Hour;
while (true)
{
System.Threading.Thread.Sleep(60000);
if (DateTime.Now.Hour-1==LastHour)
{
MessageBox.Show("为了爱护您的眼睛,请您暂时休息5分钟并向远处眺望!","警告",MessageBoxButtons.OK,MessageBoxIcon.Warning,MessageBoxDefaultButton.Button1,MessageBoxOptions.DefaultDesktopOnly);
LastHour=DateTime.Now.Hour;
}
}
}
}
}

分享到:
评论

相关推荐

    Visual C#中调用Windows服务初探

    在Visual C#中,开发Windows服务是一个常见的任务,特别是在需要后台执行、无用户交互的应用场景下。Windows服务是一种特殊的Windows应用程序,它可以在没有用户登录的情况下运行,并且可以持续执行,直至计算机关闭...

    用C#开发Windows服务、自动安装注册(转).doc

    一、Windows 服务初探 Windows 服务是 Windows 操作系统中的一种特殊类型的应用程序,它可以在后台运行,不需要用户交互,通常用于提供一些公共服务,如打印服务、文件共享服务等。在本文中,我们将使用 C# 语言...

    Windows系统服务初探

    在Windows操作系统中,系统服务是后台运行的程序,它们在用户登录之前启动,为系统提供必要的功能,并且可以在用户不直接交互的情况下运行。本篇文章将深入探讨Windows系统服务的原理、创建过程以及服务间的通信机制...

    Linux和Windows服务器的统一管理初探.pdf

    Samba允许Linux服务器模拟Windows网络服务,如NTFS权限和SMB协议,使得Windows客户端可以无缝访问Linux服务器上的文件和打印机。配置Samba涉及到设置用户账户、共享目录以及安全策略,这对于保持跨平台协作至关重要...

    《初探WINDOWS下IME编程》配套源代码

    《初探WINDOWS下IME编程》是一本专注于探讨如何在Windows操作系统环境下进行输入法(IME,Input Method Editor)开发的专业书籍。IME是操作系统中一个至关重要的组件,它负责处理用户输入,特别是对于非拉丁字符集的...

    Windows 2003服务器多网站的配置初探.pdf

    【Windows 2003服务器多网站配置】在信息技术领域,Windows Server 2003作为一款经典的操作系统,广泛应用于各类企事业单位,包括技术技能人才培养的技工院校。面对有限的硬件资源,如何高效利用服务器,建立多个...

    Windows补丁升级自动化初探.pdf

    综上所述,“Windows补丁升级自动化初探”这一主题涉及了企业IT安全领域的多个重要方面,包括安全补丁管理、WSUS服务的部署与配置、VBScript脚本编程以及自动化流程的设计和实施。通过自动化升级不仅可以快速响应...

    WindowsCE6_0嵌入式应用程序开发初探.pdf

    ### Windows CE 6.0 嵌入式应用程序开发初探 #### 一、引言 自20世纪70年代末以来,随着单片机技术的广泛应用和发展,嵌入式系统逐渐成为科技领域的核心之一。进入21世纪,以嵌入式智能设备为主的后PC时代已悄然...

    Windows Vista系统账户保护机制初探

    Windows Vista系统账户保护机制初探,重点在于引入了User Account Protection(UAP),这是一个重要的安全功能,旨在降低普通用户日常操作中的系统风险。在Vista之前的系统中,用户通常以管理员权限登录,这意味着...

    MFC Windows 程序设计之编辑框初探

    MFC Windows 程序设计之编辑框初探,适合初学MFC的小伙伴学习研究,博客中有对应的讲解和演示,避免走弯路,费时费力。也真心希望能够帮助正在苦学MFC Windows 程序设计的小伙伴们,你们的成长是我最大的幸福

    Windows Vista 操作系统防火墙初探

    微软下一代操作系统Windows Vista中,系统自带的防火墙有没有什么创新?粗看之下,你可能会觉得失望,因为Vista中的防火墙在界面上和Windows XP SP2没有任何区别,不过别着急,Vista中的防火墙功能可谓大大地提高了...

    MFC Windows 程序设计之编辑框的初探

    MFC Windows 程序设计之编辑框的初探,适合初学MFC的小伙伴学习研究,博客中有对应的讲解和演示,避免走弯路,费时费力。也真心希望能够帮助正在苦学MFC Windows 程序设计的小伙伴们,你们的成长是我最大的幸福

    Windows Vista的系统防火墙初探

    在微软下一代操作系统Windows Vista中,系统自带的防火墙有没有什么创新?粗看之下,你可能会觉得失望,因为Vista中的防火墙在界面上和Windows XP SP2没有任何区别,不过别着急,Vista中的防火墙功能可谓大大地提高...

    流式视音频服务中和相关技术初探.ppt

    【流式视音频服务中的相关技术初探】 流式视音频服务是当今互联网上广泛使用的媒体传播方式,它允许用户无需等待整个文件下载完毕就能观看或收听内容。本报告将探讨流媒体技术、视频压缩、服务器负载均衡技术和传输...

    源码附件:VC--初探WINDOWS下的IME编程.rar_VC i_ime_注册表

    初探WINDOWS下IME编程源码: 大家知道,DELPHI许多控件有IME属性。这么好用的东西VC可没自带,怎么办呢?其实,可通过注册表,用API实现。下面说一下本人对IME的研究结果,并提供示例工程供大家参考:

    OpenCV初探:一、windows桌面程序示例源代码

    本压缩包提供的是在Windows环境下使用OpenCV进行桌面应用程序开发的示例源代码,对于初学者来说是一个很好的起点。 1. **OpenCV简介** OpenCV最初由Intel开发,现在由它背后的非盈利组织Itseez3D维护。它支持多种...

    商业编程-源码-《初探WINDOWS下IME编程》配套源代码.zip

    《初探WINDOWS下IME编程》配套源代码是一个深入学习Windows平台输入法引擎(IME)开发的重要资源。IME,全称为Input Method Editor,是操作系统中用于输入非拉丁字符集的软件组件,尤其对于中文、日文、韩文等亚洲...

    Spy++原理初探

    Spy++是一款强大的Windows系统调试工具,它主要用于观察和分析Windows应用程序的窗口、消息、线程以及进程等。本文将深入探讨Spy++的工作原理,并通过VC++源码来解析其内部机制。 首先,让我们理解Spy++的基本功能...

Global site tag (gtag.js) - Google Analytics