欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#通過Win32API設(shè)置客戶端系統(tǒng)時間的方法詳解

 更新時間:2024年06月21日 10:13:57   作者:老碼識途呀  
在日常工作中,有時可能會需要獲取或修改客戶端電腦的系統(tǒng)時間,比如軟件設(shè)置了Licence有效期,本文以一個簡單的小例子,簡述如何通過C#獲取和設(shè)置客戶端電腦的系統(tǒng)時間,僅供學(xué)習(xí)分享使用,如有不足之處,還請指正,需要的朋友可以參考下

在日常工作中,有時可能會需要獲取或修改客戶端電腦的系統(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)時間的方法詳解的詳細內(nèi)容,更多關(guān)于C# Win32API系統(tǒng)時間的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C# BackgroundWorker組件學(xué)習(xí)入門介紹

    C# BackgroundWorker組件學(xué)習(xí)入門介紹

    一個程序中需要進行大量的運算,并且需要在運算過程中支持用戶一定的交互,為了獲得更好的用戶體驗,使用BackgroundWorker來完成這一功能
    2013-10-10
  • C#?使用PrintDocument類打印標簽的方法

    C#?使用PrintDocument類打印標簽的方法

    本文介紹打印機初步配置,以及實現(xiàn)方法,標簽主要展示資產(chǎn)基本信息以及二維碼,對C#?使用PrintDocument類打印標簽的詳細過程感興趣的朋友一起看看吧
    2022-04-04
  • C#字符串加密解密方法實例

    C#字符串加密解密方法實例

    這篇文章主要介紹了C#字符串加密解密方法,實例分析了C#對字符串加密與解密的操作技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-03-03
  • C#中TextBox的橫線樣式及占位提示詳解

    C#中TextBox的橫線樣式及占位提示詳解

    橫線樣式就是將TextBox以一條底橫線的形式展示在頁面,占位提示就是Web的Placeholder屬性,即在輸入框沒有內(nèi)容的時候進行一個輸入提示。本文主要介紹了C#中TextBox的這兩個的實現(xiàn),需要的可以參考一下
    2022-11-11
  • C#精確計算年齡的方法分析

    C#精確計算年齡的方法分析

    這篇文章主要介紹了C#精確計算年齡的方法,實例分析了C#計算時間的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-03-03
  • C#進行圖像處理的常見方法(Bitmap,BitmapData,IntPtr)使用詳解

    C#進行圖像處理的常見方法(Bitmap,BitmapData,IntPtr)使用詳解

    這篇文章主要為大家詳細介紹了C#進行圖像處理的幾個常見方法(Bitmap,BitmapData,IntPtr)具體使用,文中的示例代碼講解詳細,感興趣的小伙伴可以了解下
    2024-01-01
  • Unity實現(xiàn)鼠標點2D轉(zhuǎn)3D進行旋轉(zhuǎn)

    Unity實現(xiàn)鼠標點2D轉(zhuǎn)3D進行旋轉(zhuǎn)

    這篇文章主要為大家詳細介紹了Unity實現(xiàn)鼠標點2D轉(zhuǎn)3D進行旋轉(zhuǎn),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • C#自定義IP輸入框控件

    C#自定義IP輸入框控件

    這篇文章主要為大家詳細介紹了C#自定義IP輸入框控件,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • C#多線程同步lock、Mutex的實現(xiàn)

    C#多線程同步lock、Mutex的實現(xiàn)

    本文主要介紹了C#多線程同步lock、Mutex的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-05-05
  • C# 通過反射初探ORM框架的實現(xiàn)原理(詳解)

    C# 通過反射初探ORM框架的實現(xiàn)原理(詳解)

    下面小編就為大家分享一篇C# 通過反射初探ORM框架的實現(xiàn)原理詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12

最新評論