在C#中改變系統時間 && 得到系統時間改變通知
2024-07-21 02:15:46
供稿:網友
一、改變系統時間c#的system.datetime類提供了對日期時間的封裝,用它進行時間的轉換和處理很方便,但是我沒有在其中找到任何可以用來修改系統時間的成員。用過vc、vb等的朋友可能知道,我們可以調用win32 api setlocaltime來改變系統時間,看來c#中也只能如此了。setlocaltime需要一個systemtime結構指針作為參數,這倒不難,我們可以“比葫蘆畫瓢”很快在c#中定義這個結構,但問題是,我同時還想“享受”.net framework的system.datetime在時間轉換和處理方面的便利,怎么辦?只有自己動手了,為我們的c#中的systemtime編寫成員函數,實現和system.datetime之間的互轉。請看下面的代碼:首先我為了以后調用方便,新建了一個c#文件,在里面把setlocaltime api放到一個名稱為win32api的類中,并把這個類放到我自己定義的namespace中,避免名稱沖突。以后我還可以不斷向這個類和名稱空間添加常用的api,以便構造我自己的c# win32 api函數庫j//forproc_win32.cs//對常用win32 api函數及結構的聲明using system;using system.runtime.interopservices; namespace farproc.win32{ /// <summary> /// /// </summary> 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; /// <summary> /// 從system.datetime轉換。 /// </summary> /// <param name="time">system.datetime類型的時間。</param> public void fromdatetime(datetime time) { wyear = (ushort)time.year; wmonth = (ushort)time.month; wdayofweek = (ushort)time.dayofweek; wday = (ushort)time.day; whour = (ushort)time.hour; wminute = (ushort)time.minute; wsecond = (ushort)time.second; wmilliseconds = (ushort)time.millisecond; } /// <summary> /// 轉換為system.datetime類型。 /// </summary> /// <returns></returns> public datetime todatetime() { return new datetime(wyear, wmonth, wday, whour, wminute, wsecond, wmilliseconds); } /// <summary> /// 靜態方法。轉換為system.datetime類型。 /// </summary> /// <param name="time">systemtime類型的時間。</param> /// <returns></returns> public static datetime todatetime(systemtime time) { return time.todatetime(); } } public class win32api { [dllimport("kernel32.dll")] public static extern bool setlocaltime( ref systemtime time ); [dllimport("kernel32.dll")] public static extern void getlocaltime(ref systemtime time); }}下面在winform程序中調用。新建一個c# winform程序,在form上添加一個按鈕 button1,并添加如下代碼:private void button1_click(object sender, system.eventargs e){ //取得當前系統時間 datetime t = datetime.now; //在當前時間上加上一周 t = t.adddays(7); //轉換system.datetime到systemtime systemtime st = new systemtime(); st.fromdatetime(t); //調用win32 api設置系統時間 win32api.setlocaltime(ref st); //顯示當前時間 messagebox.show(datetime.now.tostring());}然后就可以運行這個程序看到效果了。 二、得到系統時間改變通知另一個問題,如果系統時間被人為改動了,我的程序想得到通知,并做相應的處理,怎么辦?好像很難,呵呵,其實framework早為我們準備好了。比起上一個問題,這個似乎還要簡單一些。在microsoft.win32命名空間中有一個systemevents類,我們只要定制它的一個靜態事件timechanged就ok了!!代碼片斷如下:private void form1_load(object sender, system.eventargs e){ //定制事件 systemevents.timechanged += new eventhandler(systemevents_timechanged);}//事件處理函數private void systemevents_timechanged(object sender, eventargs e){ messagebox.show("系統時間被改變了,現在時間為:" + datetime.now.tostring());}注意,這個事件在console程序中是無效的,可能是因為這個事件本身要依賴窗口和窗口消息吧。 另外,建議大家仔細看看microsoft.win32命名空間中的所有內容,還有許多有用的東西呢!!