从计算机设置Windows Mobile设备系统时间?

时间:2013-02-11 03:12:00

标签: c# windows-mobile compact-framework

我正在尝试将设备的系统日期和时间同步到它所停靠的桌面,我正在使用紧凑的框架(C#)。

我的目标是检测设备上次同步到桌面计算机上的数据库的时间。

我该怎么做?

4 个答案:

答案 0 :(得分:2)

我不确定最后的问题是什么。如果您询问,如何将设备的时间与设备停靠时的PC时间同步,那么您可以使用免费的ITSUtils和PC上的一些注册表更改来自动执行时间监听: 注册表更改

REGEDIT4
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows CE Services\AutoStartOnConnect]
"OnConnect"="\"c:\\windows\\system32\\cmd.exe\" /c d:\\OnConnect\\install.bat"

另请参阅herehere以及here

如果您有权限,也可以在experts-exchange查看我的帖子。

您可以使用任何bat或cmd文件代替install.bat。itsutils包含一个名为psynctime的PC应用程序。您只需要在您创建并在注册表中链接的bat / cmd文件中启动psynctime。然后将设备时间同步到PC的时间。确保bat文件可以访问itsutil文件,或者在PATH环境的dir中或者bat / cmd的直接文件中使用itutils。

作为替代方案,您必须编写DLL和activesync远程调用代码来同步时间。因此,使用psynctime工具更容易。

您知道该设备可以使用您的PC的互联网连接使用互联网吗?请参阅ActiveSync连接设置并查找“PC已连接到工作/ Internet /自动”。如果设置为自动或互联网,您的设备应该能够通过ActiveSync连接访问互联网。只需在设备上尝试使用Internet Explorer Mobile进行测试即可。如果它适用于您,您还可以将SNTP服务与Mitch提供的代码一起使用。但是,您还必须添加检测设备何时通过ActiveSync连接的代码。

答案 1 :(得分:2)

这是我一直在使用的那个。我在第一次启动数据库对象时使设备同步。

#if PocketPC
[DllImport("coredll.dll")]
#else
[DllImport("kernel32.dll")]
#endif
private static extern bool SetLocalTime([In] ref SYSTEMTIME lpLocalTime);

...是的,我的Windows PC使用与WinMobile PC相同的代码。

这个NODATE变量对我的整个项目都是全局的,并且定义为1900年1月1日。希望这个公司在SQL Server中没有发生任何事情!

从结构开始:

/// <summary>
/// SYSTEMTIME structure with some useful methods
/// </summary>
public struct SYSTEMTIME {
  public short Year, Month, DayOfWeek, Day, Hour, Minute, Second, Millisecond;
  /// <summary>
  /// Convert form System.DateTime
  /// </summary>
  /// <param name="time">Creates System Time from this variable</param>
  public void FromDateTime(DateTime time) {
    Year = (short)time.Year;
    Month = (short)time.Month;
    DayOfWeek = (short)time.DayOfWeek;
    Day = (short)time.Day;
    Hour = (short)time.Hour;
    Minute = (short)time.Minute;
    Second = (short)time.Second;
    Millisecond = (short)time.Millisecond;
  }
  /// <summary>
  /// Convert to System.DateTime
  /// </summary>
  public DateTime ToDateTime() {
    return new DateTime(Year, Month, Day, Hour, Minute, Second, Millisecond);
  }
  /// <summary>
  /// STATIC: Convert to System.DateTime
  /// </summary>
  public static DateTime ToDateTime(SYSTEMTIME time) {
    return time.ToDateTime();
  }
}

然后就像我在这个调用方法中那样使用该结构(我与SQL Server同步)。

/// <summary>
/// Synchronize the Time on the SQL Server with the time on the device
/// </summary>
public static int SyncWithSqlTime() { // pass in SQL Time and set time on device
  SYSTEMTIME st = new SYSTEMTIME();
  DateTime sqlTime = Global.NODATE;
  using (SqlCommand cmd = new SqlCommand("SELECT GETDATE() AS CurrentDateTime;", new SqlConnection(DataSettings.DatabaseConnectionString))) {
    try {
      cmd.Connection.Open();
      SqlDataReader r = cmd.ExecuteReader();
      while (r.Read()) {
        if (!r.IsDBNull(0)) {
          sqlTime = (DateTime)r[0];
        }
      }
    } catch (Exception) {
      return -1;
    }
  }
  if (sqlTime != Global.NODATE) {
    st.FromDateTime(sqlTime); // Convert to SYSTEMTIME
    if (SetLocalTime(ref st)) { //Call Win32 API to set time
      return 1;
    }
  }
  return 0;
}

底部的最后if条件是我使用SetLocalTime设置时间的位置。

希望这能让你到达某个地方,
〜乔

答案 2 :(得分:1)

为什么不使用SNTP(网络时间协议)同步国际标准时间:

C# SNTP Client

然后您可以检查数据库上次更新时间。 [我在移动设备上使用了链接代码]

使用该代码(每小时调用一次,或者您需要的任何刷新间隔):

   SNTPClient client = new SNTPClient(sntpTimeServerString);
   client.Connect(5000, true);

   // Set system clock to timenow 
   DateTime timenow = client.ToTime();

更新(根据OP的评论):由于您没有互联网连接,我认为您需要使用时间以外的其他内容来确定上次同步。例如,使用最后一个序列Id来确定设备的本地数据库与桌面相比是否有变化。

答案 3 :(得分:0)

远程API 2(RAPI2)。 =&GT; 你抓住两个rapi.CreateProcess,一个用于日期,一个用于时间。

rapi.CreateProcess("cmd", "/c date " + DateTime.Now.ToString("dd-MM-yyyy"));
rapi.CreateProcess("cmd", "/c time " + DateTime.Now.ToString("HH:mm:ss"));

它会打开两个Windows命令提示符,将手机与手机上的时钟同步。