C#通过Win32API设置客户端系统时间的方法详解

 更新时间:2024年06月21日 10:13:57   作者:老码识途呀  
在日常工作中,有时可能会需要获取或修改客户端电脑的系统时间,比如软件设置了Licence有效期,本文以一个简单的小例子,简述如何通过C#获取和设置客户端电脑的系统时间,仅供学习分享使用,如有不足之处,还请指正,需要的朋友可以参考下

在日常工作中,有时可能会需要获取或修改客户端电脑的系统时间,比如软件设置了Licence有效期,预计2024-06-01 00:00:00到期,如果客户手动修改了客户端电脑时间,往前调整了一年,则软件就可以继续使用一年,如此循环往复,则Licence将形同虚设。所以有时候需要校验客户端电脑时间和服务器端时间,是否一致,如果不一致,则需要修改客户端电脑时间或进行系统提示。本文以一个简单的小例子,简述如何通过C#获取和设置客户端电脑的系统时间,仅供学习分享使用,如有不足之处,还请指正。

涉及知识点

在windows系统中,设置系统时间,主要通过win32提供的API来实现,如下所示:

  • SetLocalTime 设置系统的本地化时间
  • GetLocalTime 获取系统的本地化时间
  • SetSystemTime 设置系统的Utc时间
  • GetSystemTime 获取系统的Utc时间

核心代码

时间结构体

在上述四个系统函数中,都需要一个时间类型的结构体,包含时分秒,年月日。如下所示:

[StructLayout(LayoutKind.Sequential)]
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;
 
	public override string ToString()
	{
		return $"{wYear}-{wMonth}-{wDay} {wHour}:{wMinute}:{wSecond}.{wMilliseconds}";
	}
}

系统时间帮助类

为了方便调用,将4个系统函数进行封装到一个类中SysTimeHelper,如下所示:

public class SysTimeHelper
{
	[DllImport("kernel32.dll")]
	public static extern bool SetSystemTime(ref SystemTime st);
 
	[DllImport("Kernel32.dll")]
	public static extern bool SetLocalTime(ref SystemTime st);
 
	[DllImport("Kernel32.dll")]
	public static extern void GetSystemTime(ref SystemTime st);
 
	[DllImport("Kernel32.dll")]
	public static extern void GetLocalTime(ref SystemTime st);
 
	public static string GetLocalTime()
	{
		SystemTime st = new SystemTime();
		GetLocalTime(ref st);
		return st.ToString();
	}
 
	public static bool SetLocalTimeByStr(string timestr)
	{
		bool flag = false;
		SystemTime sysTime = new SystemTime();
		DateTime dt = Convert.ToDateTime(timestr);
		sysTime.wYear = Convert.ToUInt16(dt.Year);
		sysTime.wMonth = Convert.ToUInt16(dt.Month);
		sysTime.wDay = Convert.ToUInt16(dt.Day);
		sysTime.wHour = Convert.ToUInt16(dt.Hour);
		sysTime.wMinute = Convert.ToUInt16(dt.Minute);
		sysTime.wSecond = Convert.ToUInt16(dt.Second);
		try
		{
			flag = SetLocalTime(ref sysTime);
		}
		catch (Exception ex)
		{
			string e = ex.Message;
			return false;
		}
		return flag;
	}
 
	/// <summary>        
	/// 时间戳转为C#格式时间        
	/// </summary>        
	/// <param name=”timeStamp”></param>        
	/// <returns></returns>        
	public static DateTime ConvertStringToDateTime(string timeStamp)
	{
		DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));
		long lTime = long.Parse(timeStamp + "0000");
		TimeSpan toNow = new TimeSpan(lTime);
		return dtStart.Add(toNow);
	}
 
	/// <summary>
	/// 时间戳转为C#格式时间10位
	/// </summary>
	/// <param name="timeStamp">Unix时间戳格式</param>
	/// <returns>C#格式时间</returns>
	public static DateTime GetDateTimeFrom1970Ticks(long curSeconds)
	{
		DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));
		return dtStart.AddSeconds(curSeconds);
	}
 
 
}

