小工具—系统API应用

    下午班上一做网站的同学打电话,请我帮忙做一个小工具。源于他做了一个网站,手头也采集了大量的帖子(应该是电子文档吧),发帖子总不能是一个时候发的吧,于是就请可帮做一个小工具——在指定的时间范围内间隔指定的时间随机改变系统时间。

要改变系统时间,.NET里好像没有现成的方法,就只有通过Win32 API来实现了。于是我就查阅了API大全,得到的SetSystemTime函数:

    在SetSystemTime的参数中,参数类型为SYSTEMTIME,查阅MSND后得到SYSTEMTIME的结构如下:

typedef struct _SYSTEMTIME {

WORD wYear;

WORD wMonth;

WORD wDayOfWeek;

WORD wDay;

WORD wHour;

WORD wMinute;

WORD wSecond;

WORD wMilliseconds;

} SYSTEMTIME;

其内容相信不用我说了吧。

所以在C#中SYSTEMTIME的结构和SetSystemTime函数定义如下:

 

 

 1        [StructLayout(LayoutKind.Sequential)]
 2        public struct SystemTime
 3        {
 4            public ushort wYear;
 5            public ushort wMonth;
 6            public ushort wDayOfWeek;
 7            public ushort wDay;
 8            public ushort wHour;
 9            public ushort wMinute;
10            public ushort wSecond;
11            public ushort wMiliseconds;
12        }
   
13
14        [DllImport("kernel32")]
15        public static extern Int32 SetSystemTime(ref SystemTime time);

 

 

    已经有了设为系统时间的方法,接下来就需要一个方法来创建随机时间。如果你直接取年的随机值、月的随机值、日的随机值……这种方法是不可行的,因为你会发现取到的时间并不一定是在你限定的时间范围内。

    因为Datetime的基本单位是秒,所有我们可以在秒上做文章:先用TimeSpan求出两个时间之间相差的秒数,在以秒为最大值随机取一个值,然后以就小的时间加上随机取得的数。

 

 

 1public DateTime GetRandomTime(DateTime time1, DateTime time2)
 2{
 3    Random random = new Random((int)DateTime.Now.Ticks);
 4    DateTime minTime = new DateTime();
 5    DateTime maxTime = new DateTime();
 6
 7    System.TimeSpan ts = new System.TimeSpan(time1.Ticks - time2.Ticks);
 8
 9    double dTotalSecontds = ts.TotalSeconds;
10
11    int i = random.Next((int)System.Math.Abs(dTotalSecontds));
12
13    return minTime.AddSeconds(i);
14}

 

    接下来是将DateTime转换为SystemTime

 

 

Code

 

 

    源码下载:

https://files.cnblogs.com/desmend/ChangeSysTime.rar

posted @ 2008-09-22 23:18  齐.net  阅读(578)  评论(0编辑  收藏  举报