找回密码  加入

AUTOIT CN

搜索
查看: 9192|回复: 15

在Autoit中实现VB的Timer控件

[复制链接]
发表于 2008-5-10 23:05:11 | 显示全部楼层 |阅读模式
用过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函数:
  1. #include "DllCallBack.au3"
  2. #Include <Date.au3>
  3. #include <GuiConstants.au3>

  4. GuiCreate("Timer", 124, 99)

  5. $Label_1 = GuiCtrlCreateLabel("Time loading...", 10, 10, 140, 20)
  6. $Label_2 = GuiCtrlCreateLabel("00", 10, 40, 70, 20)
  7. $Label_3 = GuiCtrlCreateLabel("00", 10, 70, 80, 20)

  8. Global $pTimerProc = _DllCallBack ("_TimerProc", "hwnd;uint;uint;dword")
  9. Global $uiTimer = DllCall("user32.dll", "uint", "SetTimer", "hwnd", 0, "uint", 0, "int", 1000, "ptr", $pTimerProc)
  10. Global $pTimerProc2 = _DllCallBack ("_TimerProc", "hwnd;uint;uint;dword")
  11. Global $uiTimer2 = DllCall("user32.dll", "uint", "SetTimer", "hwnd", 0, "uint", 0, "int", 200, "ptr", $pTimerProc2)
  12. Global $pTimerProc3 = _DllCallBack ("_TimerProc", "hwnd;uint;uint;dword")
  13. Global $uiTimer3 = DllCall("user32.dll", "uint", "SetTimer", "hwnd", 0, "uint", 0, "int", 700, "ptr", $pTimerProc3)

  14. GuiSetState()
  15. While 1
  16. $msg = GuiGetMsg()
  17. Select
  18. Case $msg = $GUI_EVENT_CLOSE
  19. DllCall("user32.dll", "int", "KillTimer", "hwnd", 0, "uint", $uiTimer[0])
  20.    _DllCallBack_Free ($pTimerProc)
  21.    DllCall("user32.dll", "int", "KillTimer", "hwnd", 0, "uint", $uiTimer2[0])
  22.    _DllCallBack_Free ($pTimerProc2)
  23.    DllCall("user32.dll", "int", "KillTimer", "hwnd", 0, "uint", $uiTimer3[0])
  24.    _DllCallBack_Free ($pTimerProc3)
  25.    Exit
  26. Case Else
  27. ;;;
  28. EndSelect
  29. WEnd
  30. Exit

  31. Func _TimerProc($hWnd, $uiMsg, $idEvent, $dwTime)
  32. ;$idEvent能分辨是哪个Timer控件调用了这个函数
  33. ;$dwTime表示已开机的时间
  34. Switch $idEvent
  35. Case $uiTimer[0]
  36. GUICtrlSetData($Label_1,_Now ( ))
  37. Case $uiTimer2[0]
  38. GUICtrlSetData($Label_2,GUICtrlRead($Label_2)+1)
  39. Case $uiTimer3[0]
  40. GUICtrlSetData($Label_3,GUICtrlRead($Label_3)+1)
  41. EndSwitch
  42. EndFunc
复制代码
最后,你可以使用KillTimer函数中止一个Timer控件,其用法在上面的例子里已经阐明。
发表于 2008-5-11 14:34:17 | 显示全部楼层
值得学习, 多个Timer用起来爽/./
发表于 2008-5-11 22:06:33 | 显示全部楼层

我也仿TIMER

XxXxXxr捂着自己嘴巴,但还是想说Timer也可以这样实现!
while 1
sleep(当然是间隔时间了)
wend

怎么样!!是否也是实现了TIMER呢??当然,其他循环也是一样道理!!!
发表于 2008-8-11 11:32:30 | 显示全部楼层
"au3_callback_v6.5.zip "在哪里下载?
发表于 2008-12-18 05:25:39 | 显示全部楼层
原帖由 XxXxXx 于 2008-5-11 22:06 发表
XxXxXxr捂着自己嘴巴,但还是想说Timer也可以这样实现!
while 1
sleep(当然是间隔时间了)
wend

怎么样!!是否也是实现了TIMER呢??当然,其他循环也是一样道理!!!

这是当然,,但脚本大  要用的定时器多的时候,用这个就会冲突了,
发表于 2009-3-4 19:03:55 | 显示全部楼层
原帖由 XxXxXx 于 2008-5-11 22:06 发表
XxXxXxr捂着自己嘴巴,但还是想说Timer也可以这样实现!
while 1
sleep(当然是间隔时间了)
wend

怎么样!!是否也是实现了TIMER呢??当然,其他循环也是一样道理!!!

你用这个是可以,但是整个程序都暂停了。其它的代码要等这个
发表于 2009-5-22 15:49:54 | 显示全部楼层
那就开线程好了.
发表于 2009-5-27 12:56:11 | 显示全部楼层
比较复杂啊看起来
发表于 2011-2-12 15:13:17 | 显示全部楼层
感谢分享,谢谢~~~
发表于 2011-5-23 13:16:27 | 显示全部楼层
thanks!!!good example~~~~~~``
发表于 2011-10-24 15:19:47 | 显示全部楼层
MARK一下
以后学习用
谢谢楼主
发表于 2012-9-2 20:35:57 | 显示全部楼层
DllCallBack.au3 文件在哪里?
发表于 2012-9-2 20:36:21 | 显示全部楼层
我运行了 但是没有出来任何效果
发表于 2013-11-7 17:13:31 | 显示全部楼层
老贴子挖出来了,新手同问:au3_callback_v6.5.zip在哪 "DllCallBack.au3"没有.
发表于 2013-11-12 10:35:30 | 显示全部楼层
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2018-10-18 19:33 , Processed in 0.095571 second(s), 14 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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