[原创]在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# 文件,在里面把 SetLocalTime API 放到一个名称为 Win32API 的类中,并把这个类放到我自己定义的 namespace 中,避免名称冲突。以后我还可以不断向这个类和名称空间添加常用的 API ,以便构造我自己的 C# Win32 API 函数库 J

//Forproc_Win32.cs

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

using System;

using System.Runtime.InteropServices;

namespace Farproc.Win32

{

///

1<summary>
2
3/// 
4
5///  </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;

///

1<summary>
2
3///  从  System.DateTime  转换。 
4
5///  </summary>

///

1<param name="time"/>

System.DateTime 类型的时间。

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;

}

///

1<summary>
2
3///  转换为  System.DateTime  类型。 
4
5///  </summary>

///

1<returns></returns>

public DateTime ToDateTime()

{

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

}

///

1<summary>
2
3///  静态方法。转换为  System.DateTime  类型。 
4
5///  </summary>

///

1<param name="time"/>

SYSTEMTIME 类型的时间。

///

1<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 命名空间中的所有内容,还有许多有用的东西呢!!

2005-8-5

Published At
Categories with Web编程
Tagged with
comments powered by Disqus