1 (изменено: sind-rom, 2012-02-02 19:25:13)

Тема: AHK:SetSystemTime в Win7 x64 проблема...

Пишу скрипт, который меняет системное время на один год. В за основу взял скрипт, приведенный в справке:

Gui, Add, Button, x16 y137 w260 h40 gButtonPressed vButtonText, Уменьшить на год
Gui, Show, w288 h189, Date changer
return

ButtonPressed:
vTime := A_Now 
if(fFlag == "YEARDOWN")
{	
	vTime += 10000000000
	A := SetSystemTime(vTime)
	MsgBox %A% ;отобразить возврат функции
	MsgBox %A_Now% ;отобразить текущее время, поменялось или нет
	GuiControl,, ButtonText, Уменьшить на год
	fFlag := "YEARUP"
}
else
{
	vTime -= 10000000000
	A := SetSystemTime(vTime)
	MsgBox %A%
	MsgBox %A_Now%
	GuiControl,, ButtonText, Увеличить на год
	fFlag := "YEARDOWN"
}
return

GuiClose:
if(fFlag == "YEARDOWN")
{	
	vTime := A_Now + 10000000000
	SetSystemTime(%vTime%)
}
ExitApp

SetSystemTime(YYYYMMDDHHMISS)
; Sets the system clock to the specified date and time.
; Caller must ensure that the incoming parameter is a valid date-time stamp
; (local time, not UTC). Returns non-zero upon success and zero otherwise.
{
    ; Convert the parameter from local time to UTC for use with SetSystemTime().
    UTC_Delta -= %A_NowUTC%, Seconds  ; Seconds is more accurate due to rounding issue.
    UTC_Delta := Round(-UTC_Delta/60)  ; Round to nearest minute to ensure accuracy.
    YYYYMMDDHHMISS += %UTC_Delta%, Minutes  ; Apply offset to convert to UTC.

    VarSetCapacity(SystemTime, 16, 0)  ; This struct consists of 8 UShorts (i.e. 8*2=16).

    StringLeft, Int, YYYYMMDDHHMISS, 4    ; YYYY (year)
    NumPut(Int, SystemTime, 0, "UShort")
    StringMid, Int, YYYYMMDDHHMISS, 5, 2  ; MM (month of year, 1-12)
    NumPut(Int, SystemTime, 2, "UShort")
    StringMid, Int, YYYYMMDDHHMISS, 7, 2  ; DD (day of month)
    NumPut(Int, SystemTime, 6, "UShort")
    StringMid, Int, YYYYMMDDHHMISS, 9, 2  ; HH (hour in 24-hour time)
    NumPut(Int, SystemTime, 8, "UShort")
    StringMid, Int, YYYYMMDDHHMISS, 11, 2 ; MI (minute)
    NumPut(Int, SystemTime, 10, "UShort")
    StringMid, Int, YYYYMMDDHHMISS, 13, 2 ; SS (second)
    return DllCall("SetSystemTime", UInt, &SystemTime)
}

Не работает...
Система Win7 x64. Установлен AutoHotkey_L.
При работе из под пользователя, функция SetSystemTime() возвращает нулевое значение.
Если скрипт скомпилировать в .exe и запустить под администратором, то SetSystemTime() возвращает единицу (1), но системное время все равно не изменяется.
Запуск функции напрямую, как в примере, SetSystemTime("20051008142211")   - дает тот же результат, что и ранее.
Вероятно, это из за операционной системы. Заставить работать скрипт не получается.
Помогите советом...

2 (изменено: Александр_, 2012-02-02 20:12:47)

Re: AHK:SetSystemTime в Win7 x64 проблема...

SetSystemTime оперирует временем по гринвичу(GMT+0), с учётом локальных настроек действует SetLocalTime. В любом случае лучше получать время тоже через апи, там удобный формат.

VarSetCapacity(Cur, 16, 0)
DllCall("GetSystemTime", "ptr", &Cur)
NumPut(NumGet(&Cur, 0, "ushort")+1, &Cur, 0, "ushort")
if(!DllCall("SetSystemTime", "ptr", &Cur))
   msgbox %a_lasterror%

3

Re: AHK:SetSystemTime в Win7 x64 проблема...

Какой кошмар... Вот что значит бездумно запускать скрипты
Александр_, скомпилировал ваш скрипт и запустил 2 раза, подумал - не работает, ну и ладно.
Потом почти час воевал с Касперским по поводу закончившийся лицензии, лишь случайно заметил, что на компьютере установлен 2014 год

4

Re: AHK:SetSystemTime в Win7 x64 проблема...

OFF: История для bash.org .

5

Re: AHK:SetSystemTime в Win7 x64 проблема...

Александр_, спасибо! Ваш скрипт решил мою проблему.