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

用法如下:

  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. SpringMVC+Swagger详细整合

    一.新建maven工程导入正确的pom文件 还是那句话,包导入正确就成功了80%.剩下的20%慢慢攻克吧. <project xmlns="http://maven.apache.or ...

  2. vue自定义指令(Directive中的clickoutside.js)的理解

    阅读目录 vue自定义指令clickoutside.js的理解 回到顶部 vue自定义指令clickoutside.js的理解 vue自定义指令请看如下博客: vue自定义指令 一般在需要 DOM 操 ...

  3. docker运行tomcat

    1.下载tomcat docker pull tomcat 运行tomcat docker run -it -p 8888:8080 tomcat 查看tomcat内的文件 docker exec - ...

  4. node.js 基础二 开启服务器监听

    1.server.js 2.监听 一 server.js 二 监听 运行server.js后,浏览器打开:http://localhost:8888/ //====================== ...

  5. linux 服务器安全加固和内核参数调优 nf_conntrack

    0.内部设置跳板机,服务器只能通过跳板机登录1.禁止ROOT用户远程登录和登录端口 禁止ROOT用户远程登录 .打开 /etc/ssh/sshd_config PermitRootLogin no . ...

  6. (转)怎么实时查看mysql当前连接数

    1.查看当前所有连接的详细资料: ./mysqladmin -uadmin -p123456 -h127.0.0.1 processlist 2.只查看当前连接数(Threads就是连接数.): ./ ...

  7. Got fatal error 1236 from master when reading data from binary log: 'Client requested master to start replication from impossible position

    在source那边,执行: flush logs;show master status; 记下File, Position. 在target端,执行: CHANGE MASTER TO MASTER_ ...

  8. ASP.NET MVC学习笔记(二)笔记

    接下来我们一起了解ASP.NET MVC的最重要的核心技术,了解ASP.NET MVC的开发框架,生命周期,技术细节. 一.Routing与ASP.NET MVC生命周期 1.Routing——网址路 ...

  9. Multiple “order by” in LINQ(转载)

    问: I have two tables, movies and categories, and I get an ordered list by categoryID first and then ...

  10. mac brew update 报错

    环境为mac, 总共报了三种错误. 对应三种不同的解法. 1.   第一种如下, 提示 1.8 的版本找不到 $ brew update /usr/local/bin/brew: /usr/local ...