2015-07-20 33 views
0

我正在开发一个WFA应用程序,根据点击按钮将计算机日期更改为提前一天或一天​​后。这里是我的代码:通过点击按钮将工作站更改为第二天或前一天

public Form1() 
     { 
      InitializeComponent(); 
      currentTime.Start(); 
     } 

     private void CurrentTime_Tick(object sender, EventArgs e) 
     { 
      DateTime dateTime = DateTime.Now; 
      this.lblTime.Text = dateTime.ToString(); 
     } 

     public struct Systemtime 
     { 
      public short WDay; 
     } 

     [DllImport("kernel32.dll", SetLastError = true)] 
     public static extern bool SetSystemTime([In] ref Systemtime st); 

     private void BtnChangeDate_Click(object sender, EventArgs e) 
     { 
      Systemtime st = new Systemtime(); 

      st.WDay++; 

      SetSystemTime(ref st); 
     } 

     private void BtnExit_Click(object sender, EventArgs e) 
     { 
      this.Close(); 
     } 

     private void BtnPreviousDay_Click(object sender, EventArgs e) 
     { 
      Systemtime st = new Systemtime(); 

      st.WDay--; 

      SetSystemTime(ref st); 
     } 

我现在的问题是按钮什么也不做,即使我有硬编码的值。我需要做什么才能正确地完成这项工作?

+0

这可以帮助你:http://stackoverflow.com/questions/650849/change-system-date-programatically – Adam

+0

@Adam - 我已经尝试过这一点,这是行不通的。它用硬编码的日子,但我希望用户能够移动他们想要的任何一天。 – BowerdotJson

+0

如果您在查找文档时遇到问题 - [SYSTEMTIME结构](https://msdn.microsoft.com/en-us/library/windows/desktop/ms724950(v = vs.85).aspx) – crashmstr

回答

2

在调用SetSystemTime函数之前,您需要正确设置您的Systemtime结构,仅设置WDay值是不够的。我会创建一个方法来执行下面的两种方式。请注意,我使用内置方法获取日期并添加/减去正确的天数。这可以处理所有情况,例如月/年的开始/结束。

private void ChangeDate(int numDays) 
{ 
    Systemtime st = new Systemtime(); 

    var newDate = DateTime.Now.AddDays(numDays); 

    //Set up all the values, no need to set wDayOfWeek as it's ignored by the set function 
    st.wYear = newDate.Year; 
    st.wMonth = newDate.Month; 
    st.wDay = newDate.Day; 
    st.wHour = newDate.Hour; 
    st.wMinute = newDate.Minute; 
    st.wSecond = newDate.Second; 
    st.wMilliseconds = newDate.Millisecond; 

    SetSystemTime(ref st); 
} 

现在你骂它:

//Forward 1 day 
ChangeDate(1); 

//Back 1 day 
ChangeDate(-1); 
+0

好吧,我有一直在调试你的方法,它正在改变程序中的日期,但不是在我的机器上。它也在我的CurrentTime_Tick方法中创建了一个无限循环,所以我认为这是问题所在。 – BowerdotJson

0

这里是解决方案。

public partial class Form1 : Form 
{ 
    [DllImport("kernel32.dll")] 
    static extern bool SetSystemTime([In] ref SYSTEMTIME st); 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    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 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; 
     } 
     public DateTime ToDateTime() 
     { 
      return new DateTime(wYear, wMonth, wDay, wHour, wMinute, wSecond, wMilliseconds); 
     } 
     public static DateTime ToDateTime(SYSTEMTIME time) 
     { 
      return time.ToDateTime(); 
     } 
    } 

    private void BtnChangeDate_Click(object sender, EventArgs e) 
    { 
     ChangeDateUp(0); 
    } 

    private void BtnPreviousDay_Click(object sender, EventArgs e) 
    { 
     ChangeDateDown(0); 
    } 
    private void ChangeDateUp(int numDays) 
    {    
     DateTime t = DateTime.Now.AddDays(1); 
     SYSTEMTIME st = new SYSTEMTIME(); 
     st.FromDateTime(t); 
     SetSystemTime(ref st); 
    } 

    private void ChangeDateDown(int numDays) 
    { 
     DateTime t = DateTime.Now.AddDays(-1); 
     SYSTEMTIME st = new SYSTEMTIME(); 
     st.FromDateTime(t); 
     SetSystemTime(ref st); 
    } 

    private void BtnExit_Click(object sender, EventArgs e) 
    { 
     this.Close(); 
    } 
} 
相关问题