小工具—系统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

3

4

5

6

7

8

9

10

11

12

13

14

15

已经有了设为系统时间的方法,接下来就需要一个方法来创建随机时间。如果你直接取年的随机值、月的随机值、日的随机值……这种方法是不可行的,因为你会发现取到的时间并不一定是在你限定的时间范围内。
因为Datetime的基本单位是秒,所有我们可以在秒上做文章:先用TimeSpan求出两个时间之间相差的秒数,在以秒为最大值随机取一个值,然后以就小的时间加上随机取得的数。
1
public 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

4

5

6

7

8

9

10

11

12

13

14

接下来是将DateTime转换为SystemTime

源码下载: