首页 > 编程语言 >C# 通过Win32API设置客户端系统时间

C# 通过Win32API设置客户端系统时间

时间:2024-06-17 21:33:59浏览次数:26  
标签:SystemTime C# ushort 时间 sysTime static Win32API public 客户端

在日常工作中,有时可能会需要获取或修改客户端电脑的系统时间,比如软件设置了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设置客户端系统时间】的全部内容,希望可以抛砖引玉,一起学习,共同进步。

 

标签:SystemTime,C#,ushort,时间,sysTime,static,Win32API,public,客户端
From: https://www.cnblogs.com/hsiang/p/18251106

相关文章

  • Pytorch入门(一):MNIST-手写数字识别-搭建网络模型
    前言作为刚入门深度学习的一位初学者来说,各种各样的学习资料、视频让我看得头昏眼花。明明本来是想了解Pytorch使用方法,莫名其妙看了一个多小时的算法推理,原理逻辑,让人很是苦恼。于是在自己学习了一段时间后,打算做出这个pytorch的系列教程,就是想让大家基于项目进行实战,更......
  • Linux – menuconfig讲解
    menuconfig1.简介        menuconfig是一套图像化配置工具,由ncurses库提供软件支持。ncurses库提供了一系列的函数以便使用者调用它们去生成基于文本的用户界面。        menuconfig本身的软件只负责提供menuconfig工作的这一套逻辑,比如说通过上下左右调整......
  • LeetCode:经典题之150 题解与肢解
    系列目录88.合并两个有序数组52.螺旋数组567.字符串的排列643.子数组最大平均数150.逆波兰表达式目录系列目录150.逆波兰表达式肢解剖析150.逆波兰表达式......
  • 树莓派pico入坑笔记,快捷键键盘制作
    使用usb_hid功能制作快捷键小键盘,定义了6个键,分别是ctrl+z ctrl+v ctrl+c ctrl+a ctrl+w ctrl+n 对应引脚board.GP4,board.GP8,board.GP13board.GP28,board.GP20,board.GP17需要用到的库,记得复制进单片机存储里面然后是main主程序代码importboardfromdig......
  • (26-4-02)基于OpenAI和LangChain的上市公司估值系统:OpenAI API和Langchain探索(2)Langch
    10.5.2 Langchain和OpenAI处理编写文件summarizer.py,定义了使用Langchain和OpenAI处理文本和文档的功能处。其中,类UnstructuredStringLoader用于加载未结构化的字符串内容,将其分割成适当大小的块。方法split_text_in_chunks和方法split_doc_in_chunks分别用于将文本......
  • vivado NODE、PACKAGE_PIN
    节点是Xilinx部件上用于路由连接或网络的设备对象。它是一个WIRE集合,跨越多个瓦片,物理和电气连接在一起。节点可以连接到单个SITE_,而是简单地将NETs携带进、携带出或携带穿过站点。节点可以连接到任何数量的PIP,并且也可以由捆绑驱动。相关对象如图2-30第112页所示,NODE对......
  • C#聊天室客户端完整③
    窗体进入聊天室界面(panel里面,label,textbox,button):聊天界面(flowLayoutPanel(聊天面板)):文档大纲(panel设置顶层(登录界面),聊天界面在底层)步骤:设置进入聊天室→输入聊天→右边自己发送的消息→左边别人发的消息MyClient.cs(进入聊天室类)internalclassMyClie......
  • C语言---------深入理解指针
    目录一、字符指针二、指针数组:三、数组指针:1、定义:2、&数组名和数组名区别:3、数组指针的使用:四、数组参数,指针参数:1、一维数组传参:2、二维数组传参:3、一级指针传参:4、二级指针传参:五、函数指针:1、定义:2、函数名和&函数名:3、函数指针的调用:六、函数指针数组:七......
  • Angular 18+ 高级教程 – Memory leak, unsubscribe, onDestroy
    何谓 MemoryLeak?Angular是SPA(Single-pageapplication)框架,用来开发SPA。SPA最大的特点就是它不刷新页面,不刷新就容易造成memoryleak。举个例子:有一个页面A,我们写了一个setInterval执行一些代码(比如autoplay幻灯片)。当用户离开页面A去页面B时,传统网......
  • vscode error: ‘for‘ loop initial declarations are only allowed in C99 mode解决
    在tasks.json的args里加上-std=c99{"version":"2.0.0","tasks":[{"type":"shell","label":"C/C++:g++.exe生成活动文件","command"......