; 知识点: 调用WINDOW API 之前 必须要知道 被调 WINDOWS API的原型
;
; 程序涉及 三个 API
; 1.计时器回调函数 Timerproc
; 2.计时器设置时间函数 SetTimer
; 3.关闭计时器函数 KillTimer
;
; 原型 1. VOID CALLBACK TimerProc(
; HWND hwnd,
; UINT uMsg,
; UINT_PTR idEvent,
; DWORD dwTime)
;
; 原型 2. UINT_PTR SetTimer(
; HWND hWnd,
; UINT_PTR nIDEvent,
; UINT uElapse,
; TIMERPROC lpTimerFunc)
;
; 原型 3. BOOL KillTimer(
; HWND hWnd,
; UINT_PTR uIDEvent )
;
; 在调用 WINDOWS API 时,像用 DLLCALL调用时候 需要留意所调用 API的返回值 和 参数类型
;
Opt("MustDeclareVars", 1)
Opt("GUIOnEventMode", 1)
Local $t2 = 0, $t3 = 1
Global Const $GUI_EVENT_CLOSE = -3
Local $gui = GUICreate("API内置计时器调用和回调实例", 280,150)
Local $label1 = GUICtrlCreateLabel("00:00:00:00", 10, 12, 120, 20)
Local $label2 = GUICtrlCreateLabel("0", 10, 52, 120, 20)
Local $label3 = GUICtrlCreateLabel("", 10, 92, 120, 20)
Local $button1 = GUICtrlCreateButton("关闭API计时器1", 150, 12, 120, 20)
Local $button2 = GUICtrlCreateButton("关闭API计时器2", 150, 52, 120, 20)
Local $button3 = GUICtrlCreateButton("关闭API计时器3", 150, 92, 120, 20)
Local $TimerDll = DllCallbackRegister("_TimerProc", "none", "hwnd;uint;uint;dword")
; DllCallbackRegister 这个自定义会调函数 类似于 API CLLBACK TimerProc() 这个回调函数,
; 因为先前不知道 CLLBACK TimerProc(),
;所以搞不懂,自定义函数这4个参数"hwnd;uint;uint;dword"的问题
; 为什么是4个,各有什么作用.....
; 因为AU3没有指针,所以就有了
; DllCallbackRegister 和 DllCallbackGetPtr 我的理解为模拟C语言的函数指针
Local $Timer1Dll = DllCall("user32.dll", "uint", "SetTimer", "hwnd",0, "uint",0, "uint",1000, "ptr",DllCallbackGetPtr($TimerDll)) ;调用 每隔 1秒
; 我的理解是 将 DllcallbackRegister 返回值所得到的 DLL 句柄 $TimerDll,使用 DllcallbakcGetPtr 函数转化成所谓的函数指针
Local $Timer2Dll = DllCall("user32.dll", "uint", "SetTimer", "hwnd",0, "uint",0, "uint",200, "ptr",DllCallbackGetPtr($TimerDll)) ;调用 每隔 200毫秒
Local $Timer3Dll = DllCall("user32.dll", "uint", "SetTimer", "hwnd",0, "uint",0, "uint",2000, "ptr",DllCallbackGetPtr($TimerDll)) ;调用 每隔 2秒
GUICtrlSetOnEvent($button1, "_Main")
GUICtrlSetOnEvent($button2, "_Main")
GUICtrlSetOnEvent($button3, "_Main")
GUISetOnEvent($GUI_EVENT_CLOSE, "_Main")
GUISetState(@SW_SHOW)
While 1
Sleep(100)
WEnd
Func _Main()
Switch @GUI_CtrlId
Case $GUI_EVENT_CLOSE
GUIDelete($gui)
DllCallbackFree($TimerDll) ; 关闭先前打开的回调函数
Exit
Case $button1 ; 参考原型 API BOOL KillTimer( HWND hWnd, UINT_PTR uIDEvent )
DllCall("user32.dll", "BOOL", "KillTimer", "hwnd",0, "uint",$Timer1Dll[0] )
Case $button2
DllCall("user32.dll", "BOOL", "KillTimer", "hwnd",0, "uint",$Timer2Dll[0] )
Case $button3
DllCall("user32.dll", "BOOL", "KillTimer", "hwnd",0, "uint",$Timer3Dll[0] )
EndSwitch
EndFunc
Func _TimerProc($hWnd, $uMsg, $idEvent, $dwTime)
Switch $idEvent
Case $Timer1Dll[0]
GUICtrlSetData($label1, @HOUR & ":" & @MIN & ":" & @SEC & ":" & @MSEC) ; 小时:分钟:秒:毫秒
Case $Timer2Dll[0]
$t2 += 1
GUICtrlSetData($label2, $t2) ; 自增 1
Case $Timer3Dll[0]
$t3 *= 2
GUICtrlSetData($label3, $t3) ; 自乘 2
EndSwitch
EndFunc
; Func _TimerProc($hWnd, $uMsg, $idEvent, $dwTime) 之前搞死了,
;为什么 $idEvent 会获得计时器ID的值获得?????
; 因为调用注册函数
;Func _TimerProc($hWnd, $uMsg, $idEvent, $dwTime) 原来是参考了
; VOID CALLBACK TimerProc( HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime) API 原型