当前位置: 首页 > news >正文

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

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

相关文章:

  • git Fork或者git clone克隆别人的项目到自己的仓库如何保持原仓库同步
  • flume配置----a1.sources.r1.positionFile=xxxx.json
  • mysql如何创建并执行事件?
  • Mysql union语句
  • Bagging与Boosting的应用与优势
  • 计算机网络期末复习
  • 【设计模式-12】代理模式的代码实现及使用场景
  • 【SpringBoot】94、SpringBoot中使用MyBatis-Plus实现数据权限管理
  • 上海交通大学、中科大 开源镜像站停止 Docker Hub 仓库镜像支持后的可用替代源
  • springboot宠物领养系统-计算机毕业设计源码07863
  • python2.7pip报错:UnicodeDecodeError: ‘ascii‘ codec can‘t decode
  • 运维监控系统
  • 大数据安全经典面试题及回答(上)
  • 2024 年最新 windows 操作系统部署安装 redis 数据库详细教程(更新中)
  • 第二十一篇——信道:信息通道的容量有边界嘛?
  • ES6语法详解(一)
  • JavaScript 奇技淫巧
  • js 实现textarea输入字数提示
  • Python语法速览与机器学习开发环境搭建
  • redis学习笔记(三):列表、集合、有序集合
  • SQLServer之创建数据库快照
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 和 || 运算
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 在weex里面使用chart图表
  • #includecmath
  • (02)Hive SQL编译成MapReduce任务的过程
  • (2024)docker-compose实战 (8)部署LAMP项目(最终版)
  • (9)目标检测_SSD的原理
  • (c语言+数据结构链表)项目:贪吃蛇
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (ZT)薛涌:谈贫说富
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (每日持续更新)jdk api之FileFilter基础、应用、实战
  • (算法)N皇后问题
  • (五)c52学习之旅-静态数码管
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • (转)关于pipe()的详细解析
  • .Net Memory Profiler的使用举例
  • .net 发送邮件
  • .Net--CLS,CTS,CLI,BCL,FCL
  • .NET连接MongoDB数据库实例教程
  • .NET应用架构设计:原则、模式与实践 目录预览
  • .sh 的运行
  • ??Nginx实现会话保持_Nginx会话保持与Redis的结合_Nginx实现四层负载均衡
  • @RunWith注解作用
  • []C/C++读取串口接收到的数据程序
  • [17]JAVAEE-HTTP协议
  • [20150629]简单的加密连接.txt
  • [Android]将私钥(.pk8)和公钥证书(.pem/.crt)合并成一个PKCS#12格式的密钥库文件
  • [BZOJ] 3262: 陌上花开
  • [C++进阶]map和set的相关题目
  • [CCF-CSP] 202303-4 星际网络II