关于EnumChildWindows传入多参数的问题 |
缺席
|
treachery
一般會員 發表:5 回覆:3 積分:1 註冊:2007-10-01 發送簡訊給我 |
是这样的,我想用EnumChildWindows函数来实现一个查找指定窗口内控件的方法,以代替FindWindowEx函数(为灵活起见),但是,为了确定一个控件需要两个参数:类名(ClassName)和标题名(WindowName),因此考虑用结构体的方式通过EnumChildWindows的参数传入回调函数,但是之间的转换弄得我一头雾水,EnumChildWindows的参数是LongInt型的,怎么在回调函数里转换回结构类型呢?请各位朋友们相助,在下先谢了。以下是相关代码: [code delphi] var hControl:HWND; //保存回调函数EnumChildWindowsPro返回结果的全局变量 //用来在参数中传递的结构体 type ControlInfor=Record ClassName:String; ControlName:String; end; typeControlInfor=^ControlInfor; function EnumChildWindowsPro(Handle:THandle;ConInfor:typeControlInfor):boolean;stdcall; //用EnumChildWindows调用的回调函数 var TheClassName:array[0..MAX_PATH] of char; ConText:array[0..254] of char; strClassName,strControlName:String; begin Result:=True; GetClassName(Handle,TheClassName,MAX_PATH); GetWindowText(Handle,ConText,MAX_PATH); strClassName:=String(TheClassName); //转换下以方便处理 strControlName:=String(ConText); if (UpperCase(strClassName)=UpperCase(ConInfor^.ClassName)) and (UpperCase(strControlName)=UpperCase(ConInfor^.ControlName)) then begin //找到符合条件的控件 hControl:=Handle; Result:=False; end; end; function FindControl(Parent:HWND;ClassName,ControlName:String):HWND; //用来方便调用EnumChildWindows函数来实现查找窗口句柄的功能 var tConInfor:typeControlInfor; begin tConInfor.ClassName:=ClassName; tConInfor.ControlName:=ControlName; EnumChildWindows(Parent,@EnumChildWindowsPro,LongInt(tConInfor)); //就是在这里传递结构体 Result:=hControl; end; [/code]
------
跳舞吧,如同没有任何人注视你一样; 唱歌吧,如同没有任何人聆听一样; 去爱吧,如同从来没有受过伤害一样; 工作吧,如同不需要金钱一样; 活着吧,如同今天是末日一样; ----艾佛烈德.德索萨 |
treachery
一般會員 發表:5 回覆:3 積分:1 註冊:2007-10-01 發送簡訊給我 |
已经解决了,相关代码如下:
[code delphi] var hControl:HWND; //EnumChildWindowsPro函数要返回的全局变量 type typeControlInfor=^ControlInfor; ControlInfor=packed Record ClassName:String; ControlName:String; end; function EnumChildWindowsPro(Handle:THandle;ConInfor:LPARAM):boolean;stdcall; var TheClassName:array[0..MAX_PATH] of char; ConText:array[0..MAX_PATH] of char strClassName,strControlName:String; tConInfor:typeControlInfor; begin Result:=True; tConInfor:=typeControlInfor(ConInfor); //转换参数 GetClassName(Handle,TheClassName,MAX_PATH); GetWindowText(Handle,ConText,MAX_PATH); strClassName:=String(TheClassName); strControlName:=String(ConText); if (pos(UpperCase(tConInfor^.ClassName),UpperCase(strClassName))<>0) and (pos(UpperCase(tConInfor^.ControlName),UpperCase(strControlName))<>0) then begin hControl:=Handle; Result:=False; end; end; function FindControl(Parent:HWND;ClassName,ControlName:String):HWND; //方便调用EnumChildWindows函数 var tConInfor:ControlInfor; begin tConInfor.ClassName:=ClassName; tConInfor.ControlName:=ControlName; EnumChildWindows(Parent,@EnumChildWindowsPro,LongInt(@tConInfor)); Result:=hControl; end; [/code] 以上代码在delphi 7 中调试通过
------
跳舞吧,如同没有任何人注视你一样; 唱歌吧,如同没有任何人聆听一样; 去爱吧,如同从来没有受过伤害一样; 工作吧,如同不需要金钱一样; 活着吧,如同今天是末日一样; ----艾佛烈德.德索萨 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |