脚本之家

电脑版
提示:原网页已由神马搜索转码, 内容由www.jb51.net提供.
您的位置:首页软件编程C#教程→ C# Win32API系统时间

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#中实现Word转PDF的常用方法,文中的示例代码讲解详细,具有一定的学习价值,有需要的小伙伴可以参考下
      2023-10-10
    • 这篇文章主要介绍了C#代码性能测试类(简单实用),本文直接给出实现代码和使用示例,需要的朋友可以参考下
      2015-06-06
    • 在 C# 9 中,foreach 循环可以使用扩展方法。在本文中,我们将通过例子回顾 C# 9 中如何扩展 foreach 循环,感兴趣的小伙伴可以了解一下
      2023-01-01
    • 这篇文章主要介绍了C#实现控制线程池最大数并发线程的相关资料,需要的朋友可以参考下
      2016-07-07
    • 注意,这里的paras全称是array parameter,也就是数组参数。 paras类型参数主要用于在对数组长度未知(可变)的情况下进行函数声明。
      2010-02-02
    • 下面小编就为大家分享一篇c#实现输出的字符靠右对齐的示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
      2017-12-12
    • 下面小编就为大家带来一篇关于finalize机制和引用、引用队列的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
      2016-09-09
    • 这篇文章介绍了C#开发WinForm根据条件改变DataGridView行颜色的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
      2022-03-03
    • 这篇文章主要介绍了C#配置文件Section节点处理总结,针对配置文件Section节点的处理做了较为详细的实例总结,需要的朋友可以参考下
      2014-10-10
    • 这篇文章主要介绍了C# 使用SHA1算法对密码进行加密,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下
      2021-03-03

    最新评论