找回密码
 加入
搜索
查看: 2518|回复: 4

初学者使用AU3对API调用和回调函数的学习的一些理解

[复制链接]
发表于 2013-6-16 19:04:56 | 显示全部楼层 |阅读模式
本帖最后由 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[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 原型

评分

参与人数 1金钱 +10 收起 理由
user3000 + 10

查看全部评分

发表于 2013-6-17 07:25:51 | 显示全部楼层
支持钻研精神!
发表于 2013-6-17 13:15:58 | 显示全部楼层
目前無法看懂
发表于 2013-6-19 20:20:13 | 显示全部楼层
很强大 看的似懂非懂  LZ到底是否完全正确 等待大大们确认
发表于 2013-6-20 07:52:49 | 显示全部楼层
学习了。。。。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-25 17:30 , Processed in 0.086542 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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