请问如何能在while循环里,把获取的系统时间固化下来?
当鼠标移动到输入框上,就在LABEL上显示倒计时5秒,但是无法在while循环里,把获取的系统时间固化下来,使用静态变量标识符Static,会报错:Cannot make existing variables static.:
我现在使用变通的处理办法,是使用控件子类化,在while外面捕获鼠标悬停的消息,然后得到初始时间,但这样有时间会有时间差,有时候会显示倒计时只有4秒,所以想在while里面固化这个初始时间。
#NoTrayIcon
#RequireAdmin
#PRE_UseX64 = n
#include <date.au3>
Opt("GuiOnEventMode", 1)
GUICreate("")
Global $hInput = GUICtrlCreateInput("", 40, 40, 120, 30)
GUICtrlSetBkColor(-1, 0xff66ff)
GUICtrlSetFont(-1, 16, 400)
Global $hLabel = GUICtrlCreateLabel("", 220, 40, 120, 30)
GUICtrlSetBkColor(-1, 0xff66ff)
GUICtrlSetFont(-1, 16, 400)
GUISetState()
GUISetOnEvent(-3, "_Exit")
Local $sTime = 0
While 1
Sleep(5)
$GuiInfo =GUIGetCursorInfo()
If @error = 0 Then
If $GuiInfo = $hInput Then
Local Static $eTime = _TimeToTicks(@HOUR, @MIN, @SEC) + 5 *1000;怎么样能在while循环里面,把获取的时间固定下来呢?
If $eTime - _TimeToTicks(@HOUR, @MIN, @SEC) >= 0 Then
GUICtrlSetData($hLabel, ($eTime - _TimeToTicks(@HOUR, @MIN, @SEC)) / 1000)
Else
GUICtrlSetData($hLabel, "")
EndIf
EndIf
EndIf
WEnd
Func _Exit()
Exit
EndFunc
本帖最后由 hlcheng 于 2023-10-18 09:08 编辑
可以加一个变量,设置第一次进入获取当前的时间,后面就跳过该步骤,调用变量直接执行后面脚本,如下举例,希望能帮助你
Local $sTime = 0
Local $i = 0
While 1
Sleep(5)
If $i = 0 Then
Local $eTime = _TimeToTicks(@HOUR, @MIN, @SEC) + 5 *1000;怎么样能在while循环里面,把获取的时间固定下来呢?
MsgBox(1,1,$eTime)
EndIf
Sleep(2000)
MsgBox(1,1,$eTime)
If $eTime - _TimeToTicks(@HOUR, @MIN, @SEC) >= 0 Then
MsgBox(1,2,($eTime - _TimeToTicks(@HOUR, @MIN, @SEC)) / 1000)
Else
MsgBox(1,3,"wu")
EndIf
$i = $i + 1
WEnd
虽然我不知道这脚本的作用,但我发现把 26 行的 Static 删除了,脚本运行不出错。 Static 变量用函数封装再调用 #NoTrayIcon
#RequireAdmin
#PRE_UseX64 = n
#include <date.au3>
Opt("GuiOnEventMode", 1)
GUICreate("")
Global $hInput = GUICtrlCreateInput("", 40, 40, 120, 30)
GUICtrlSetBkColor(-1, 0xff66ff)
GUICtrlSetFont(-1, 16, 400)
Global $hLabel = GUICtrlCreateLabel("", 220, 40, 120, 30)
GUICtrlSetBkColor(-1, 0xff66ff)
GUICtrlSetFont(-1, 16, 400)
GUISetState()
GUISetOnEvent(-3, "_Exit")
Local $eTime = 0
Local $Foucs = False
While 1
Sleep(5)
$GuiInfo = GUIGetCursorInfo()
If @error = 0 Then
If Not $Foucs Then
If $GuiInfo = $hInput Then
$Foucs = True
$eTime = _TimeToTicks(@HOUR, @MIN, @SEC) + 5 * 1000 ;怎么样能在while循环里面,把获取的时间固定下来呢?
EndIf
Else
If $GuiInfo = $hInput Then
If $eTime - _TimeToTicks(@HOUR, @MIN, @SEC) >= 0 Then
GUICtrlSetData($hLabel, ($eTime - _TimeToTicks(@HOUR, @MIN, @SEC)) / 1000)
Sleep(900)
Else
GUICtrlSetData($hLabel, "")
$Foucs = False
EndIf
Else
$Foucs = False
EndIf
EndIf
EndIf
WEnd
Func _Exit()
Exit
EndFunc ;==>_Exit 设置全局变量 $eTime
如果 $eTime 空则赋值。 haijie1223 发表于 2023-10-18 16:31
发哥出手,总能让人眼前一亮。
我早上重新写了一下,基本实现预定要求。
#NoTrayIcon
#RequireAdmin
#PRE_UseX64 = n
#include <date.au3>
Opt("GuiOnEventMode", 1)
GUICreate("")
Global $hInput = GUICtrlCreateInput("", 40, 40, 120, 30)
GUICtrlSetBkColor(-1, 0xff66ff)
GUICtrlSetFont(-1, 16, 400)
Global $hLabel = GUICtrlCreateLabel("", 220, 40, 26, 30)
GUICtrlSetBkColor(-1, 0xff66ff)
GUICtrlSetFont(-1, 16, 400)
GUISetState()
GUISetOnEvent(-3, "_Exit")
Local $gTime = True;控制while循环中获取当前时间的次数,悬停在控件上方时获取一次。
Local $cTimeCtrl = 0;防止写控件数据太频繁,导致界面闪动。
Local $kTimeOut = False;倒计时结束时,清空倒计时控件,防止闪屏。
Local $mLeave = False;倒计时未结束,而鼠标此时离开控件,清空倒计时控件时防止闪屏。
While 1
Sleep(5)
$GuiInfo =GUIGetCursorInfo()
If @error = 0 Then
If $GuiInfo = $hInput Then;鼠标悬停在控件上方时
$mLeave = False;当鼠标悬停在控件上方时,重置变量值。
;获取当前时间
If $gTime = True Then
Local $eTime = _TimeToTicks(@HOUR, @MIN, @SEC) + 10 *1000
$gTime = False;获取完毕,在鼠标重新悬停在控件之前,变量$eTime将不会发生变化。
EndIf
Local $nTime = _TimeToTicks(@HOUR, @MIN, @SEC)
If $eTime - $nTime >= 0 Then
If $nTime - $cTimeCtrl >= 1 Then
GUICtrlSetData($hLabel, ($eTime - $nTime) / 1000)
$cTimeCtrl = $nTime
EndIf
Else;倒计时结束
If $kTimeOut = False Then
GUICtrlSetData($hLabel, "")
$kTimeOut = True
EndIf
EndIf
Else;鼠标离开控件
If $mLeave = False Then
GUICtrlSetData($hLabel, "")
$gTime = True;恢复变量值,以便下次鼠标进入控件时再次获取当前时间
$kTimeOut = False
$mLeave = True
EndIf
EndIf
EndIf
WEnd
Func _Exit()
Exit
EndFunc
发哥出手,总能让人眼前一亮。
页:
[1]