请教:Enumchildwindows取子窗口句柄的问题(50分)

  • 主题发起人 主题发起人 tysun
  • 开始时间 开始时间
T

tysun

Unregistered / Unconfirmed
GUEST, unregistred user!
enumchildwindows可以取到指定窗口下的子窗口ClassName及句柄,可是为什么在一些特殊的程序里:例如《太阁立志2》等,还有别的一些游戏里取不到子窗口的ClassName和句柄,
请问要怎么样才能在这些窗口下取到子窗口的句柄呢?
 
比如我想取出游戏中一个“开始”按钮的句柄,要怎么才能得到呢?
 
谁知道啊,提示一下,写几句关键语句,再不行,提示一下用哪个函数或什么技术能实现也成啊。
 
唉,游戏都是DirectX的,普通的句柄方法难啊,我也不会
 
哦,应该和DirectX有关系的,可是要怎么能实现呢?有过经验的高手请指点一二,要嫌银子少了,我再另开帖子给 [:)]
 
提前,有能力,有空暇的朋友请帮帮忙。
 
真的没人知道吗?恳请高手能指点
 
谁知道啊,提示一下,写几句关键语句,再不行,提示一下用哪个函数或什么技术能实现也成啊。
 
为什么没人回答呢?是不好说还是我的问题没有表达清除呢?还是嫌分少呢?
 
各位高手大侠,该出手时就出手 ^_^
 
提前一下,送到大侠您的面前
 
........................
 
再提,不信没高手
 
一大早上来,什么都没有,有点失望
 
看来dfw们都归心似箭,没心情回答问题了
 
各位高手有能力的帮帮忙,我不是实在无计可施也不会这样求人
 
// 先调用EnumChildWindows
{ find the exist game window }
HWndRuningApp := FindWindow(nil, PChar('VCD转换成为MPEG'));
if HWndRuningApp <> 0 then
begin
EnumChildWindows(HWndRuningApp, @CalBack, 0);
SetActiveWindow(HWndRuningApp);
btnFindMpeg.Enabled := True;
btnChoseSaveDir.Enabled := True;
btnVcd2Mpeg.Enabled := True;
end;
// 他会自动调用回到函数的,在此函数中判断你要调用的对象
function CalBack(aa: Hwnd;
bb: LPARAM): Boolean;
stdcall;
var
aClassName, ComponetName: array[0..255] of Char;
begin
Result:=True;
GetClassName(aa, aClassName, 255);
//依次得到子窗体所有控件类名
GetWindowText(aa, ComponetName, 255);
//依次得到子窗体所有控件标题
// ShowMessage(aClassName);
// '(&amp;S)保存MPEG文件'
// '(&amp;L)装入VCD文件'
// '(&amp;S)停止转换'
// '(&amp;B)开始转换'
with FrmMaindo
begin
if (StrComp(ComponetName, PChar('(&amp;B)开始转换')) = 0) and (aa <> 0) then
hwndBtnStart := aa;
if (StrComp(aClassName, PChar('TEdit')) = 0) and (aa <> 0) then
begin
Inc(p_nEditNum);
case p_nEditNum of
1: hwndEdtGetVcd := aa;
2: hwndEdtSaveMpeg := aa;
end;
end;
if (StrComp(aClassName, PChar('TProgressBar')) = 0) and (aa <> 0) then
hwndPrgrsbr := aa;
end;
end;

试试吧,不行再说,毕竟游戏和一般程序不太一样,按钮可能不是标准按钮,而只是整幅图片的一部分
 
qince:先祝你新年快乐 ^_^ 谢谢你了,前些日子回家过年了,一直走亲访友,没怎么上网了,今天公司上班,所以这么久才来,我这就去试试看
 
你还可以参考我的另一贴,解释了一下:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2427839
 
qince:我试过,还是不行,不过还是你说的对,游戏里没有标准按钮的概念的,所以我们这种方法是找不到想要的按钮的,可能需要DirectX方面的知识才可以吧,我也只是猜想了,下边是我以前用来找已知窗口下所有子窗口句柄的例子:
enumwindowsproc = function (hnd: THandle;param: pointer):Boolean;stdcall;
function GetTitle(hnd:THandle;param:Pointer):Boolean;stdcall;
var
text: PChar;
begin
GetMem(text,255);
SendMessage(hnd,WM_GETTEXT,255,integer(text));
Form1.ListBox2.Items.Add(IntToStr(hnd)+ ':' + StrPas(text));
Result := True;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
Hwd:integer;
ewproc: enumwindowsproc;
begin
ListBox2.Items.Clear;
ewproc:=gettitle;
Hwd:=StrToInt(Trim(Edit1.Text));
//Edit1中是已知的窗口句柄
enumchildwindows(Hwd,@ewproc,0);
end;
 
后退
顶部