在Autoit中实现VB的Timer控件
用过VB的人都知道Timer控件,即在一段时间间隔内重复运行一段代码,此间暂停脚本运行,这一点和Autoit的AdlibEnable函数很相似。但与之不同的是前者可以建立无数个Timer控件,而后者只能AdlibEnable一次。不过通过使用API函数我们也能让Autoit建立Timer控件。
我们需要用的API是SetTimer函数,其结构如下:
UINT SetTimer(
HWND hWnd, // handle of window for timer messages
UINT nIDEvent, // timer identifier
UINT uElapse, // time-out value
TIMERPROC lpTimerFunc // address of timer procedure
);
SetTimer函数的前两个函数基本无用,第三个参数是运行的时间间隔,最后一个参数表示调用的函数的指针,这个参数我们需要用Callback函数处理。
在此之前,请先到这里下载 au3_callback_v6.5.zip ,然后将其中的DllCallBack.au3释放到Autoit安装目录的include文件夹下。
SetTimer函数的第四个参数应为_DllCallBack函数的返回值,其类型为指针,_DllCallBack的用法为:
Global $pTimerProc = _DllCallBack ("_TimerProc", "hwnd;uint;uint;dword")
_TimerProc表示要调用的函数名,hwnd;uint;uint;dword为该函数的参数的数据类型。
下面是一个计时器的例子,这个例子一共建立3个Timer控件,其时间间隔分别为1000毫秒、200毫秒、700毫秒,每当时间一到,程序就会执行_TimerProc函数:#include "DllCallBack.au3"
#Include <Date.au3>
#include <GuiConstants.au3>
GuiCreate("Timer", 124, 99)
$Label_1 = GuiCtrlCreateLabel("Time loading...", 10, 10, 140, 20)
$Label_2 = GuiCtrlCreateLabel("00", 10, 40, 70, 20)
$Label_3 = GuiCtrlCreateLabel("00", 10, 70, 80, 20)
Global $pTimerProc = _DllCallBack ("_TimerProc", "hwnd;uint;uint;dword")
Global $uiTimer = DllCall("user32.dll", "uint", "SetTimer", "hwnd", 0, "uint", 0, "int", 1000, "ptr", $pTimerProc)
Global $pTimerProc2 = _DllCallBack ("_TimerProc", "hwnd;uint;uint;dword")
Global $uiTimer2 = DllCall("user32.dll", "uint", "SetTimer", "hwnd", 0, "uint", 0, "int", 200, "ptr", $pTimerProc2)
Global $pTimerProc3 = _DllCallBack ("_TimerProc", "hwnd;uint;uint;dword")
Global $uiTimer3 = DllCall("user32.dll", "uint", "SetTimer", "hwnd", 0, "uint", 0, "int", 700, "ptr", $pTimerProc3)
GuiSetState()
While 1
$msg = GuiGetMsg()
Select
Case $msg = $GUI_EVENT_CLOSE
DllCall("user32.dll", "int", "KillTimer", "hwnd", 0, "uint", $uiTimer)
_DllCallBack_Free ($pTimerProc)
DllCall("user32.dll", "int", "KillTimer", "hwnd", 0, "uint", $uiTimer2)
_DllCallBack_Free ($pTimerProc2)
DllCall("user32.dll", "int", "KillTimer", "hwnd", 0, "uint", $uiTimer3)
_DllCallBack_Free ($pTimerProc3)
Exit
Case Else
;;;
EndSelect
WEnd
Exit
Func _TimerProc($hWnd, $uiMsg, $idEvent, $dwTime)
;$idEvent能分辨是哪个Timer控件调用了这个函数
;$dwTime表示已开机的时间
Switch $idEvent
Case $uiTimer
GUICtrlSetData($Label_1,_Now ( ))
Case $uiTimer2
GUICtrlSetData($Label_2,GUICtrlRead($Label_2)+1)
Case $uiTimer3
GUICtrlSetData($Label_3,GUICtrlRead($Label_3)+1)
EndSwitch
EndFunc最后,你可以使用KillTimer函数中止一个Timer控件,其用法在上面的例子里已经阐明。 值得学习, 多个Timer用起来爽/./
我也仿TIMER
XxXxXxr捂着自己嘴巴,但还是想说Timer也可以这样实现!while 1
sleep(当然是间隔时间了)
wend
怎么样!!是否也是实现了TIMER呢??当然,其他循环也是一样道理!!! "au3_callback_v6.5.zip "在哪里下载? 原帖由 XxXxXx 于 2008-5-11 22:06 发表 http://www.autoitx.com/images/common/back.gif
XxXxXxr捂着自己嘴巴,但还是想说Timer也可以这样实现!
while 1
sleep(当然是间隔时间了)
wend
怎么样!!是否也是实现了TIMER呢??当然,其他循环也是一样道理!!!
这是当然,,但脚本大要用的定时器多的时候,用这个就会冲突了, 原帖由 XxXxXx 于 2008-5-11 22:06 发表 http://www.autoitx.com/images/common/back.gif
XxXxXxr捂着自己嘴巴,但还是想说Timer也可以这样实现!
while 1
sleep(当然是间隔时间了)
wend
怎么样!!是否也是实现了TIMER呢??当然,其他循环也是一样道理!!!
你用这个是可以,但是整个程序都暂停了。其它的代码要等这个 那就开线程好了. 比较复杂啊看起来 感谢分享,谢谢~~~ thanks!!!good example~~~~~~`` MARK一下
以后学习用
谢谢楼主 DllCallBack.au3 文件在哪里? 我运行了 但是没有出来任何效果 老贴子挖出来了,新手同问:au3_callback_v6.5.zip在哪 "DllCallBack.au3"没有. au3_callback_v6.5.zip在里:http://www.autoitscript.com/forum/index.php?showtopic=50768
页:
[1]
2