有一个外部程序,表面上看就是一个普通的程序,但是用工具软件分析它的结构,却发现是个MDI程序,但是它的子窗体是直接显示在Client区域的,无法单独关闭,也不知道子窗体的标题。请问这样的程序,怎么获取子窗体的句柄呢?该子窗体中包含一个panel控件,我是想获取这个panel的句柄。还请朋友们多多赐教!
解决方案 »
- 问下delphi中的三层是怎么分的,可以用三层访问Integer上的数据吗?
- delphi用流读文本文件的问题
- 如何利用流将存放在INTERNET空间上的一个PDF文件读到内存中并将其在本地器上用PDF阅读器打开?
- 在vb中调用delphi DLL的一个问题
- 请问怎么把tif格式的图片转换成jpg或bmp或gif任一种?
- 怎么样在过程中间中止一个过程?(即满足一个条件就不运行下面的代码,有没有像C中的GOTO用法的语句?)
- QuickReport打印的一个问题
- 有什么办法可以在窗体显示出来后弹出警告提示?(说明窗体操作之用)
- 哪有Active Skin下载,解密的??
- 怎么在delphi里弄空件数组,就想vb里的,好几个空间有一个名字,用index区分。?????
- 现场60分高手求解,能不能按当前记录的某个条件让fastreport打印子报表?
- ZSwang老师请进
1,如果外部程序是用VC或者C++builder之类的软件所写的,那可以正常获取控件的句柄么?
2,如果外部程序用了加壳工具进行加壳,请问在未脱壳的情况下,可以正常通过句柄获取edit类的值么?谢谢!
然后不停的用wnd:=GetWindow(wnd,GW_HWNDNEXT);来得到所有子窗口
获得子窗口的控件句柄也简单,wnd:=GetWindow(wnd,GW_CHILD);注意第二个参数
得到一个子句柄之后,就可以继续用GW_HWNDNEXT很YD地得到其他子窗口上控件的句柄了
大部分加壳不影响句柄,只有1%不到的壳会影响吧!
function TForm1.GetHandle: integer;
var
hD : hwnd;
buffer: array[0..254] of char;
begin
FillChar(buffer,254,#0);
hd := FindWindow('Tform1',nil);
hd := FindWindowEx(hd,0,'MDIClient',nil);
Result := FindWindowEx(hd,0,'TForm2',nil);
end;
另附: WM_CopyDataprocedure TForm5.Button1Click(Sender: TObject);
var
cds: TCOPYDATASTRUCT;
s:string;
vHandle:THandle;
begin
vHandle:=FindWindow('TForm123',nil); //寻找MDI主窗体
vHandle:=FindWindowEx(vHandle,0,'MDIClient',nil);//寻找MDI容器区域
vHandle:=FindWindowEx(vHandle,0,'TForm2',nil);//寻找MDI子窗体
s:='消息测试';
cds.dwData := 1;
cds.cbData := Length(S) + 1;
cds.lpData := nil;
GetMem(cds.lpData, cds.cbData); //为传递的数据区分配内存
try
if cds.lpData <> nil then
begin
try
StrCopy(cds.lpData, PChar(S));
Windows.SendMessage(vHandle, WM_COPYDATA, 0, integer(@cds));
except
end;
end;
finally
if cds.lpData <> nil then
begin
FreeMem(cds.lpData); //释放资源end;
end;
end;
end;