初学者使用AU3对API调用和回调函数的学习的一些理解
本帖最后由 tts780679 于 2013-6-16 19:23 编辑学了一个多月的AU3,很是喜欢.
首先说明我很初级,如果有理解的不对的,希望大家提醒下.
; 知识点:调用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 )
Case $button2
DllCall("user32.dll", "BOOL", "KillTimer", "hwnd",0, "uint",$Timer2Dll )
Case $button3
DllCall("user32.dll", "BOOL", "KillTimer", "hwnd",0, "uint",$Timer3Dll )
EndSwitch
EndFunc
Func _TimerProc($hWnd, $uMsg, $idEvent, $dwTime)
Switch $idEvent
Case $Timer1Dll
GUICtrlSetData($label1, @HOUR & ":" & @MIN & ":" & @SEC & ":" & @MSEC) ; 小时:分钟:秒:毫秒
Case $Timer2Dll
$t2 += 1
GUICtrlSetData($label2, $t2) ; 自增 1
Case $Timer3Dll
$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 原型
支持钻研精神! 目前無法看懂 很强大 看的似懂非懂LZ到底是否完全正确 等待大大们确认 学习了。。。。
页:
[1]