線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:5149
推到 Plurk!
推到 Facebook!

关于EnumChildWindows传入多参数的问题

缺席
treachery
一般會員


發表:5
回覆:3
積分:1
註冊:2007-10-01

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-02-19 02:03:33 IP:222.82.xxx.xxx 訂閱

是这样的,我想用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 重新編輯於 2008-02-19 02:08:13, 註解 無‧
taishyang 重新編輯於 2008-02-19 09:49:44, 註解 無‧
treachery
一般會員


發表:5
回覆:3
積分:1
註冊:2007-10-01

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-02-19 11:10:41 IP:222.82.xxx.xxx 訂閱
已经解决了,相关代码如下:


[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 中调试通过
------
跳舞吧,如同没有任何人注视你一样;
唱歌吧,如同没有任何人聆听一样;
去爱吧,如同从来没有受过伤害一样;
工作吧,如同不需要金钱一样;
活着吧,如同今天是末日一样;
----艾佛烈德.德索萨
系統時間:2024-04-25 9:25:46
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!