首页 > 开发 > 综合 > 正文

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

2024-07-21 02:15:46
字体:
来源:转载
供稿:网友

一、改变系统时间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命名空间中的所有内容,还有许多有用的东西呢!!
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表