小工具—系统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);
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}
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
源码下载: