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设置客户端系统时间】的全部内容,希望可以抛砖引玉,一起学习,共同进步。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/717684.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【产品经理】订单处理4-拆单策略

上次讲解了订单的促销策略&#xff0c;本次讲解下订单处理过程中的拆单策略。 订单拆单策略分为自动拆单、手动拆单&#xff0c;拆单时机也分为订单未被审核前拆单、订单审核后因仓库/快递情况的拆单&#xff0c;本次主要讲解订单未被审核前拆单、订单审核后快递超重的拆单&am…

SQL注入-上篇

SQL注入 注入是web安全的头号大敌。注入攻击漏洞往往是应用程序缺少对输入进行安全性检查所引起的。攻击者把一些包含攻击代码当做命令或者查询语句发送给解释器&#xff0c;这些恶意数据可以欺骗解释器&#xff0c;从而执行计划外的命令或者未授权访问数据。注入漏洞通常能sq…

前端构建工具用得好,构建速度提升 10 倍

今天来盘点一下前端构建工具。 Turbopack Turbopack&#xff0c;由Vercel开源&#xff0c;是下一代高性能的JavaScript应用构建工具&#xff0c;目前用于 Next.js 中。Turbopack旨在通过革新JavaScript应用的打包流程来显著提升应用性能&#xff0c;它专注于缩短加载时间&…

分析线程池的构造过程,追踪核心成员变量

分析线程池的构造过程,追踪核心成员变量 1、背景2、核心参数3、这样设计的好处1、背景 上图是对线程池原理的一个详细的表达,它体现了线程池的几个核心概念,具体是哪些概念呢,让我们一起来探索。 2、核心参数 首先通过对Executors创建线程池的方法签名的分析,我们会发现…

简单一招实现计件工资的核算

现在很多工厂都采用计件工资的管理办法&#xff0c;这充分体现了多劳多得、按劳取酬的薪资分配原则&#xff0c;同时鼓励先进鞭策后进&#xff0c;奖勤罚懒&#xff0c;摒弃计时工资的“大锅饭”心态&#xff0c;提高了企业的整体运作效率。 计件工资的难题 但是在实际的操作中…

马斯克的薪酬风波:一场560亿的激励之战

引言 在2024年的特斯拉股东大会上&#xff0c;埃隆马斯克成功获得了价值560亿美元的薪酬激励&#xff0c;这一事件引起了广泛关注和讨论。这次股东大会不仅标志着特斯拉在AI和机器人领域的战略布局&#xff0c;同时也揭示了马斯克在公司治理和薪酬激励机制中的独特策略。本文将…

第2讲:pixi.js 绘制HelloWorld

基于第0讲和第1讲&#xff0c;我们增添了vite.config.ts文件。并配置了其他的http端口。 此时&#xff0c;我们删除掉没用的东西。 删除 conter.ts、typescript.svg 在main.ts中改成如下内容&#xff1a; import {Application, Text} from pixi.js import ./style.css// 指明…

“深入探讨Redis主从复制:原理、配置与优化“

目录 # 概念 1. 配置主从同步步骤 1.1 创建文件夹 1.2 复制配置文件 1.3 配置文件关闭 1.4 查看端口号&#xff0c;发现端口号存在 1.5 连接三个端口号 1.6 查看主机运行情况 1.7 让服务器变成&#xff08;主机&#xff09;或&#xff08;从机&#xff09; 1.8 实现效…

关于禁止word的无用插入模式

这是我的word版本号 点击左上角文件选项 找到左侧最下方的选项 点击高级 把这两个叉掉

ssm宠物网站系统-计算机毕业设计源码07183

摘 要 在信息飞速发展的今天&#xff0c;网络已成为人们重要的信息交流平台。宠物网站每天都有大量的信息需要通过网络发布&#xff0c;为此&#xff0c;本人开发了一个基于B/S&#xff08;浏览器/服务器&#xff09;模式的宠物网站系统。 该系统以JJava编程语言、MySQL和SSM框…

2024年6月17日 (周一) 叶子游戏新闻

