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

[AU3基础] 请问如何能在while循环里,把获取的系统时间固化下来?

[复制链接]
发表于 2023-10-18 08:44:58 | 显示全部楼层 |阅读模式


当鼠标移动到输入框上,就在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[4] = $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


发表于 2023-10-18 09:05:24 | 显示全部楼层
本帖最后由 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

发表于 2023-10-18 09:12:47 | 显示全部楼层
虽然我不知道这脚本的作用,但我发现把 26 行的 Static 删除了,脚本运行不出错。
发表于 2023-10-18 16:17:45 | 显示全部楼层
Static 变量用函数封装再调用
发表于 2023-10-18 16:31:27 | 显示全部楼层
#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[4] = $hInput Then
                                $Foucs = True
                                $eTime = _TimeToTicks(@HOUR, @MIN, @SEC) + 5 * 1000 ;怎么样能在while循环里面,把获取的时间固定下来呢?
                        EndIf
                Else
                        If $GuiInfo[4] = $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
发表于 2023-10-18 21:19:17 | 显示全部楼层
设置全局变量 $eTime
如果 $eTime 空则赋值。
 楼主| 发表于 2023-10-19 09:57:35 | 显示全部楼层

发哥出手,总能让人眼前一亮。

我早上重新写了一下,基本实现预定要求。




#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[4] = $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



发表于 2023-10-25 16:47:45 | 显示全部楼层
发哥出手,总能让人眼前一亮。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-5-2 07:31 , Processed in 0.076836 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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