一、改变系统时间C#的System.DateTime类提供了对日期时间的封装,用它进行时间的转换和处理很方便,但是我没有在其中找到任何可以用来修改系统时间的成员。用过VC、VB等的朋友可能知道,我们可以调用Win32 API SetLocalTime来改变系统时间,看来C#中也只能如此了。SetLocalTime需要一个SYSTEMTIME结构指针作为参数,这倒不难,我们可以“比葫芦画瓢”很快在C#中定义这个结构,但问题是,我同时还想“享受”.NET Framework的System.DateTime在时间转换和处理方面的便利,怎么办?只有自己动手了,为我们的C#中的SYSTEMTIME编写成员函数,实现和System.DateTime之间的互转。请看下面的代码:首先我为了以后调用方便,新建了一个C#文件,在里面把SetLocalTime API放到一个名称为Win32API的类中,并把这个类放到我自己定义的namespace中,避免名称冲突。以后我还可以不断向这个类和名称空间添加常用的API,以便构造我自己的C# Win32 API函数库J//Forproc_Win32.cs//对常用Win32 API函数及结构的声明using System;using System.Runtime.InteropServices; namespace Farproc.Win32{ /// <summary> /// /// </summary> public struct SYSTEMTIME { public ushort wYear; public ushort wMonth; public ushort wDayOfWeek; public ushort wDay; public ushort wHour; public ushort wMinute; public ushort wSecond; public ushort wMilliseconds; /// <summary> /// 从System.DateTime转换。 /// </summary> /// <param name="time">System.DateTime类型的时间。</param> public void FromDateTime(DateTime time) { 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 new DateTime(wYear, wMonth, wDay, wHour, wMinute, wSecond, wMilliseconds); } /// <summary> /// 静态方法。转换为System.DateTime类型。 /// </summary> /// <param name="time">SYSTEMTIME类型的时间。</param> /// <returns></returns> public static DateTime 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 void GetLocalTime(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 void SystemEvents_TimeChanged(object sender, EventArgs e){ MessageBox.Show("系统时间被改变了,现在时间为:" + DateTime.Now.ToString());}注意,这个事件在Console程序中是无效的,可能是因为这个事件本身要依赖窗口和窗口消息吧。 另外,建议大家仔细看看Microsoft.Win32命名空间中的所有内容,还有许多有用的东西呢!!
在C#中改变系统时间 && 得到系统时间改变通知
80酷酷网 80kuku.com