在C#中改变系统时间 && 得到系统时间改变通知

本文章为该blog(blog.csdn.net/uoyevoli/)主人 uoyevoli 原创(作者个人网站: www.farproc.com),如果转载,请注明出处,谢谢!! 2005-8-5


一、改变系统时间

C#的System.DateTime类提供了对日期时间的封装,用它进行时间的转换和处理很方便,但是我没有在其中找到任何可以用来修改系统时间的成员。用过VC、VB等的朋友可能知道,我们可以调用Win32 API SetLocalTime来改变系统时间,看来C#中也只能如此了。SetLocalTime需要一个SYSTEMTIME结构指针作为参数,这倒不难,我们可以“比葫芦画瓢”很快在C#中定义这个结构,但问题是,我同时还想“享受”.NET Framework的System.DateTime在时间转换和处理方面的便利,怎么办?只有自己动手了,为我们的C#中的SYSTEMTIME编写成员函数,实现和System.DateTime之间的互转。请看下面的代码:

首先我为了以后调用方便,新建了一个C#文件,在里面把SetLocalTimeAPI放到一个名称为Win32API的类中,并把这个类放到我自己定义的namespace中,避免名称冲突。以后我还可以不断向这个类和名称空间添加常用的API,以便构造我自己的C#Win32 API函数库J

//Forproc_Win32.cs

//对常用Win32 API函数及结构的声明

using System;

using System.Runtime.InteropServices;

 

namespace Farproc.Win32

{

    ///<summary>

    ///

    ///</summary>

    public structSYSTEMTIME

    {

        public ushort wYear;

        public ushort wMonth;

        public ushortwDayOfWeek;

        public ushort wDay;

        public ushort wHour;

        public ushortwMinute;

        public ushortwSecond;

        public ushortwMilliseconds;

 

        ///<summary>

        ///从System.DateTime转换。

        ///</summary>

        ///<param name="time">System.DateTime类型的时间。</param>

        public void FromDateTime(DateTimetime)

        {

            wYear =(ushort)time.Year;

            wMonth =(ushort)time.Month;

            wDayOfWeek= (ushort)time.DayOfWeek;

            wDay = (ushort)time.Day;

            wHour =(ushort)time.Hour;

            wMinute= (ushort)time.Minute;

            wSecond= (ushort)time.Second;

            wMilliseconds= (ushort)time.Millisecond;

        }

        ///<summary>

        ///转换为System.DateTime类型。

        ///</summary>

        ///<returns></returns>

        public DateTime ToDateTime()

        {

            return newDateTime(wYear, wMonth, wDay, wHour, wMinute, wSecond, wMilliseconds);

        }

        ///<summary>

        ///静态方法。转换为System.DateTime类型。

        ///</summary>

        ///<paramname="time">SYSTEMTIME类型的时间。</param>

        ///<returns></returns>

        public staticDateTime ToDateTime(SYSTEMTIME time)

        {

            return time.ToDateTime();

        }

    }

    public class Win32API

    {

        [DllImport("Kernel32.dll")]

        public static extern bool SetLocalTime(ref SYSTEMTIME Time );

        [DllImport("Kernel32.dll")]

        public static extern voidGetLocalTime(ref SYSTEMTIME Time);

    }

}

下面在WinForm程序中调用。新建一个C#WinForm程序,在Form上添加一个按钮button1,并添加如下代码:

private void button1_Click(object sender, System.EventArgs e)

{

    //取得当前系统时间

    DateTime t =DateTime.Now;

    //在当前时间上加上一周

    t =t.AddDays(7);

    //转换System.DateTime到SYSTEMTIME

    SYSTEMTIME st = new SYSTEMTIME();

    st.FromDateTime(t);

    //调用Win32 API设置系统时间

    Win32API.SetLocalTime(ref st);

    //显示当前时间

    MessageBox.Show(DateTime.Now.ToString());

}

然后就可以运行这个程序看到效果了。

 

二、得到系统时间改变通知

另一个问题,如果系统时间被人为改动了,我的程序想得到通知,并做相应的处理,怎么办?好像很难,呵呵,其实Framework早为我们准备好了。比起上一个问题,这个似乎还要简单一些。

在Microsoft.Win32命名空间中有一个SystemEvents类,我们只要定制它的一个静态事件TimeChanged就OK了!!

代码片断如下:

private void Form1_Load(object sender, System.EventArgs e)

{

    //定制事件

    SystemEvents.TimeChanged+= new EventHandler(SystemEvents_TimeChanged);

}

//事件处理函数

private voidSystemEvents_TimeChanged(object sender,EventArgs e)

{

    MessageBox.Show("系统时间被改变了,现在时间为:" +DateTime.Now.ToString());

}

注意,这个事件在Console程序中是无效的,可能是因为这个事件本身要依赖窗口和窗口消息吧。

 

另外,建议大家仔细看看Microsoft.Win32命名空间中的所有内容,还有许多有用的东西呢!!
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值