通过一个父窗体的句柄,递归的枚举它的子窗体,我们可以最终找到需要的子窗体。

用法如下:

  nParentHandle: HWnd; 
nChildHandle: HWnd;

  nParentHandle := FindWindow(nil, 'Notepad'); 
if nParentHandle <> 0 then 
nChildHandle := FindChildWindow(nParentHandle, 'SomeChildEditsClassName');

------函数代码------

var 
hwndFindChildWindow : HWND;

function EnumWindowsForFindChildWindowProc(WHandle: HWND; lParam: LPARAM): BOOL; export; stdcall; 
const 
MAX_WINDOW_NAME_LEN = 80; 
var 
sTargetClassName: string; 
nHandle: HWnd; 
sCurrClassName: string; 
bResult: Boolean; 
begin 
if (hwndFindChildWindow <> 0) then 
exit; 
sTargetClassName := PChar(lParam); 
sCurrClassName := GetWindowClass(WHandle); 
bResult := CompareText(sCurrClassName, sTargetClassName) = 0; 
If (bResult) then 
hwndFindChildWindow := WHandle 
else 
FindChildWindow(WHandle, PChar(lParam)); 
end;

function FindChildWindow(hwndParent: HWnd; ClassName: PChar) : HWnd; 
begin 
try 
EnumChildWindows(hwndParent, @EnumWindowsForFindChildWindowProc, LongInt(PChar(ClassName))); 
Result := hwndFindChildWindow; 
except 
on Exception do 
Result := 0; 
end; 
end;

//返回当前获得焦点的窗体
function GetFocusedWindowFromParent(ParentWnd:HWnd):HWnd; 
var 
OtherThread, 
Buffer : DWord; 
idCurrThread: DWord; 
begin 
OtherThread := GetWindowThreadProcessID(ParentWnd, @Buffer); 
idCurrThread := GetCurrentThreadID; 
if AttachThreadInput(idCurrThread, OtherThread, true) then begin 
Result := GetFocus; 
AttachThreadInput(idCurrThread, OtherThread, false); 
end 
else 
Result:= GetFocus; 
end;

//获得当前获得焦点的子窗体,即使它是其他应用程序的窗体
function GetFocusedChildWindow: HWnd; 
begin 
Result := GetFocusedWindowFromParent(GetForegroundWindow); 
end;

//获得窗体的文本
function EIGetWinText(nHandle: Integer): string; 
var 
pcText: array[0..32768] of char; 
begin 
SendMessage(nHandle, WM_GETTEXT, 32768, LongInt(@pcText)); 
Result := pcText; 
end;

//设定窗体的文本
procedure EISetWinText(nHandle: Integer; const sNewText: string); 
begin 
SendMessage(nHandle, WM_SETTEXT, Length(sNewText), LongInt(PChar(Trim(sNewText)))); 
end;

//返回窗体的类名
function EIGetWindowClass(const nHandle: HWnd): string; 
var 
szClassName: array[0..255] of char; 
begin 
GetClassName(nHandle, szClassName, 255); 
Result := szClassName; 
end;

------函数代码------