期刊杂志: 聚合读者、意林、知音、故事会、花火以及国内各大知名报纸电子版&#xff0c;无需付费即可观看各种免费资源 中医自学宝典: 集合了中医医案&#xff0c;医经&#xff0c;方剂 药材知识的app&#xff0c;更方便的免费学习中医知识 《最终幻想7》重制三部曲总监鸟山求&…

指定导师申请成功|普通高校教师省公派英国曼彻斯特大学访学交流

Q老师的预期目标是世界排名Top100高校&#xff0c;且提供了心仪课题组的导师名单&#xff0c;希望借助我们丰富的资源和专业的申请经验&#xff0c;实现既定目标。我们没有辜负其委托&#xff0c;落实了美国加州大学洛杉矶分校和英国曼彻斯特大学访问学者职位&#xff0c;而曼大…

【自动驾驶】ROS小车系统介绍

文章目录 小车组成轮式运动底盘的组成轮式运动底盘的分类轮式机器人的控制方式感知传感器ROS决策主控ROS介绍ROS的坐标系ROS的单位机器人电气连接变压模块运动底盘的电气连接ROS主控与传感器的电气连接运动底盘基本组成电池电机控制器与驱动器控制器与运动底盘状态数据&#xf…

大学课设项目,Windows端基于UDP的网络聊天程序的服务端和客户端

文章目录 前言项目需求介绍一、服务端1.对Udp套接字进行一个封装2. UdpServer的编写3. Task.h4.protocol.h的编写5.线程池的编写6.main.cc 二、客户端1. Socket.h2.protocol.h3.UdpClient4.menu.h5.main.cpp 三、运行图 前言 本次项目可以作为之前内容的一个扩展&#xff0c;学…

汇聚荣拼多多运营策略是怎么样的?

拼多多作为中国领先的电商平台&#xff0c;其运营策略一直备受关注。拼多多的成功不仅在于其创新的“社交电商”模式&#xff0c;更在于其精细化的市场定位和高效的用户增长策略。本文将深入分析拼多多的运营策略&#xff0c;探讨其如何在激烈的电商竞争中突围而出。 一、用户增…

Vue3-滑动到最右验证功能

1、思路 1、在登录页面需要启动向右滑块验证 2、效果图 3、文章地址&#xff1a;滑动验证码的实现-vue-simple-verify 2、成分分析 1、由三块构成&#xff0c;分别是底部条、拖动条、拖动移动部分 2、底部条&#xff1a;整体容器&#xff0c;包括背景、边框和文字&#xf…

企业级Flask项目移植记录【待补完】

背景 Flask项目A从老电脑C1移植到新电脑C2上 更新日志 1-240614上线第一版经验&#xff0c;博主关于这个项目包的问题还没有解决&#xff0c;正在解决中&#xff0c;但是整体思路大家在移植的时候可以借鉴。 思路 1-首先生产环境的python解释器等相关的东西最好严格保持一…

基于自编码器的心电信号异常检测(Pytorch)

代码较为简单&#xff0c;很容易读懂。 # Importing necessary libraries for TensorFlow, pandas, numpy, and matplotlib import tensorflow as tf import pandas as pd import numpy as np import matplotlib.pyplot as plt import copy# Importing the PyTorch library im…

项目管理进阶之EVM(挣值管理)

前言 项目管理进阶系列&#xff0c;终于有时间更新啦&#xff01;&#xff01;&#xff01;欢迎持续关注哦~ 上一节博主重点讲了一个环&#xff1a;PDCA&#xff0c;无论各行各业&#xff0c;上到航空航天、下到种地种菜&#xff0c;都离不开对质量的监督和改进。这个环既是一…

轻松4步!格式工厂怎么转换mp3教会你

在数字化时代&#xff0c;音频文件格式转换变得越发重要&#xff0c;而格式工厂作为一款强大而多功能的工具&#xff0c;为我们提供了便捷的音频转换解决方案。特别是在将音频文件转换为MP3的需求上&#xff0c;格式工厂以其简便易用的特点备受欢迎。格式工厂怎么转换mp3&#…