C#通過Win32API設(shè)置客戶端系統(tǒng)時間的方法詳解
在日常工作中,有時可能會需要獲取或修改客戶端電腦的系統(tǒng)時間,比如軟件設(shè)置了Licence有效期,預(yù)計2024-06-01 00:00:00到期,如果客戶手動修改了客戶端電腦時間,往前調(diào)整了一年,則軟件就可以繼續(xù)使用一年,如此循環(huán)往復(fù),則Licence將形同虛設(shè)。所以有時候需要校驗客戶端電腦時間和服務(wù)器端時間,是否一致,如果不一致,則需要修改客戶端電腦時間或進行系統(tǒng)提示。本文以一個簡單的小例子,簡述如何通過C#獲取和設(shè)置客戶端電腦的系統(tǒng)時間,僅供學(xué)習(xí)分享使用,如有不足之處,還請指正。
涉及知識點
在windows系統(tǒng)中,設(shè)置系統(tǒng)時間,主要通過win32提供的API來實現(xiàn),如下所示:
- SetLocalTime 設(shè)置系統(tǒng)的本地化時間
- GetLocalTime 獲取系統(tǒng)的本地化時間
- SetSystemTime 設(shè)置系統(tǒng)的Utc時間
- GetSystemTime 獲取系統(tǒng)的Utc時間
核心代碼
時間結(jié)構(gòu)體
在上述四個系統(tǒng)函數(shù)中,都需要一個時間類型的結(jié)構(gòu)體,包含時分秒,年月日。如下所示:
[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}";
}
}系統(tǒng)時間幫助類
為了方便調(diào)用,將4個系統(tǒng)函數(shù)進行封裝到一個類中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>
/// 時間戳轉(zhuǎn)為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>
/// 時間戳轉(zhuǎn)為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);
}
}函數(shù)調(diào)用
在頁面調(diào)用時,即可通過SysTimeHelper幫助類,進行獲取和修改系統(tǒng)時間。如下所示:
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("設(shè)置成功");
}
else
{
MessageBox.Show("設(shè)置失敗");
}
}
}實例演示
通過VS運行程序,在打開程序時,獲取時間,然后手動修改時間,點擊設(shè)置,如下所示:

如果設(shè)置過后,想要回復(fù),可通過設(shè)置頁面【同步時鐘】進行恢復(fù),如下所示:

注意,如果在調(diào)試時,設(shè)置失敗【SetLocalTime返回false】,可通過【以管理員身份運行】的方式打開Visual Studio,如下所示:

或者直接通過【以管理員身份運行】啟動程序,如下所示:

以上就是C#通過Win32API設(shè)置客戶端系統(tǒng)時間的方法詳解的詳細(xì)內(nèi)容,更多關(guān)于C# Win32API系統(tǒng)時間的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C#基于時間輪調(diào)度實現(xiàn)延遲任務(wù)詳解
在很多.net開發(fā)體系中開發(fā)者在面對調(diào)度作業(yè)需求的時候一般會選擇三方開源成熟的作業(yè)調(diào)度框架來滿足業(yè)務(wù)需求,但是有些時候可能我們只是需要一個簡易的延遲任務(wù)。本文主要分享一個簡易的基于時間輪調(diào)度的延遲任務(wù)實現(xiàn),需要的可以參考一下2022-12-12
C#集合Collections購物車Shopping Cart(實例講解)
下面小編就為大家分享一篇C#集合Collections購物車Shopping Cart的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2017-12-12
C#編程:List.ForEach與foreach循環(huán)的對比分析
這篇文章主要介紹了C#編程:List.ForEach與foreach循環(huán)的對比分析,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-03-03