Delphi 实现获取其他程序的子窗体的更多相关文章

  1. delphi有关获取其他程序的窗口及对窗口内控件的操作

    1.获取当前所有窗口 procedure TForm1.Button1Click(Sender: TObject);var szText: array[0..254] of char; hCurren ...

  2. delphi 7 mdi子窗体。。。无法更改以命令对象为源的记录集对象的 ActiveConnection 属性。

    问题是这样的 我做了一个小程序 把 adoconnection放到了主窗体  连接的是access数据库; 新建了一个子窗体继承自FBase  新建了一个pubulic方法 qrySearch 实现了 ...

  3. Delphi MDI程序 父窗体如何调用当前活动子窗体的函数/过程

    一个MDI文本文件编辑器打开了N个子窗体子窗体的.pas文件有一些public的过程和函数我想在父窗体调用当前活动的子窗体函数我用Self.ActiveChildForm无法调用直接frmEdit.x ...

  4. 主窗体里面打开子窗体&&打印饼图《Delphi 6数据库开发典型实例》--图表的绘制

    \Delphi 6数据库开发典型实例\图表的绘制 1.在主窗体里面打开子窗体:ShowForm(Tfrm_Print); procedure Tfrm_Main.ShowForm(AFormClass ...

  5. Delphi中实现MDI子窗体(转)

        Delphi中实现MDI子窗体 用MDI实现浏览子窗口,具有窗口管理功能,同屏观看多个网页的内容  ① 多文档窗体(MDI) MDI窗体是一种具有主子结构的窗体体系,微软的Word便是其中的一 ...

  6. Delphi MDI 子窗体的创建和销毁 [zhuan]

    1.如果要创建一个mdi child,先看是否有这个child 存在,如果有,则用它,如果没有再创建 //该函数判断MDI 子窗体是否存在,再进行创建和显示function isInclude(for ...

  7. C#如何在子窗体获取父窗体的实例

    在子窗体可以使用this.Owner来获取父窗体的实例

  8. Delphi编写的Android程序获取Root权限实现(2015.4.15更新,支持Android 4.4)

    借助谷歌,并经过本大侠施展坑.蒙.拐.骗.偷五大绝技,终于成功实现在Delphi下获取Root权限并将其扩展为一个完整功能更加完整的TQAndroidShell记录,在华为荣耀2(Android 4. ...

  9. C#WinForm窗体内Panel容器中嵌入子窗体、程序主窗体设计例子

    C#WinForm父级窗体内Panel容器中嵌入子窗体.程序主窗体设计例子 在项目开发中经常遇到父级窗体嵌入子窗体所以写了一个例子程序,顺便大概划分了下界面模块和配色,不足之处还望指点 主窗体窗体采用 ...

随机推荐

  1. Qt读取文件时中文乱码问题

    在默认情况下,Qt 以 Unicode 格式处理文本字符,因此,字符本身是不会有问题的.之所以出现乱码,原因在于 Qt 不知道将 Unicode 字符以何种方式显示出来.        文本文件含有简 ...

  2. MySQL(九)插入、更新和删除

    常用的SQL语句,除了select用于查询,还有insert.update.delete等. 一.insert insert:用来插入(或添加)行到数据库中,常见方式有以下几种: ①插入完整的行: ② ...

  3. 《大道至简》第一章j愚公移山ava伪代码

    <大道至简>第一章,将编程比作了愚公移山,完美的诠释了编程的整个过程.在两千年前的寓言中,愚公集项目组织者.团队经理.编程人员.技术分析师等众多角色于一身.首先是原始需求的产生:“惩山北之 ...

  4. 1-Android开发验证码(使用第三方Mob,注册)

    http://www.mob.com/ 注册以后 可以直接放在 可以下载到手机里面试一下了 后续就不截图了 补充: 自定义签名

  5. [01] Why Spring

    1.何为框架 简单来说,框架就是制定了一套规范或者规则(思想),让程序员在该规范或规则下进行工作.如上图修楼房,在有框架的情况下,修建工作才高效且有条不紊.楼层钢架规定了大楼的结构,工人按架构添砖放瓦 ...

  6. flask多app和栈的应用

    一.简介     flask的蓝图可以实现url的分发,当有多个app时也可以利用app进行url分发,这里介绍下使用方式和内部原理以及栈的应用. 二.多app使用 使用示例 from werkzeu ...

  7. 限流——spring-cloud-zuul-ratelimit

    先留个坑,慢慢补 git代码Demo:https://github.com/islowcity/spring-cloud-zuul-ratelimiter.git 有时间再写分析

  8. Error【0006】:could not create or update nagios.configtest

    1. 错误背景 在本系列博客<Nagios监控系统部署(源码).md>中(笔记内链:Nagios监控系统部署(源码).md,博客园地址:https://www.cnblogs.com/li ...

  9. 《坦克世界》1.0+:使用 CPU 优化的图形和物理丰富用户体验

    本文以<坦克世界>为例,介绍 Wargaming 使用 CPU 多核和 CPU 单指令多数据 (SIMD) 功能显著提升游戏沉浸式体验的创新方法.我们以英特尔® 线程构建模块(英特尔® T ...

  10. libc.so.6: version 'GLIBC_2.14' not found报错提示的解决方案

    线上一台服务器在执行leveldb程序的时候,报错:"libc.so.6: version `GLIBC_2.14' not found". 排查原因及解决方法如下: 1)产生原因 ...