找回密码
 加入
搜索
查看: 5934|回复: 7

[系统综合] [已解决]如何实现开机自动校对系统时间!?

  [复制链接]
发表于 2011-5-5 18:31:00 | 显示全部楼层 |阅读模式
本帖最后由 风中柳 于 2011-5-9 14:38 编辑

最近电脑时间总是不准,换了电池不也行!我想能不能用au3编一个校对时间的程序,在双击程序之后将这个程序复制到C:\windows下,并添加到注册表中,使它每次开机时随机启动并自动对时!我在论坛里找到了一个源码!但是总无法实现将程序复制到C:\windows下和添加到注册表的run中?请大家帮帮忙!
#NoTrayIcon
#EndRegion ;**** 参数创建于 ACNWrapper_GUI ****
#Region ;**** 参数创建于 AutoIt3Wrapper_GUI ****
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#Region
#EndRegion
#Include <Misc.au3>
#include <Date.au3>

$ntpServer = "time-nw.nist.gov" ;改为ini配置
local $var1,$var2
        ;Global Const $tagSYSTEMTIME = "short Year;short Month;short Dow;short Day;short Hour;short Minute;short Second;short MSeconds"
        ;Global Const $tagTIME_ZONE_INFORMATION = "dword Bias;byte StdName[64];ushort StdDate[8];dword StdBias;byte DayName[64];ushort DayDate[8];dword DayBias"
dim $TimeZone=8*60*60
UDPStartup()
Dim $socket = UDPOpen(TCPNameToIP($ntpServer), 123)
If @error <> 0 Then
    MsgBox(0,"","连接服务器失败!")
    Exit
EndIf
;$status = UDPSend($socket, MakePacket("1b0e010000000000000000004c4f434ccb1eea7b866665cb00000000000000000000000000000000cb1eea7b866665cb"))
$status = UDPSend($socket, MakePacket("1b0e01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"))
If $status = 0 Then
    MsgBox(4096, "错误", "连接服务器失败,请查看网络连接!")
EndIf

$data=""
$i=0
While $data=""
        $i+=1
    $data = UDPRecv($socket, 100)
        If $i = 5 Then
        MsgBox(4096, "错误", "连接服务器失败,请更换服务器地址!")
        Exit
        EndIf
    sleep(100)
WEnd

UDPCloseSocket($socket)
UDPShutdown()

$unsignedHexValue=StringMid($data,83,8); Extract time from packet. Disregards the fractional second.
$value=UnsignedHexToDec($unsignedHexValue)
$value=$value+$TimeZone
$UTC=_DateAdd("s",$value,"1900/01/01 00:00:00")
$var1=StringSplit(StringLeft($UTC,10),'/')
$var2=StringSplit(StringRight($UTC,8),':')
_SetTime($var2[1],$var2[2],$var2[3])
_SetDate($var1[3],$var1[2],$var1[1])
MsgBox(0,"提示","NTP服务器时间同步成功,当前系统时间为: "&$UTC)
Func MakePacket($d)
    Local $p=""
    While $d
        $p&=Chr(Dec(StringLeft($d,2)))
        $d=StringTrimLeft($d,2)
    WEnd
    Return $p
EndFunc

Func UnsignedHexToDec($n)
    $ones=StringRight($n,1)
    $n=StringTrimRight($n,1)
    Return dec($n)*16+dec($ones)
EndFunc
发表于 2011-5-5 19:05:32 | 显示全部楼层
本帖最后由 easefull 于 2011-5-5 19:10 编辑

此代码运行正常
但直接把程序放到启动项可能会遇到程序启动时网络联接还没有正常的情况
你可以在前面加个联网判断,判断连网后再较对时间.
发表于 2011-5-5 20:42:29 | 显示全部楼层
域内还是开机联网,没有这个条件,就不用想了
 楼主| 发表于 2011-5-5 21:42:52 | 显示全部楼层
回复 3# netegg


    忘说了!是互联网!
发表于 2011-5-5 21:51:19 | 显示全部楼层
本帖最后由 netegg 于 2011-5-5 21:53 编辑

第一没做过类似的事,只能提供个大概的思路,如果开机联网的话,那个w32time服务首先处于自动启动状态,然后注册表里有个timezone(要不就是timeserver,好像应该在hklm下某个项里),然后改变下作为default
 楼主| 发表于 2011-5-9 14:38:25 | 显示全部楼层
看来还是把它放在“启动”里吧!
发表于 2013-1-18 21:32:25 | 显示全部楼层
谢谢分享。
发表于 2013-3-19 17:43:06 | 显示全部楼层
尝试了下,非常不错,非常感谢分享给我们哦
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-9-29 09:36 , Processed in 0.101766 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表