函数调用

在页面调用时,即可通过SysTimeHelper帮助类,进行获取和修改系统时间。如下所示:

public partial class MainWindow : Window
{
	public MainWindow()
	{
		InitializeComponent();
	}
 
	private void Window_Loaded(object sender, RoutedEventArgs e)
	{
		var time = SysTimeHelper.GetLocalTime();
		this.txtTime.Text = time;
	}
 
	private void Button_Click(object sender, RoutedEventArgs e)
	{
		var time = this.txtTime.Text;
		bool flag = SysTimeHelper.SetLocalTimeByStr(time);
		if(flag)
		{
			MessageBox.Show("设置成功");
		}
		else
		{
			MessageBox.Show("设置失败");
		}
	}
}

实例演示

通过VS运行程序,在打开程序时,获取时间,然后手动修改时间,点击设置,如下所示:

如果设置过后,想要回复,可通过设置页面【同步时钟】进行恢复,如下所示:

注意,如果在调试时,设置失败【SetLocalTime返回false】,可通过【以管理员身份运行】的方式打开Visual Studio,如下所示:

或者直接通过【以管理员身份运行】启动程序,如下所示:

以上就是C#通过Win32API设置客户端系统时间的方法详解的详细内容,更多关于C# Win32API系统时间的资料请关注脚本之家其它相关文章!

相关文章

  • C# BackgroundWorker组件学习入门介绍

    C# BackgroundWorker组件学习入门介绍

    一个程序中需要进行大量的运算,并且需要在运算过程中支持用户一定的交互,为了获得更好的用户体验,使用BackgroundWorker来完成这一功能
    2013-10-10
  • C# 使用PrintDocument类打印标签的方法

    C# 使用PrintDocument类打印标签的方法

    本文介绍打印机初步配置,以及实现方法,标签主要展示资产基本信息以及二维码,对C# 使用PrintDocument类打印标签的详细过程感兴趣的朋友一起看看吧
    2022-04-04
  • C#字符串加密解密方法实例

    C#字符串加密解密方法实例

    这篇文章主要介绍了C#字符串加密解密方法,实例分析了C#对字符串加密与解密的操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03
  • C#中TextBox的横线样式及占位提示详解

    C#中TextBox的横线样式及占位提示详解

    横线样式就是将TextBox以一条底横线的形式展示在页面,占位提示就是Web的Placeholder属性,即在输入框没有内容的时候进行一个输入提示。本文主要介绍了C#中TextBox的这两个的实现,需要的可以参考一下
    2022-11-11
  • C#精确计算年龄的方法分析

    C#精确计算年龄的方法分析

    这篇文章主要介绍了C#精确计算年龄的方法,实例分析了C#计算时间的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03
  • C#进行图像处理的常见方法(Bitmap,BitmapData,IntPtr)使用详解

    C#进行图像处理的常见方法(Bitmap,BitmapData,IntPtr)使用详解

    这篇文章主要为大家详细介绍了C#进行图像处理的几个常见方法(Bitmap,BitmapData,IntPtr)具体使用,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下
    2024-01-01
  • Unity实现鼠标点2D转3D进行旋转

    Unity实现鼠标点2D转3D进行旋转

    这篇文章主要为大家详细介绍了Unity实现鼠标点2D转3D进行旋转,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • C#自定义IP输入框控件

    C#自定义IP输入框控件

    这篇文章主要为大家详细介绍了C#自定义IP输入框控件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • C#多线程同步lock、Mutex的实现

    C#多线程同步lock、Mutex的实现

    本文主要介绍了C#多线程同步lock、Mutex的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-05-05
  • C# 通过反射初探ORM框架的实现原理(详解)

    C# 通过反射初探ORM框架的实现原理(详解)

    下面小编就为大家分享一篇C# 通过反射初探ORM框架的实现原理详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12

最新评论