tts780679 发表于 2013-6-16 19:04:56

初学者使用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 原型

user3000 发表于 2013-6-17 07:25:51

支持钻研精神!

txen548 发表于 2013-6-17 13:15:58

目前無法看懂

fangbaiyu 发表于 2013-6-19 20:20:13

很强大 看的似懂非懂LZ到底是否完全正确 等待大大们确认

zhaoyun 发表于 2013-6-20 07:52:49

学习了。。。。
页: [1]
查看完整版本: 初学者使用AU3对API调用和回调函数的学习的一些理解