回调函数参数传递
回调函数写出来不是⾃⼰的程序去调⽤的,反⽽是让其他的东西去调⽤,⽐如windows操作系统,⽐如其他的程序等等之类的。但是什么时候被调⽤却不知道了。回调函数⼀般是按照调⽤者的要求定义好参数和返回值的类型,你向调⽤者提供你的回调函数的⼊⼝地址,然后调⽤者有什么事件发⽣的时候就可以随时按照你提供的地址调⽤这个函数通知你,并按照预先规定好的形式传递参数。所以很多⼈打⽐⽅,说回调函数还真有点像您随⾝带的BP机:告诉别⼈号码,在它有事情时Call您!
所以⼀个回调函数写出来之后,⼀定有个注册的动作,就是告诉调⽤者,你怎么样到我写的函数。某些Windows API 函数会要求以回调函数地址作为其参数之⼀,例如SetTimer 、LineDDA 、EnumObjects,以及我们下⾯要⽤到的EnumWindows。
在Delphi⾥声明⼀个回调函数的格式很简单,例如:
functionEnumWindowsProc(AhWnd:LongInt;lParam:LongInt):boolean;stdcall;
⾸先是函数名称可以随便乱取,但函数参数的类型⼀般不得乱来,其顺序,数据类型等都有规定的,因为这些都是让其他程序调⽤的,他们已经规定好了的,但参数名称可以随便乱叫。注意后⾯⼀定要带上“stdcall”,
stdcall是标准调⽤,也就是说采⽤标准windows参数传递⽅式来调⽤函数。
编写函数体就很简单了,利⽤传递过来的参数就可以了,只要记住,这些参数是别⼈送给你的,你只要知道这些参数代表了什么意思。
再看个向调⽤者注册回调函数⼊⼝地址的函数。
function EnumWindows(lpEnumFunc: TFNWndEnumProc;lParam: LPARAM): BOOL; stdcall;
TFNWndEnumProc其实就是指针类型。其中的lpEnumFunc就是回调函数的⼊⼝地址了。
下⾯是调⽤EnumWindows的格式:
EnumWindows(@EnumWindowsProc,0);
通过向系统注册回调函数的⼊⼝地址,系统就能在需要的时候,调⽤回调函数,传递参数给它,也许这些参数就是我们想要的。
EnumWindows函数的功能是:枚举屏幕上所有程序中的顶层窗⼝,将窗⼝句柄以参数的形式传递给回调函数。到⼀个窗⼝,就调⽤⼀次回调函数。枚举结束的条件是:要么枚举完所有的窗⼝,要么回调函数返回False。
lParam: LPARAM参数是程序定义的值,这个值被传递到回调函数。
回过头来再看⼀下EnumWindowsProc:
functionEnumWindowsProc(AhWnd:LongInt;lParam:LongInt):boolean;stdcall;
当系统到了⼀个窗⼝后,就开始调⽤这个回调函数,将窗⼝的句柄作为第⼀个参数传递过来,将在EnumWindows中lParam: LPARAM这个程序定义的值作为第⼆个参数传递过来。
enum函数所以我们可以在EnumWindowsProc函数中利⽤传递过来的两个参数来做某些处理了。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论